Skip to content
KARINKARIN
博客主页
项目总览
知识要点
捣鼓折腾
Git笔记
Excel修炼秘籍
github icon
  • 博客主页
    • 项目总览
        • 虚拟化的发展
          • 初识 Docker 与容器
            • 核心概念与安装配置
              • 使用 Docker 镜像
                • 操作 Docker 容器
                  • 创建容器
                    • 1、新建容器
                      • 2、启动容器
                        • 3、新建井启动容器
                          • 4、守护态运行
                            • 5、查看容器输出
                            • 停止容器
                              • 1、暂停容器
                                • 2、终止容器
                                • 进人容器
                                  • 1、attach 命令
                                    • 2、exec 命令
                                    • 删除容器
                                      • 导人和导出容器
                                        • 1、导出容器
                                          • 2、导入容器
                                          • 查看容器
                                            • 1、查看容器详情
                                              • 2、查看容器内进程
                                                • 3、查看统计信息
                                                • 其他容器命令
                                                  • 1、复制文件
                                                    • 2、查看变更
                                                      • 3、查看端口映射
                                                        • 4、更新配置
                                                        • 小结
                                                        • 访问 Docker 仓库
                                                          • Docker 数据管理
                                                            • 端口映射与容器互联
                                                              • 使用 Dockerfile 创建镜像

                                                              操作 Docker 容器

                                                              author iconkarincalendar icon2021年8月23日category icon
                                                              • 笔记
                                                              tag icon
                                                              • docker
                                                              timer icon大约 22 分钟

                                                              此页内容
                                                              • 创建容器
                                                                • 1、新建容器
                                                                • 2、启动容器
                                                                • 3、新建井启动容器
                                                                • 4、守护态运行
                                                                • 5、查看容器输出
                                                              • 停止容器
                                                                • 1、暂停容器
                                                                • 2、终止容器
                                                              • 进人容器
                                                                • 1、attach 命令
                                                                • 2、exec 命令
                                                              • 删除容器
                                                              • 导人和导出容器
                                                                • 1、导出容器
                                                                • 2、导入容器
                                                              • 查看容器
                                                                • 1、查看容器详情
                                                                • 2、查看容器内进程
                                                                • 3、查看统计信息
                                                              • 其他容器命令
                                                                • 1、复制文件
                                                                • 2、查看变更
                                                                • 3、查看端口映射
                                                                • 4、更新配置
                                                              • 小结

                                                              容器是 Docker 的另 一个核心概念。简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。

                                                              如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行态环境和其他系统环境)和跑在上面的应用。那么 Docker 容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。

                                                              接下来将具体介绍围绕容器的重要操作,包括创建一个容器、启动容器、终止一个容器、进入容器内执行操作、删除容器和通过导人导出容器来实现容器迁移等。

                                                              # 创建容器

                                                              从现在开始,忘掉“朦肿”的虚拟机吧,对容器的操作就像直接操作应用一样简单和快速。

                                                              这里主要介绍 Docker 容器的 create、start、run、wait 和 logs 子命令。

                                                              # 1、新建容器

                                                              可以使用 docker [container] create 命令新建一个容器,例如:

                                                              $ docker container create -it ubuntu:latest
                                                              Unable to find image 'ubuntu:latest' locally
                                                              latest: Pulling from library/ubuntu
                                                              35807b77a593: Pull complete 
                                                              Digest: sha256:9d6a8699fb5c9c39cf08a0871bd6219f0400981c570894cd8cbea30d3424a31f
                                                              Status: Downloaded newer image for ubuntu:latest
                                                              fcc4e0885754efa016594c98d606dd5666ad751c76884c41685d46715a9a70fc
                                                              
                                                              $ docker ps -a
                                                              CONTAINER ID   IMAGE           COMMAND   CREATED              STATUS                    PORTS     NAMES
                                                              fcc4e0885754   ubuntu:latest   "bash"    About a minute ago   Created                             gracious_ellis
                                                              dba94731dbca   centos          "bash"    23 hours ago         Exited (0) 23 hours ago             romantic_benz
                                                              
                                                              1
                                                              2
                                                              3
                                                              4
                                                              5
                                                              6
                                                              7
                                                              8
                                                              9
                                                              10
                                                              11
                                                              12

                                                              使用 docker [container] create 命令新建的容器处于停止状态,可以使用 docker [container] start 命令来启动它。

                                                              由于容器是整个 Docker 技术栈的核心,create 命令和后续的 run 命令支持的选项都十分复杂,需要你在实践中不断体会。

                                                              选项主要包括如下几大类:与容器运行模式相关、与容器环境配置相关、与容器资源限制和安全保护相关,参见表 4-1 和表 4-3。

                                                              表4-1 create 命令与容器运行模式相关的选项

                                                              选项说明
                                                              -a,--attach=[ ]是否绑定到标准输入、输出和错误
                                                              -d,--detach=true|false是否在后台运行容器,默认为否
                                                              --detach-keys=" "从 attach 模式退出的快捷键
                                                              --entrypoint=" "镜像存在入口命令时,覆盖为新的命令
                                                              --expose=[ ]指定容器会暴露出来的端口或端口范围
                                                              --group-add=[ ]运行容器的用户组
                                                              -i,--interactive=true|false保持标准输入打开,默认为 false
                                                              --ipc=" "容器 IPC 命名空间,可以为其他容器或主机
                                                              --isolation="default"容器使用的隔离机制
                                                              --log-driver="json-file"指定容器的日志驱动类型,可以为 json-file、syslog、journald、gelf、fluentd、awslogs、splunk、etwlogs、gcplogs或none
                                                              --log-opt=[ ]传递给日志驱动的选项
                                                              --net="bridge"指定容器网络模式,包括 bridge、none、其他容器内网络、host 的网络或某个现有网络等
                                                              --net-alias=[ ]容器在网络中的别名
                                                              -P,--publish-all=true|false通过 NAT 机制将容器标记暴露的端口自动映射到本地主机的临时端口
                                                              -p,--publishs=[ ]指定如何映射到本地主机端口,例如 -p 11234-12234:1234-2234
                                                              --pid=host容器的 PID 命名空间
                                                              --userns=" "启用 userns-remap 时配置用户命名空间的模式
                                                              --uts=host容器的 UTS 命名空间
                                                              --restart="no"容器的重启策略,包括 no、on-failure[:max-retry]、always、unless-stopped 等
                                                              -rm=true|false容器退出后是否自动删除,不能跟 -d 同时使用
                                                              -t,--tty=true|false是否分配一个伪终端,默认为 false
                                                              --tmpfs=[ ]挂载临时文件系统到容器
                                                              -v|--volume[=[[HOST-DIR:]CONTAINER-DIR [:OPTIONS]]]挂载主机上的文件卷到容器内
                                                              --volume-driver=" "挂载文件卷的驱动类型
                                                              --volumes-from=[ ]从其他容器挂载卷
                                                              -w,--workdir=" "容器内的默认工作目录

                                                              表 4-2 create 命令与容器环境和配置相关的选项

                                                              选项说明
                                                              --add-host=[ ]在容器内添加一个主机名到 IP 地址的映射关系(通过 /etc/hosts 文件)
                                                              --device=[ ]映射物理机上的设备到容器内
                                                              --dns-search=[ ]DNS 搜索域
                                                              --dns-opt=[ ]自定义的 DNS 选项
                                                              --dns=[ ]自定义的 DNS 服务器
                                                              -e,--env=[ ]指定容器内环境变量
                                                              --env-file=[ ]从文件中读取环境变量到容器内
                                                              -h,--hostname=" "指定容器内的主机名
                                                              --ip=" "指定容器的 IPv4 地址
                                                              --ip6=" "指定容器的 IPv6 地址
                                                              --link=[<name or id>:alias]链接到其他容器
                                                              --link-local-ip=[ ]:容器的本地链接地址列表
                                                              --mac-address=" "指定容器的 Mac 地址
                                                              --name=" "指定容器的别名

                                                              表 4-3 create 命令与容器资源限制和安全保护相关的选项

                                                              选项说明
                                                              --blkio-weight=10~1000容器读写块设备的 I/O 性能权重,默认为 0
                                                              --blkio-weight-device=[DEVICE_NAME:WEIGHT]指定各个块设备的 I/O 性能权重
                                                              --cpu-shares=0允许容器使用 CPU 资源的相对权重,默认一个容器能用满一个核的 CPU
                                                              --cap-add=[ ]增加容器的 Linux 指定安全能力
                                                              --cap-drop=[ ]移除容器的 Linux 指定安全能力
                                                              --cgroup-parent=" "容器 cgroups 限制的创建路径
                                                              --cidfile=" "指定容器的进程 ID 号写到文件
                                                              --cpu-period=0限制容器在 CFS 调度器下的 CPU 占用时间片
                                                              --cpuset-cpus=" "限制容器能使用哪些 CPU 核心
                                                              --cpuset-mems=" "NUMA 架构下使用哪些核心的内存
                                                              --cpu-quota=0限制容器在 CFS 调度器下的 CPU 配额
                                                              --device-read-bps=[ ]挂载设备的读吞吐率(以 bps 为单位)限制
                                                              --device-write-bps=[ ]挂载设备的写吞吐率(以 bps 为单位)限制
                                                              --device-read-iops=[ ]挂载设备的读速率(以每秒 i/o 次数为单位)限制
                                                              --device-write-iops=[ ]挂载设备的写速率(以每秒 i/o 次数为单位)限制
                                                              --health-cmd=" "指定检查容器健康状态的命令
                                                              --health-interval=0s执行健康检查的间隔时间,单位可以为 ms、s、m 或 h
                                                              --health-retries=int健康检查失败重试次数,超过则认为不健康
                                                              --health-start-period=0s容器启动后进行健康检查的等待时间,单位可以为 ms、s、m 或 h
                                                              --health-timeout=0s健康检查的执行超时,单位可以为 ms、s、m 或 h
                                                              --no-healthcheck=true|false是否禁用健康检查
                                                              --init在容器中执行一个 init 进程,来负责响应信号和处理僵尸状态子进程
                                                              --kernel-memory=" "限制容器使用内核的内存大小,单位可以是 b、k、m 或 g
                                                              -m,--memory=" "限制容器内应用使用的内存,单位可以是 b、k、m 或 g
                                                              --memory-reservation=" "当系统中内存过低时,容器会被强制限制内存到给定值,默认情况下等于内存限制值
                                                              --memory-swap="LIMIT"限制容器使用内存和交换区的总大小
                                                              --oom-kill-disable=true|false内存耗尽时是否杀死容器
                                                              --oom-score-adj=" "调整容器的内存耗尽参数
                                                              --pids-limit=" "限制容器的 pid 个数
                                                              --privileged=true|false是否给容器高权限,这意味着容器内应用将不受权限的限制,一般不推荐
                                                              --read-only=true|false是否让容器内的文件系统只读
                                                              --security-opt=[ ]指定一些安全参数,包括权限、安全能力、apparmor 等
                                                              --stop-signal=SIGTERM指定停止容器的系统信号
                                                              --gshm-size=" "/dev/shm的大小
                                                              --gsig-proxy=true|false是否代理收到的信号给应用,默认为 true,不能代理 SIGCHLD、SIGSTOP 和 SIGKILL 信号
                                                              --memory-swappiness="0~100"调整容器的内存交换区参数
                                                              -u,--user=" "指定在容器内执行命令的用户信息
                                                              --userns=" "指定用户命名空间
                                                              --ulimit=[ ]通过 ulimit 来限制最大文件数、最大进程数等

                                                              其他选项还包括:

                                                              • -l,--label=[ ]:以键值对方式指定容器的标签信息;
                                                              • --label-file=[ ]:从文件中读取标签信息。

                                                              # 2、启动容器

                                                              使用 docker [container] start 命令来启动一个已经创建的容器。例如,启动刚创建的 ubuntu 容器:

                                                              $ docker start fcc
                                                              fcc
                                                              # 启动ID为fcc开头的容器(开头为 fcc 的 ID ,确保可以确定是哪一个容器)
                                                              
                                                              1
                                                              2
                                                              3

                                                              此时,通过 docker ps 命令,可以查看到一个运行中的容器:

                                                              $ docker ps 
                                                              CONTAINER ID   IMAGE           COMMAND   CREATED       STATUS              PORTS     NAMES
                                                              fcc4e0885754   ubuntu:latest   "bash"    3 hours ago   Up About a minute             gracious_ellis
                                                              
                                                              1
                                                              2
                                                              3

                                                              # 3、新建井启动容器

                                                              除了创建容器后通过 start 命令来启动,也可以直接新建并启动容器。

                                                              所需要的命令主要为 docker [container] run 命令,等价于先执行 docker [container] create 命令,再执行 docker [container] start。

                                                              例如,下面的命令输出 一个“Hello World“,之后容器自动终止:

                                                              $ docker run ubuntu /bin/echo 'Hello world'
                                                              Hello world
                                                              
                                                              1
                                                              2

                                                              这跟在本地直接执行 /bin/echo 'hello world' 相比几乎感觉不出任何区别。

                                                              当利用 docker [container] run 来创建并启动容器时,Docker 在后台运行的标准操作包括:

                                                              • 检查本地是否存在指定的镜像,不存在就从公有仓库下载;

                                                              • 利用镜像创建一个容器,并启动该容器;

                                                              • 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;

                                                              • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去;

                                                              • 从网桥的地址池配置一个 IP 地址给容器;

                                                              • 执行用户指定的应用程序;

                                                              • 执行完毕后容器被自动终止 。

                                                              下面的命令启动一个 bash 终端,允许用户进行交互:

                                                              $ docker run -it ubuntu:18.04 /bin/bash
                                                              root@b76dabdabb3f:/# 
                                                              
                                                              1
                                                              2

                                                              其中,-t 选项让 Docker 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i 则让容器的标准输入保持打开。更多的命令选项可以通过 man docker-run 命令来查看。

                                                              在交互模式下,用户可以通过所创建的终端来输人命令,例如:

                                                              root@b76dabdabb3f:/# pwd
                                                              /
                                                              root@b76dabdabb3f:/# ls
                                                              bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
                                                              root@b76dabdabb3f:/# ps
                                                                PID TTY          TIME CMD
                                                                  1 pts/0    00:00:00 bash
                                                                 11 pts/0    00:00:00 ps
                                                              root@b76dabdabb3f:/# 
                                                              
                                                              1
                                                              2
                                                              3
                                                              4
                                                              5
                                                              6
                                                              7
                                                              8
                                                              9

                                                              在容器内用 ps 命令查看进程,可以看到,只运行了 bash 应用,并没有运行其他无关的进程。用户可以按 Ctrl+D 或输入 exit 命令来退出容器:

                                                              root@b76dabdabb3f:/# exit
                                                              exit
                                                              $ 
                                                              
                                                              1
                                                              2
                                                              3

                                                              对于所创建的 bash 容器,当用户使用 exit 命令退出 bash 进程之后,容器也会自动退出。这是因为对于容器来说,当其中的应用退出后,容器的使命完成,也就没有继续运行的必要了。

                                                              可以使用 docker container wait CONTAINER [CONTAINER...] 子命令来等待容器退出,并打印退出返回结果。

                                                              某些时候,执行 docker [container] run 的时候因为命令无法正常执行容器会出错直接退出,此时可以查看退出的错误代码。

                                                              默认情况下,常见错误代码包括:

                                                              • 125:Docker daemon 执行出错,例如指定了不支持的 Docker 命令参数;

                                                              • 126:所指定命令无法执行,例如权限出错;

                                                              • 127:容器内命令无法找到。

                                                              命令执行后出错,会默认返回命令的退出错误码。

                                                              # 4、守护态运行

                                                              更多的时候,需要让 Docker 容器在后台以守护态(Daemonized)形式运行。此时,可以 通过添加 -d 参数来实现。

                                                              例如,下面的命令会在后台运行容器:

                                                              $ docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
                                                              3bbfb70ef02e07b81229d56259d07c0bd75bb62128c4cef3a81a09c08a920ff9
                                                              
                                                              1
                                                              2

                                                              容器启动后会返回一个唯一的 id,也可以通过 docker ps 或 docker container ls 命令来查看容器信息:

                                                              $ docker ps
                                                              CONTAINER ID   IMAGE           COMMAND                  CREATED              STATUS              PORTS     NAMES
                                                              3bbfb70ef02e   ubuntu          "/bin/sh -c 'while t…"   About a minute ago  Up About a minute             beautiful_ganguly
                                                              fcc4e0885754   ubuntu:latest   "bash"                   4 hours ago          Up 2 hours                    gracious_ellis
                                                              
                                                              1
                                                              2
                                                              3
                                                              4

                                                              # 5、查看容器输出

                                                              要获取容器的输出信息,可以通过 docker [container] logs 命令。

                                                              该命令支持的选项包括:

                                                              • -details:打印详细信息;

                                                              • -f,-follow:持续保持输出;

                                                              • -since string:输出从某个时间开始的日志;

                                                              • -tail string:输出最近的若干日志;

                                                              • -t,timestamps:显示时间戳信息;

                                                              • -until string:输出某个时间之前的日志。

                                                              例如,查看某容器的输出可以使用如下命令:

                                                              $ docker logs 3bbfb70ef02e
                                                              hello world
                                                              hello world
                                                              hello world
                                                              ...
                                                              
                                                              1
                                                              2
                                                              3
                                                              4
                                                              5

                                                              # 停止容器

                                                              这里主要介绍 Docker 容器的 pause/unpause、stop 和 prune 子命令。

                                                              # 1、暂停容器

                                                              可以使用 docker [container] pause CONTAINER [CONTAINER...] 命令来暂停一个运行中的容器。

                                                              例如,启动一个容器,并将其暂停,处于 paused 状态的容器,可以使用 docker [container] unpause CONTAINER [CONTAINER...] 命令来恢复到运行状态。

                                                              # 新建一个容器,名字为 test,查看其状态
                                                              $ docker run --name="test" -it ubuntu bash
                                                              root@c8d20c12cccb:/# exit
                                                              $ docker ps -a
                                                              CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS                     PORTS     NAMES
                                                              c8d20c12cccb   ubuntu    "bash"    9 seconds ago   Exited (0) 5 seconds ago             test
                                                              
                                                              # 启动容器
                                                              $ docker start test 
                                                              test
                                                              $ docker ps
                                                              CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS         PORTS     NAMES
                                                              c8d20c12cccb   ubuntu    "bash"    20 seconds ago   Up 2 seconds             test
                                                              
                                                              #暂停容器
                                                              $ docker pause test 
                                                              test
                                                              $ docker ps 
                                                              CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                   PORTS     NAMES
                                                              c8d20c12cccb   ubuntu    "bash"    54 seconds ago   Up 36 seconds (Paused)             test
                                                              
                                                              #恢复暂停的容器
                                                              $ docker unpause test 
                                                              test
                                                              $ docker ps
                                                              CONTAINER ID   IMAGE     COMMAND   CREATED              STATUS          PORTS     NAMES
                                                              c8d20c12cccb   ubuntu    "bash"    About a minute ago   Up 53 seconds             test
                                                              
                                                              1
                                                              2
                                                              3
                                                              4
                                                              5
                                                              6
                                                              7
                                                              8
                                                              9
                                                              10
                                                              11
                                                              12
                                                              13
                                                              14
                                                              15
                                                              16
                                                              17
                                                              18
                                                              19
                                                              20
                                                              21
                                                              22
                                                              23
                                                              24
                                                              25
                                                              26
                                                              27

                                                              # 2、终止容器

                                                              可以使用 docker [container] stop 来终止一个运行中的容器。该命令的格式为 docker[container] stop [-t|--time[=10]] [CONTAINER...]。

                                                              该命令会首先向容器发送 SIGTERM 信号,等待一段超时时间后(默认为 10 秒),再发 送 SIGKILL 信号来终止容器:

                                                              $ docker stop test 
                                                              test
                                                              $ docker ps -a
                                                              CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                     PORTS     NAMES
                                                              c8d20c12cccb   ubuntu    "bash"    10 minutes ago   Exited (0) 5 seconds ago             test
                                                              
                                                              1
                                                              2
                                                              3
                                                              4
                                                              5

                                                              此时,执行 docker container prune 命令,会自动清除掉所有处于停止状态的容器。此外,还可以通过 docker [container] kill 直接发送 SIGKILL 信号来强行终止容器。

                                                              当 Docker 容器中指定的应用终结时,容器也会自动终止。例如,对于前面只启动了一个终端的容器,用户通过 exit 命令或 Ctrl+d 来退出终端时,所创建的容器立刻终止,处于 stopped 状态。

                                                              可以用 docker ps -qa 命令看到所有容器的 ID。例如:

                                                              $ docker ps -aq
                                                              3c64d4d3197c
                                                              08bd1bc56ed2
                                                              c8d20c12cccb
                                                              
                                                              1
                                                              2
                                                              3
                                                              4

                                                              处于终止状态的容器,可以通过 docker [container] start 命令来重新启动:

                                                              $ docker ps -a
                                                              CONTAINER ID   IMAGE           COMMAND       CREATED      STATUS                     PORTS     NAMES
                                                              3c64d4d3197c   centos:latest   "/bin/bash"   2 days ago   Exited (0) 2 days ago                cool_bell
                                                              08bd1bc56ed2   centos:latest   "bash"        2 days ago   Exited (0) 2 days ago                gracious_tesla
                                                              c8d20c12cccb   ubuntu          "bash"        2 days ago   Exited (0) 8 seconds ago             test
                                                              $ docker start c8d20c12cccb
                                                              c8d20c12cccb
                                                              $ docker ps
                                                              CONTAINER ID   IMAGE     COMMAND   CREATED      STATUS         PORTS     NAMES
                                                              c8d20c12cccb   ubuntu    "bash"    2 days ago   Up 4 seconds             test
                                                              
                                                              1
                                                              2
                                                              3
                                                              4
                                                              5
                                                              6
                                                              7
                                                              8
                                                              9
                                                              10

                                                              docker [container] restart 命令会将一个运行态的容器先终止,然后再重新启动:

                                                              $ docker restart c8d20c12cccb
                                                              c8d20c12cccb
                                                              $ docker ps
                                                              CONTAINER ID   IMAGE     COMMAND   CREATED      STATUS         PORTS     NAMES
                                                              c8d20c12cccb   ubuntu    "bash"    2 days ago   Up 2 seconds             test
                                                              
                                                              1
                                                              2
                                                              3
                                                              4
                                                              5

                                                              # 进人容器

                                                              在使用 -d 参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。 这个时候如果需要进入容器进行操作,推荐使用官方的 attach 或 exec 命令。

                                                              # 1、attach 命令

                                                              attach 是 Docker 自带的命令,命令格式为:

                                                              docker [container] attach [--detach-keys[=[]]] \[--no-stdin] [--sig-proxy[=true]] CONTAINER

                                                              这个命令支持三个主要选项:

                                                              • --detach-keys [=[]]:指定退出 attach 模式的快捷键序列,默认是 CTRL-p CTRL-q;
                                                              • --no-stdin=true|false:是否关闭标准输入,默认是保持打开;
                                                              • --sig-proxy=true|false:是否代理收到的系统信号给应用进程,默认为 true。

                                                              下面示例如何使用该命令:

                                                              $ docker run -itd ubuntu
                                                              4be7970cb6b869a4857887036a6ae555f412a8fbe785ff71f027214276f14a1c
                                                              $ docker ps
                                                              CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
                                                              4be7970cb6b8   ubuntu    "bash"    6 seconds ago   Up 5 seconds             priceless_chandrasekhar
                                                              $ docker attach priceless_chandrasekhar 
                                                              root@4be7970cb6b8:/# 
                                                              
                                                              1
                                                              2
                                                              3
                                                              4
                                                              5
                                                              6
                                                              7

                                                              然而使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

                                                              # 2、exec 命令

                                                              从 Docker 的 1.3.0 版本起,Docker 提供了一个更加方便的工具 exec 命令,可以在运行中容器内直接执行任意命令。

                                                              该命令的基本格式为:

                                                              docker [container] exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARG...]

                                                              比较重要的参数有:

                                                              • -d,--detach:在容器中后台执行命令;
                                                              • --detach-keys=" ":指定将容器切回后台的按键;
                                                              • -e,--env=[]:指定环境变量列表;
                                                              • -i,--interactive=true|false:打开标准输入接受用户输入命令,默认值为 false;
                                                              • --privileged=true|false:是否给执行命令以高权限,默认值为 false;
                                                              • -t,--tty=true|false:分配伪终端,默认值为 false;
                                                              • -u,--user=" ":执行命令的用户名或 ID。

                                                              例如,进入到刚创建的容器中,并启动一个 bash:

                                                              $ docker exec -it 4be7970cb6b8 /bin/bash
                                                              root@4be7970cb6b8:/# 
                                                              
                                                              1
                                                              2

                                                              可以看到会打开一个新的 bash 终端,在不影响容器内其他应用的前提下,用户可以与容器进行交互。

                                                              注意

                                                              通过指定 - it 参数来保持标准输入打开,并且分配一个伪终端。通过 exec 命令对容器执行操作是最为推荐的方式。

                                                              进一步地,可以在容器中查看容器中的用户和进程信息:

                                                              root@4be7970cb6b8:/# w
                                                               02:45:03 up 34 min,  0 users,  load average: 1.39, 0.78, 0.67
                                                              USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
                                                              root@4be7970cb6b8:/# ps -ef
                                                              UID        PID  PPID  C STIME TTY          TIME CMD
                                                              root         1     0  0 02:42 pts/0    00:00:00 bash
                                                              root         9     0  0 02:42 pts/1    00:00:00 /bin/bash
                                                              root        18     9  0 02:45 pts/1    00:00:00 ps -ef
                                                              root@4be7970cb6b8:/# 
                                                              
                                                              1
                                                              2
                                                              3
                                                              4
                                                              5
                                                              6
                                                              7
                                                              8
                                                              9

                                                              # 删除容器

                                                              可以使用 docker [container] rm 命令来删除处于终止或退出状态的容器,命令格式为 docker[container] rm [-f|--force] [-l|--link] [-v|--volumes] CONTAINER [CONTAINER...]。

                                                              主要支持的选项包括:

                                                              • -f,--force=false:是否强行终止并删除一个运行中的容器;

                                                              • -l,--link=false:删除容器的连接,但保留容器;

                                                              • -v,--volumes=false:删除容器挂载的数据卷。

                                                              例如,查看处于终止状态的容器,并删除:

                                                              $ docker ps -a
                                                              CONTAINER ID   IMAGE           COMMAND       CREATED          STATUS                      PORTS     NAMES
                                                              4be7970cb6b8   ubuntu          "bash"        27 minutes ago   Up 13 minutes                         priceless_chandrasekhar
                                                              3c64d4d3197c   centos:latest   "/bin/bash"   2 days ago       Exited (0) 2 days ago                 cool_bell
                                                              08bd1bc56ed2   centos:latest   "bash"        2 days ago       Exited (0) 2 days ago                 gracious_tesla
                                                              c8d20c12cccb   ubuntu          "bash"        2 days ago       Exited (0) 27 minutes ago             test
                                                              $ docker rm 08bd1bc56ed2
                                                              08bd1bc56ed2
                                                              $ docker ps -a
                                                              CONTAINER ID   IMAGE           COMMAND       CREATED          STATUS                      PORTS     NAMES
                                                              4be7970cb6b8   ubuntu          "bash"        28 minutes ago   Up 14 minutes                         priceless_chandrasekhar
                                                              3c64d4d3197c   centos:latest   "/bin/bash"   2 days ago       Exited (0) 2 days ago                 cool_bell
                                                              c8d20c12cccb   ubuntu          "bash"        2 days ago       Exited (0) 28 minutes ago             test
                                                              
                                                              1
                                                              2
                                                              3
                                                              4
                                                              5
                                                              6
                                                              7
                                                              8
                                                              9
                                                              10
                                                              11
                                                              12
                                                              13

                                                              默认情况下,docker rm 命令只能删除已经处于终止或退出状态的容器,并不能删除还处于运行状态的容器。

                                                              如果要直接删除一个运行中的容器,可以添加 -f 参数。Docker 会先发送 SIGKILL 信号给容器,终止其中的应用,之后强行删除:

                                                              $ docker ps
                                                              CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS         PORTS     NAMES
                                                              acca51225fce   ubuntu    "bash"    29 seconds ago   Up 3 seconds             musing_edison
                                                              $ docker rm acca51225fce
                                                              Error response from daemon: You cannot remove a running container acca51225fce4f1072a7ffd0fdac860e9d93c1bc8c84db6197d71ea292d7ca90. Stop the container before attempting removal or force remove
                                                              $ docker rm -f acca51225fce
                                                              acca51225fce
                                                              $ docker ps
                                                              CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
                                                              
                                                              1
                                                              2
                                                              3
                                                              4
                                                              5
                                                              6
                                                              7
                                                              8
                                                              9

                                                              # 导人和导出容器

                                                              某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用 Docker 的导入和导出功能,这也是 Docker 自身提供的一个重要特性。

                                                              # 1、导出容器

                                                              导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。可以使用 docker [container] export 命令,该命令格式为:

                                                              docker [container] export [-o|--output [ =" "] CONTAINER

                                                              其中,可以通过 -o 选项来指定导出的 tar 文件名,也可以直接通过重定向来实现。首先,查看所有的容器,如下所示:

                                                              $ docker ps -a
                                                              CONTAINER ID   IMAGE           COMMAND       CREATED      STATUS                   PORTS     NAMES
                                                              3c64d4d3197c   centos:latest   "/bin/bash"   2 days ago   Exited (0) 2 days ago              cool_bell
                                                              c8d20c12cccb   ubuntu          "bash"        2 days ago   Exited (0) 2 hours ago             test
                                                              
                                                              
                                                              1
                                                              2
                                                              3
                                                              4
                                                              5

                                                              分别导出 3c64d4d3197c 容器和 c8d20c12cccb 容器到文件 cool_for_centos.tar 文件和 test_for_ubuntu.tar 文件:

                                                              $ docker export -o cool_for_centos.tar 3c64d4d3197c
                                                              $ ls -l
                                                              总用量 211484
                                                              -rw------- 1 root root 216525312 9月   6 12:10 cool_for_centos.tar
                                                              $ docker export c8d20c12cccb > test_for_ubuntu.tar
                                                              $ ls -l
                                                              总用量 284884
                                                              -rw------- 1 root root 216525312 9月   6 12:10 cool_for_centos.tar
                                                              
                                                              1
                                                              2
                                                              3
                                                              4
                                                              5
                                                              6
                                                              7
                                                              8

                                                              之后,可将导出的 tar 文件传输到其他机器上,然后再通过导人命令导入到系统中,实现容器的迁移。

                                                              # 2、导入容器

                                                              导出的文件又可以使用 docker [container] import 命令导人变成镜像,该命令格式为:

                                                              docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|-[REPOSITORY[:TAG]]

                                                              用户可以通过 -c,--change=[] 选项在导人的同时执行对容器进行修改的 Dockerfile 指令(可参考后续相关内容)。

                                                              下面将导出的 test_for_ubuntu.tar 文件导人到系统中:

                                                              r$ docker import test_for_ubuntu.tar test/ubuntu:v1.0
                                                              sha256:00cf452ac39b9eecff28658850094bac5e345f0ac0f06ff44897873464c7ae00
                                                              $ docker images
                                                              REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
                                                              test/ubuntu   v1.0      00cf452ac39b   4 seconds ago   72.8MB
                                                              ubuntu        latest    fb52e22af1b0   6 days ago      72.8MB
                                                              ubuntu        18.04     54919e10a95d   6 days ago      63.1MB
                                                              centos        latest    300e315adb2f   9 months ago    209MB
                                                              
                                                              1
                                                              2
                                                              3
                                                              4
                                                              5
                                                              6
                                                              7
                                                              8

                                                              之前曾介绍过使用 docker load 命令来导入一个镜像文件,与 docke [container] import 命令十分类似。 实际上,既可以使用 docker load 命令来导入镜像存储文件到本地镜像库,也可以使用 docker import 命令来导入一个容器快照到本地镜像库。这两者的区别在于:容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

                                                              # 查看容器

                                                              主要介绍 Docker 容器的 inspect、top 和 stats 子命令。

                                                              # 1、查看容器详情

                                                              查看容器详情可以使用 docker container inspect [OPTIONS] CONTAINER [CONTAINER...]子命令。 例如,查看某容器的具体信息,会以 json 格式返回包括容器 Id、创建时间、路径、状态、镜像、配置等在内的各项信息:

                                                              $ docker container inspect test
                                                              [
                                                                  {
                                                                      "Id": "c8d20c12cccbf317c5f9257b3abe542f98dba3b92b7f72d963427413e5ebf2ad",
                                                                      "Created": "2021-09-03T07:45:47.300705248Z",
                                                                      "Path": "bash",
                                                                      "Args": [],
                                                                      "State": {
                                                                          "Status": "exited",
                                                              ......
                                                                      }
                                                                  }
                                                              ]
                                                              
                                                              1
                                                              2
                                                              3
                                                              4
                                                              5
                                                              6
                                                              7
                                                              8
                                                              9
                                                              10
                                                              11
                                                              12
                                                              13

                                                              # 2、查看容器内进程

                                                              查看容器内进程可以使用 docker [container] top [OPTIONS] CONTAINER [CONTAINER...]子命令。

                                                              这个子命令类似于 Linux 系统中的 top 命令,会打印出容器内的进程信息,包括 PID、用户、时间、命令等。例如,查看某容器内的进程信息,命令如下:

                                                              $ docker ps
                                                              CONTAINER ID   IMAGE     COMMAND   CREATED      STATUS         PORTS     NAMES
                                                              c8d20c12cccb   ubuntu    "bash"    2 days ago   Up 2 seconds             test
                                                              kei@kei-KVM:~/docker$ docker top test 
                                                              UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
                                                              root                9758                9723                0                   13:18               pts/0               00:00:00            bash
                                                              
                                                              1
                                                              2
                                                              3
                                                              4
                                                              5
                                                              6

                                                              # 3、查看统计信息

                                                              查看统计信息可以使用 docker [container] stats [OPTIONS] [CONTAINER...] 子命令,会显示 CPU、内存、存储、网络等使用情况的统计信息。

                                                              支持选项包括:

                                                              • a,-all:输出所有容器统计信息,默认仅在运行中;
                                                              • -format string:格式化输出信息;
                                                              • -no-stream:不持续输出,默认会自动更新持续实时结果;
                                                              • -no-trunc:不截断输出信息。

                                                              例如,查看当前运行中容器的系统资源使用统计:

                                                              $ docker stats
                                                              CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O       BLOCK I/O     PIDS
                                                              c8d20c12cccb   test      0.00%     2.562MiB / 3.844GiB   0.07%     3.51kB / 0B   1.25MB / 0B   1
                                                              # 可使用 Ctrl + C 退出
                                                              
                                                              1
                                                              2
                                                              3
                                                              4

                                                              # 其他容器命令

                                                              主要介绍 Docker 容器的 cp、diff、port 和 update 子命令。

                                                              # 1、复制文件

                                                              container cp 命令支持在容器和主机之间复制文件。

                                                              命令格式为 docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-。支持的选项包括 :

                                                              • -a,-archive:打包模式,复制文件会带有原始的 uid/gid 信息;
                                                              • -L,-follow-link:跟随软连接。当原路径为软连接时,默认只复制链接信息,使用该选项会复制链接的目标内容。

                                                              例如,将本地的路径 data 复制到 test 容器的 /tmp 路径下:

                                                              $ touch test_file.txt
                                                              $ nano test_file.txt 
                                                              $ cat test_file.txt 
                                                              hello world!
                                                              $ docker ps
                                                              CONTAINER ID   IMAGE     COMMAND   CREATED      STATUS          PORTS     NAMES
                                                              c8d20c12cccb   ubuntu    "bash"    2 days ago   Up 12 minutes             test
                                                              $ docker cp test_file.txt test:/tmp/
                                                              $ docker attach test 
                                                              root@c8d20c12cccb:/# cd /tmp/ && ls
                                                              test_file.txt
                                                              root@c8d20c12cccb:/tmp# cat test_file.txt 
                                                              hello world!
                                                              root@c8d20c12cccb:/tmp# 
                                                              
                                                              1
                                                              2
                                                              3
                                                              4
                                                              5
                                                              6
                                                              7
                                                              8
                                                              9
                                                              10
                                                              11
                                                              12
                                                              13
                                                              14

                                                              # 2、查看变更

                                                              container diff 查看容器内文件系统的变更。

                                                              命令格式为 docker [container] diff CONTAINER。例如,查看 test 容器内的数据修改:

                                                              $ docker container diff test 
                                                              C /root
                                                              A /root/.bash_history
                                                              C /tmp
                                                              A /tmp/test_file.txt
                                                              
                                                              1
                                                              2
                                                              3
                                                              4
                                                              5

                                                              # 3、查看端口映射

                                                              container port 命令可以查看容器的端口映射’情况。

                                                              命令格式为 docker container port CONTAINER [PRIVATE_PORT[/PROTO]]。例如,查看 test 容器的端口映射’情况:

                                                              $ docker container port test
                                                              9000/tcp -> 0.0.0.0:9000
                                                              
                                                              1
                                                              2

                                                              # 4、更新配置

                                                              container update 命令可以更新容器的一些运行时配置,主要是一些资源限制份额。

                                                              命令格式为 docker [container] update [OPTIONS] CONTAINER [CONTAINER...]。

                                                              支持的选项包括:

                                                              • blkio-weight uint16:更新块 IO 限制,10~1000,默认值为 0,代表着无限制;
                                                              • -cpu-period int:限制 CPU 调度器 CFS(Completely Fair Scheduler)使用时间,单位为微秒,最小 1000;
                                                              • -cpu-quota int:限制 CPU 调度器 CFS 配额,单位为微秒,最小 1000;
                                                              • -cpu-rt-period int:限制 CPU 调度器的实时周期,单位为微秒;
                                                              • -cpu-rt-runtime int:限制 CPU 调度器的实时运行时,单位为微秒;
                                                              • -c,-cpu-shares int:限制 CPU 使用份额;
                                                              • -cpus decimal:限制 CPU 个数;
                                                              • -cpuset-cpus string:允许使用的 CPU 核,如 0-3,0,1;
                                                              • -cpuset-mems string:允许使用的内存块,如 0-3,0,1;
                                                              • -kernel-memory bytes:限制使用的内核内存;
                                                              • -m,-memory bytes:限制使用的内存;
                                                              • -memory-reservation bytes:内存软限制;
                                                              • -memory-swap bytes:内存加上缓存区的限制,-1 表示为对缓冲区无限制;
                                                              • -restart string:容器退出后的重启策略。

                                                              例如,限制总配额为 1 秒,容器 test 所占用时间为 10% ,代码如下所示:

                                                              $ docker update --cpu-quota 1000000 test 
                                                              test
                                                              $ docker update --cpu-period 100000 test 
                                                              test
                                                              
                                                              1
                                                              2
                                                              3
                                                              4

                                                              # 小结

                                                              容器是直接提供应用服务的组件,也是 Docker 整个技术核中最为核心的概念。围绕容器,Docker 提供了十分丰富的操作命令,允许用户高效地管理容器的整个生命周期。你可以使用 docker container help 命令查看 Docker 支持的容器操作子命令。

                                                              edit icon编辑此页open in new window
                                                              上一页
                                                              使用 Docker 镜像
                                                              下一页
                                                              访问 Docker 仓库
                                                              MIT Licensed
                                                              Copyright © 2022 karin