简单来说,容器就是镜像的运行实例。

本文介绍创建一个容器、启动容器、终止一个容器、进入容器内执行操作、删除容器和通过导入导出容器来实现容器迁移等。

1. 创建容器

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

1.1 新建容器

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

  1. ubuntu@VM-0-5-ubuntu:~/Dockerfile$ docker container create -it ubuntu:18.04
  2. 5d01159f9675d2c532628593202ed86bf36bb369183aa22b0fdc7b12bf0b9443
  3. ubuntu@VM-0-5-ubuntu:~/Dockerfile$ docker ps -a
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 5d01159f9675 ubuntu:18.04 "/bin/bash" 4 seconds ago Created infallible_chatterjee
  6. 50bc41da0fad ubuntu:18.04 "/bin/bash" 3 hours ago Exited (0) 3 hours ago quizzical_joliot
  7. ubuntu@VM-0-5-ubuntu:~/Dockerfile$ docker create -it ubuntu:18.04
  8. f2f13592741727b5c24de319aeb305ca4e6a98c16a8938d25322eaa8ac9f2b53
  9. ubuntu@VM-0-5-ubuntu:~/Dockerfile$ docker ps -a
  10. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  11. f2f135927417 ubuntu:18.04 "/bin/bash" 5 seconds ago Created admiring_vaughan
  12. 5d01159f9675 ubuntu:18.04 "/bin/bash" 24 seconds ago Created infallible_chatterjee
  13. 50bc41da0fad ubuntu:18.04 "/bin/bash" 3 hours ago Exited (0) 3 hours ago quizzical_joliot
  14. ubuntu@VM-0-5-ubuntu:~/Dockerfile$

注:[container]表示可选写或者不写,效果都是一样的。

使用docker [container] create命令新建的容器处于停止状态,可以使用docker[container] start命令来启动它。
image.png
image.png
image.png
其他选项还包括:

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

    2.2 启动容器

    使用docker [container] start命令来启动一个已经创建的容器。
    例如,启动刚创建的ubuntu容器: ```shell ubuntu@VM-0-5-ubuntu:~/Dockerfile$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f2f135927417 ubuntu:18.04 “/bin/bash” 14 minutes ago Created admiring_vaughan 5d01159f9675 ubuntu:18.04 “/bin/bash” 14 minutes ago Created infallible_chatterjee ubuntu@VM-0-5-ubuntu:~/Dockerfile$ docker start 5d 5d ubuntu@VM-0-5-ubuntu:~/Dockerfile$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5d01159f9675 ubuntu:18.04 “/bin/bash” 18 minutes ago Up 9 seconds infallible_chatterjee ubuntu@VM-0-5-ubuntu:~/Dockerfile$
  1. <a name="VvFnN"></a>
  2. #### 2.3 新建并启动容器
  3. 命令主要为`docker [container] run`,等价于先执行`docker [container] create`命令,再执行`docker [container] start`命令。<br />例:下面的命令输出一个“Hello World”,之后容器自动终止:
  4. ```shell
  5. ubuntu@VM-0-5-ubuntu:~/Dockerfile$ docker run ubuntu:18.04 /bin/echo "hello world"
  6. hello world

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

  1. 检查本地是否存在指定的镜像,不存在就从公有仓库下载;
  2. 利用镜像创建一个容器,并启动该容器;
  3. 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
  4. 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去;
  5. 从网桥的地址池配置一个IP地址给容器;
  6. 执行用户指定的应用程序;
  7. 执行完毕后容器被自动终止。

例:启动一个bash终端,允许用户进行交互:

  1. ubuntu@VM-0-5-ubuntu:~/Dockerfile$ docker run -it ubuntu:18.04 /bin/bash
  2. root@6340025a3758:/#
  • -t:让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
  • -i:让容器的标准输入保持打开

更多的命令选项可以通过man docker-run命令来查看。

用户可以按Ctrl+d或输入exit命令来退出容器。

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

使用docker container wait CONTAINER [CONTAINER...]子命令来等待容器退出,并打印退出返回结果。某些时候,执行docker [container] run时候因为命令无法正常执行容器会出错直接退出,此时可以查看退出的错误代码。

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

  • 125:Docker daemon执行出错,例如指定了不支持的Docker命令参数;
  • 126:所指定命令无法执行,例如权限出错;
  • 127:容器内命令无法找到。

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

2. 停止容器

2.1 暂停容器

使用docker [container] pause CONTAINER [CONTAINER...]命令来暂停一个运行中的容器。
例:启动一个容器,并将其暂停:

  1. ubuntu@VM-0-5-ubuntu:~$ docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 5d01159f9675 ubuntu:18.04 "/bin/bash" 3 hours ago Up 2 hours infallible_chatterjee
  4. ubuntu@VM-0-5-ubuntu:~$ docker pause infallible_chatterjee
  5. infallible_chatterjee
  6. ubuntu@VM-0-5-ubuntu:~$ docker ps
  7. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  8. 5d01159f9675 ubuntu:18.04 "/bin/bash" 3 hours ago Up 2 hours (Paused) infallible_chatterjee
  9. ubuntu@VM-0-5-ubuntu:~$ docker unpause infallible_chatterjee
  10. infallible_chatterjee
  11. ubuntu@VM-0-5-ubuntu:~$ docker ps
  12. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  13. 5d01159f9675 ubuntu:18.04 "/bin/bash" 3 hours ago Up 2 hours infallible_chatterjee
  14. ubuntu@VM-0-5-ubuntu:~$

2.2 终止容器

可以使用docker [container] stop来终止一个运行中的容器。该命令的格式为docker [container] stop [-t|--time[=10]] [CONTAINER...]
该命令会首先向容器发送SIGTERM信号,等待一段超时时间后(默认为10秒),再发送SIGKILL信号来终止容器:

  1. ubuntu@VM-0-5-ubuntu:~$ docker stop 5d
  2. 5d
  3. ubuntu@VM-0-5-ubuntu:~$ docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. ubuntu@VM-0-5-ubuntu:~$

执行docker container prune命令,会自动清除掉所有处于停止状态的容器。

  1. ubuntu@VM-0-5-ubuntu:~$ docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. ubuntu@VM-0-5-ubuntu:~$ docker ps -a
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. a1c8bff2043f ubuntu:18.04 "/bin/bash" 2 hours ago Exited (0) 10 minutes ago goofy_bartik
  6. 6340025a3758 ubuntu:18.04 "/bin/bash" 2 hours ago Exited (127) 2 hours ago nostalgic_grothendieck
  7. 58f57fa25a8e ubuntu:18.04 "/bin/echo 'hello wo…" 2 hours ago Exited (0) 2 hours ago cool_shtern
  8. f2f135927417 ubuntu:18.04 "/bin/bash" 3 hours ago Created admiring_vaughan
  9. 5d01159f9675 ubuntu:18.04 "/bin/bash" 3 hours ago Exited (0) 3 minutes ago infallible_chatterjee
  10. ubuntu@VM-0-5-ubuntu:~$ docker container prune
  11. WARNING! This will remove all stopped containers.
  12. Are you sure you want to continue? [y/N] y
  13. Deleted Containers:
  14. a1c8bff2043ff107a46d244c2b7cbf50d8ba8ef6803c46271d6c94de086ee3f6
  15. 6340025a3758947205d7144dcf49f5b681a78ece2a7c83b9e3c0e8cd7bcb9417
  16. 58f57fa25a8ee365a9ed7439dfd80877963d0f309468e03432261fc60ac84b00
  17. f2f13592741727b5c24de319aeb305ca4e6a98c16a8938d25322eaa8ac9f2b53
  18. 5d01159f9675d2c532628593202ed86bf36bb369183aa22b0fdc7b12bf0b9443
  19. Total reclaimed space: 30B
  20. ubuntu@VM-0-5-ubuntu:~$ docker ps -a
  21. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  22. ubuntu@VM-0-5-ubuntu:~$

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

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

3. 进入容器

3.1 attach命令

在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。

这个时候如果需要进入容器进行操作,推荐使用官方的attachexec命令。

  1. docker [container] attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]]

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

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

例:

  1. ubuntu@VM-0-5-ubuntu:~$ docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. ubuntu@VM-0-5-ubuntu:~$ docker run -itd ubuntu:18.04
  4. d3d26ade90b58708c0baf7bc47dd081bbc40c30b11908a7514d784efd2895944
  5. ubuntu@VM-0-5-ubuntu:~$ docker ps
  6. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  7. d3d26ade90b5 ubuntu:18.04 "/bin/bash" 6 seconds ago Up 4 seconds relaxed_antonelli
  8. ubuntu@VM-0-5-ubuntu:~$ docker attach relaxed_antonelli
  9. root@d3d26ade90b5:/#

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

3.2 exec命令

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

  1. docker [container] exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive]
  2. [--privileged]
  3. [-t | --ttu]
  4. [-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。

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

4. 删除容器

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

主要支持的选项包括:

  • -f, —force=false:是否强行终止并删除一个运行中的容器;
  • -l, —link=false:删除容器的连接,但保留容器;
  • -v, —volumes=false:删除容器挂载的数据卷。

例:

  1. ubuntu@VM-0-5-ubuntu:~$ docker ps -a
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 08ee01480270 ubuntu:18.04 "/bin/bash" 4 hours ago Up 4 hours exciting_panini
  4. d3d26ade90b5 ubuntu:18.04 "/bin/bash" 4 hours ago Exited (0) 4 hours ago relaxed_antonelli
  5. ubuntu@VM-0-5-ubuntu:~$ docker rm d3
  6. d3
  7. ubuntu@VM-0-5-ubuntu:~$ docker ps -a
  8. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  9. 08ee01480270 ubuntu:18.04 "/bin/bash" 4 hours ago Up 4 hours exciting_panini
  10. ubuntu@VM-0-5-ubuntu:~$

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

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

  1. ubuntu@VM-0-5-ubuntu:~$ docker ps -a
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 08ee01480270 ubuntu:18.04 "/bin/bash" 4 hours ago Up 4 hours exciting_panini
  4. ubuntu@VM-0-5-ubuntu:~$ docker rm 08
  5. Error response from daemon: You cannot remove a running container 08ee01480270d361fbd84698e9fc536acdff33f8fbacf6f94c7cb7a7fa420f11. Stop the container before attempting removal or force remove
  6. ubuntu@VM-0-5-ubuntu:~$ docker rm -f 08
  7. 08
  8. ubuntu@VM-0-5-ubuntu:~$ docker ps -a
  9. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  10. ubuntu@VM-0-5-ubuntu:~$

5. 导入和导出容器

5.1 导出容器

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

  1. docker [container] export [-o | --output[=""]] CONTAINER
  • 可以通过-o选项来指定导出的tar文件名 ```shell ubuntu@VM-0-5-ubuntu:~$ docker run -itd ubuntu:18.04 3bc1953bf9f47368fe4df8b5f54a4440ccd46a245f83a2ed70422e8fed14a049 ubuntu@VM-0-5-ubuntu:~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3bc1953bf9f4 ubuntu:18.04 “/bin/bash” 7 seconds ago Up 6 seconds relaxed_banach ubuntu@VM-0-5-ubuntu:~$ docker export -o test_for_run.tar 3bc ubuntu@VM-0-5-ubuntu:~$ ls Dockerfile downloads sites snap test_for_run.tar ubuntu@VM-0-5-ubuntu:~$
  1. <a name="b1ZwC"></a>
  2. #### 5.2 导入容器
  3. 导出的文件又可以使用`docker [container] impor`t命令导入变成镜像,该命令格式为:
  4. ```shell
  5. docker import [-c | --change[=[]] [-m | --message[=MESSAGE]] file|URL|- [REPOSITORY[:TAG]]
  • 通过-c,—change=[]选项在导入的同时执行对容器进行修改的Dockfile指令

例:将导出的test_for_run.tar文件导入到系统中:

  1. ubuntu@VM-0-5-ubuntu:~$ docker import test_for_run.tar test/ubuntu:v1.0
  2. sha256:2b6d444bdcf8097eee1d602c9f7a2783645aa0ee333bec43a3c6c2ea72294f3e
  3. ubuntu@VM-0-5-ubuntu:~$ docker images
  4. REPOSITORY TAG IMAGE ID CREATED SIZE
  5. test/ubuntu v1.0 2b6d444bdcf8 10 seconds ago 63.3MB
  6. python 3 69c47fbba5e1 24 hours ago 95.2MB
  7. <none> <none> d350491520dc 24 hours ago 63.3MB
  8. debian stretch-slim 2b41160badb6 10 days ago 55.3MB
  9. ubuntu 18.04 3339fde08fc3 3 weeks ago 63.3MB
  10. hello-world latest d1165f221234 6 weeks ago 13.3kB
  11. ubuntu@VM-0-5-ubuntu:~$

6. 查看容器

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

6.1 查看容器详情

查看容器详情可以使用docker container inspect [OPTIONS]CONTAINER [CONTAINER...]子命令。

  1. ubuntu@VM-0-5-ubuntu:~$ docker container ls
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 3bc1953bf9f4 ubuntu:18.04 "/bin/bash" 38 minutes ago Up 38 minutes relaxed_banach
  4. ubuntu@VM-0-5-ubuntu:~$ docker container inspect relaxed_banach

6.2 查看容器内进程

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

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

  1. ubuntu@VM-0-5-ubuntu:~$ docker container ls
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 3bc1953bf9f4 ubuntu:18.04 "/bin/bash" 42 minutes ago Up 42 minutes relaxed_banach
  4. ubuntu@VM-0-5-ubuntu:~$ docker top relaxed_banach
  5. UID PID PPID C STIME TTY TIME CMD
  6. root 14384 14356 0 15:19 pts/0 00:00:00 /bin/bash
  7. ubuntu@VM-0-5-ubuntu:~$

6.3 查看统计信息

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

支持选项包括:

  • -a, -all:输出所有容器统计信息,默认仅在运行中;
  • -format string:格式化输出信息;
  • -no-stream:不持续输出,默认会自动更新持续实时结果;
  • -no-trunc:不截断输出信息。 ```shell ubuntu@VM-0-5-ubuntu:~$ docker stats relaxed_banach
  1. <a name="EVart"></a>
  2. ### 7. 其他容器命令
  3. 主要介绍Docker容器的cp、diff、port和update子命令。
  4. <a name="MUw0h"></a>
  5. #### 7.1 复制文件
  6. `container cp`命令支持在容器和主机之间复制文件。命令格式为`docker[container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-`。支持的选项包括:
  7. - -a, -archive:打包模式,复制文件会带有原始的uid/gid信息;
  8. - -L, -follow-link:跟随软连接。当原路径为软连接时,默认只复制链接信息,使用该选项会复制链接的目标内容。
  9. 例:将本地的路径data复制到test容器的/tmp路径下:
  10. ```shell
  11. docker [container] cp data test:/tmp/

7.2 查看变更

container diff查看容器内文件系统的变更。命令格式为docker [container] diffCONTAINER
image.png

7.3 查看端口映射

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

7.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:容器退出后的重启策略。

image.png