Docker架构

Docker包括三个基本概念:

镜像(image):docker镜像就相当于一个root文件系统。比如:官方镜像ubuntu16.04就包含了完整的一套ubuntu16.04最小系统的root文件系统。

容器(container):镜像和容器的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行的实体。容器可以被创建、启动、停止、删除、暂停等。

仓库(Repository):仓库可以看成一个代码控制中心,用来保存镜像。

docker使用客户端-服务端(C/S)架构模式,使用远程API来管理和创建Docker容器。

docker容器通过docker镜像来创建。

Docker安装

在ubuntu下按照docker软件

官方安装脚本自动安装:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
curl -sSL https://get.daocloud.io/docker | sh

国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。

Docker使用

docker hello world

runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"
Hello world

docker:Docker的二进制执行文件

run:与前面的docker组合来运行一个容器

ubuntu:15.10 指定要运行的镜像,docker首先从本地主机上查找镜像是否存在,不存在,docker就会从镜像仓库docker hub下载公共镜像。

/bin/echo “hello world”:在启动的容器里执行的命令

Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。

运行交互式的容器

runoob@runoob:~$ docker run -i -t ubuntu:15.10 /bin/bash
root@0123ce188bd8:/#

-t:在新容器内指定一个伪终端或终端。

-i:允许你对容器内的标准输入进行交互。

exit或者ctrl+d 退出容器

启动容器(后台模式)

-d:后台运行模式 docker run -d

runoob@runoob:~$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63  #容器id  唯一的

查看是否有容器运行:docker ps

runoob@runoob:~$ docker ps  # 查看容器运行
CONTAINER ID        IMAGE                  COMMAND              ...
5917eac21c36        ubuntu:15.10           "/bin/sh -c 'while t…"    ...

STATUS: 容器状态。

状态有7种:

  • created(已创建)
  • restarting(重启中)
  • running 或 Up(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

PORTS: 容器的端口信息和使用的连接类型(tcp\udp)

NAMES: 自动分配的容器名称。

查看容器内的标准输出 docker logs

runoob@runoob:~$ docker logs 2b1b7a428627  # 容器id  12个字节
runoob@runoob:~$ docker logs amazing_cori  # 容器名称

停止容器 docker stop

runoob@runoob:~$ docker stop 2b1b7a428627  # 容器id  12个字节
runoob@runoob:~$ docker stop amazing_cori  # 容器名称

Docker容器使用

获取镜像:docker pull ubuntu

启动容器:docker run -it ubuntu /bin/bash

退出容器终端:exit

启动已停止运行的容器: docker ps -a

​ docker start b750bbbcfd88 (容器的id)

后台运行: -d指定运行模式,参数默认不会进入容器

​ docker run -itd --name ubuntu-test ubuntu /bin/bash

停止的容器启动: docker start 《id、名字》

停止一个容器: docker stop <容器 ID>

正在运行的容器重启: docker restart <容器 ID>

进入容器: docker attach(不推荐使用,用了exit,退出容器会停止容器)

​ docker exec (推荐使用,退出容器终端不会导致容器停止)

导出容器: docker export 容器 ID > xxx.tar

​ docker export 1e560fca3906 > ubuntu.tar

导入容器: docker import 从容器快照文件中再导入为镜像

​ docker/ubuntu.tar | docker import - test/ubuntu:v1 #v1是版本号

​ docker import http://example.com/exampleimage.tgz example/imagerepo #通过指定 URL 或者某个目录来导入

删除容器: docker rm -f 1e560fca3906

​ docker container prune # 清理所有处于终止状态的容器

运行一个web应用:

runoob@runoob:~# docker pull training/webapp  # 载入镜像
runoob@runoob:~# docker run -d -P training/webapp python app.py

-d: 后台运行 -P:将容器内部使用的网络端口随机映射到我们使用的主机上

runoob@runoob:~#  docker ps
CONTAINER ID        IMAGE               COMMAND             ...        PORTS
d3d5e39ed9d3        training/webapp     "python app.py"     ...        0.0.0.0:32769->5000/tcp

docker容器开了5000端口,映射到主机端口的32769上

通过 -p参数设置不一样的端口(5000:5000)

runoob@runoob:~$ docker run -d -p 5000:5000 training/webapp python app.py

容器内部的 5000 端口映射到我们本地主机的 5000 端口上

runoob@runoob:~#  docker ps
CONTAINER ID        IMAGE                             PORTS                     NAMES
bf08b7f2cd89        training/webapp     ...        0.0.0.0:5000->5000/tcp    wizardly_chandrasekhar
d3d5e39ed9d3        training/webapp     ...        0.0.0.0:32769->5000/tcp   xenodochial_hoov

快捷查看网络端口: docker port bf08b7f2cd89

​ docker port wizardly_chandrasekhar

查看容器内部标准输出: docker logs -f bf08b7f2cd89

查看容器内部运行的进程: docker top wizardly_chandrasekhar

查看docker的底层信息: docker inspect wizardly_chandrasekhar #记录着 Docker 容器的配置和状态信息

移除一个容器: docker rm (id\name) #容器必须是处于停止状态下

ps:解决docker权限问题,选择方法2。

方法1: 使用sudo获取管理员权限,运行docker命令

方法2: 创建docker用户组,并将当前用户加入到docker用户组中,那么当前用户就有权限访问Unix socket

sudo groupadd docker     #添加docker用户组
sudo gpasswd -a $USER docker     #将登陆用户加入到docker用户组中
newgrp docker     #更新用户组
docker ps    #测试docker命令是否可以使用sudo正常使用

Docker镜像使用

管理和使用本地docker主机的镜像

列出镜像列表:docker images

如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。

获取新镜像: docker pull ubuntu:13.10

查找镜像: docker search httpd ( https://hub.docker.com/ 网站查找)

删除镜像: docker rmi hello-world

https://www.runoob.com/docker/docker-image-usage.html

创建镜像

  • 1、从已经创建的容器中更新镜像,并且提交这个镜像

    (可以在一个容器里安装好,提交容器到镜像,在以新的镜像重新运行以上俩个容器)

  • 2、使用 Dockerfile 指令来创建一个新的镜像

创建dockerfile文件,包含一组指令告诉docker如何构建我们的镜像

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。

第一条FROM,指定使用哪个镜像源

RUN 指令告诉docker 在镜像内执行命令,安装了什么

runoob@runoob:~$ cat Dockerfile
FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

RUN 指令告诉docker 在镜像内执行命令,安装了什么

runoob@runoob:~$ docker build -t runoob/centos:6.7 .
  • -t :指定要创建的目标镜像名
  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

(所有者、所属组和其他人)

设置镜像标签

docker tag添加一个新的标签

runoob@runoob:~$ docker tag 860c279d2fec runoob/centos:dev

容器连接

#  默认是tcp
runoob@runoob:~$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c
#  指定是udp端口
runoob@runoob:~$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a
runoob@runoob:~$ docker ps
CONTAINER ID        IMAGE               COMMAND           ...   PORTS                                NAMES
6779686f06f6        training/webapp     "python app.py"   ...   5000/tcp, 127.0.0.1:5000->5000/udp   drunk_visvesvaraya
95c6ceef88ca        training/webapp     "python app.py"   ...    5000/tcp, 127.0.0.1:5001->5000/tcp   adoring_stonebraker
33e4523d30aa        training/webapp     "python app.py"   ...     0.0.0.0:5000->5000/tcp               berserk_bartik
fce072cc88ce        training/webapp     "python app.py"   ...    0.0.0.0:32768->5000/tcp              grave_hopper

查看绑定情况

runoob@runoob:~$ docker port adoring_stonebraker 5000
127.0.0.1:5001

容器命名: 使用 –name 标识来命名容器

runoob@runoob:~$  docker run -d -P --name runoob training/webapp python app.py
43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441

新建网络

创建新docker网络

$ docker network create -d bridge test-net

docker network ls ---------查看docker网络

-d:参数指定 Docker 网络类型,有 bridge、overlay。

其中 overlay 网络类型用于 Swarm mode,在本小节中你可以忽略它。

运行一个容器并连接到新建的 test-net 网络:

$ docker run -itd --name test1 --network test-net ubuntu /bin/bash
$ docker run -itd --name test2 --network test-net ubuntu /bin/bash

运行了两个容器,test1和test2.

下面通过 ping 来证明 test1 容器和 test2 容器建立了互联关系。

$ ping test1
$ ping test2

DNS:域名系统

仓库管理

仓库(Repository)是集中存放镜像的地方。

在 https://hub.docker.com 免费注册一个 Docker 账号。

登录需要输入用户名和密码,登录成功后,我们就可以从 docker hub 上拉取自己账号下的全部镜像。

$ docker login
$ docker logout

用户登录后,可以通过 docker push 命令将自己的镜像推送到 Docker Hub。

以下命令中的 username 请替换为你的 Docker 账号用户名。

$ docker tag ubuntu:18.04 username/ubuntu:18.04
$ docker image lsREPOSITORY      TAG        IMAGE ID            CREATED           ...
ubuntu          18.04      275d79972a86        6 days ago        ...
username/ubuntu 18.04      275d79972a86        6 days ago        ...
$ docker push username/ubuntu:18.04
$ docker search username/ubuntuNAME             DESCRIPTION       STARS         OFFICIAL    AUTOMATED
username/ubuntu

DockerFile

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

RUN:用于执行后面跟着的命令行命令。有以下俩种格式:

shell 格式:

RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。

exec 格式:

RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

FROM centos

RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz

以上执行会创建 3 层镜像。可简化为以下格式:

FROM centos
RUN yum -y install wget \&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \&& tar -xvf redis.tar.gz

指令详解

copy

从上下文目录中复制文件或者目录到容器里指定路径。

COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]

[–chown=:]:可选参数,用户改变复制到容器内文件的拥有者和属组。

<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:

COPY hom* /mydir/
COPY hom?.txt /mydir/

<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

ADD

ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY

  • ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
  • ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

CMD

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

  • CMD 在docker run 时运行。
  • RUN 是在 docker build。
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
  • FROM- 镜像从那里来

  • MAINTAINER- 镜像维护者信息

  • RUN- 构建镜像执行的命令,每一次RUN都会构建一层

  • CMD- 容器启动的命令,如果有多个则以最后一个为准,也可以为ENTRYPOINT提供参数

  • VOLUME- 定义数据卷,如果没有定义则使用默认

  • USER- 指定后续执行的用户组和用户

  • WORKDIR- 切换当前执行的工作目录

  • HEALTHCHECH- 健康检测指令

  • ARG- 变量属性值,但不在容器内部起作用

  • EXPOSE- 暴露端口

  • ENV- 变量属性值,容器内部也会起作用

  • ADD- 添加文件,如果是压缩文件也解压

  • COPY- 添加文件,以复制的形式

  • ENTRYPOINT- 容器进入时执行的命令

Docker学习笔记-概念和常见命令相关推荐

  1. anaconda中安装xgboost_ML学习笔记之Anaconda中命令形式安装XGBoost(pip install)

    0x00 概述 在没有安装XGBoost之前,import xgboot会出错,如下: # ModuleNotFoundError: No module named 'xgboost' 0x01 安装 ...

  2. Docker:学习笔记(1)——基础概念

    Docker:学习笔记(1)--基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...

  3. docker学习笔记(二)docker常用命令

    参考:汤小洋老师的教学视频 docker学习笔记(一)[docker 介绍.卸载.安装.配置加速] docker学习笔记(三)镜像 docker学习笔记(四)使用docker搭建环境 docker学习 ...

  4. 狂神 Docker学习笔记 从基础到进阶 一步到位

    Docker 学习笔记 感谢狂神的分享.附上B站视频链接. https://www.bilibili.com/video/BV1og4y1q7M4?from=search&seid=92256 ...

  5. 开源的容器虚拟化平台Docker学习笔记,个人私藏分享,不谢!

    一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...

  6. Docker 学习笔记 - 进阶四 Docker网络和 Docker compose

    Docker 学习笔记 - 进阶四 Docker网络和 Docker compose 4. docker 网络 4.1 docker network是什么 4.1.1 docker不启动,默认网络情况 ...

  7. Docker学习笔记01

    Docker学习笔记01 Docker学习 Docker的概述 Docker的安装 Docker的命令 镜像命令 容器命令 操作命令 ... Docker镜像 容器数据卷 DockerFile Doc ...

  8. Docker学习笔记总结

    pdf版本笔记的下载地址: Docker学习笔记01(访问密码:3834) Docker学习笔记总结 Docker的安装 Docker的基本组成 Docker的安装 演示系统环境 安装步骤 配置阿里云 ...

  9. 【长篇博文】Docker学习笔记与深度学习环境的搭建和部署(二)

    长篇博文记录学习流程不容易,请关注.转发.点赞.评论,谢谢! 上一篇文章:Docker学习笔记与深度学习环境的搭建和部署(一) 文章末尾附加nvidia455.23.cuda11.1.cudnn8.0 ...

最新文章

  1. 浅议数据中心规划设计阶段暖通系统节能措施
  2. 二值mask图像 + RGB原图 生成可视化分割结果; 从二值mask获取分割轮廓点
  3. java 数组 参数 ppt,Java自学课件-数组.ppt
  4. NOI.AC#2007-light【根号分治】
  5. “一休数学思维”改名“海豚思维”,并完成数千万元Pre-A轮融资
  6. HTML-CSS线性渐变
  7. Flume1.6.0之Error-protobuf-This is supposed to be overridden by subclasses
  8. 剑指Offer28.对称的二叉树
  9. 华为路由器虚拟服务器怎么设置方法,华为路由器PPPoE配置案例-华为路由器设置...
  10. Juniper SRX密码恢复
  11. 磁盘清理 磁盘分析 磁盘空间 磁盘大小 可视化【软件】
  12. Ubuntu 16.04 安装并创建快捷图标 XMind
  13. 《庄子·杂篇·庚桑楚第二十三》
  14. 《计算广告》学习笔记(二)
  15. 手指静脉图像分类识别
  16. Javalin:一个轻量的 Web Framework
  17. iptables防火墙和firewalld防火墙
  18. IAAS基于开源openstack框架搭建云计算平台和各组件基础搭建内容包括mysql、keyston、Glance、Nova、Neutron、Dashboard、Heat、Trove等
  19. 《计算机网络自顶向下》Wireshark实验 Lab11 802.11 WiFi
  20. ruby 中的respond_to (转)

热门文章

  1. 进行移动_德勤预测2019年初中国有6亿人使用手机进行移动支付
  2. Python爬虫笔记之用BeautifulSoup及requests库爬取
  3. 大型游戏服务器架构该怎么设计?
  4. .html是什么方法,关于html:HTTP方法的默认形式是什么?
  5. [转]思科与华为之战:数据通信市场面临裂变
  6. 同步和串行的区别_谈谈SPI (Serial Peripheral Interface,串行外设接口)
  7. 晶振,机器频率和脉冲(时钟周期)
  8. 一体机联想键盘如何关闭Fn功能键恢复F1~F12
  9. 苹果6换屏多钱_iPhone 12系列官方换屏要多少钱?苹果给出答案
  10. 投票|微信投票如何刷投票数的方法和步骤【禁止非法使用】