容器是镜像的一个运行实例。不同的是,镜像是静态的只读文件,而容器是带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。

启动容器

启动容器的方式有两种:一种是基于镜像新建一个容器并启动,另一个是将终止状态下的容器重新启动。

create新建容器和start启动

可以使用 docker [container] create [基于的镜像] 命令新建一个容器。例如:

  1. > docker container create -it ubuntu:14.04

使用 create 创建的容器并没有启动,如果想要启动,需要使用的命令是 docker container start [容器ID或NAMES]

  1. > docker container start

image.png

run新建并启动容器

run 命令等价于 create + start,可以直接通过 docker [container] run 来新建并启动容器。

  1. > docker container run ubuntu:14.04

image.png

当使用 docker run 创建容器时,docker 在后台运行的标准操作是:

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

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

  1. > docker container run -it ubuntu:14.04 /bin/bash

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

用户可以通过创建的终端来输入命令,例如:

  1. > docker container run -it ubuntu:14.04 /bin/bash

image.png

docker create 命令和 run 命令支持的选项都十分复杂,这里通过附上选项表,在日后使用到时查询。

image.png
image.png
1.png

-d参数守护态启动

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

下面例子分别通过使用和不使用 -d 选项来运行容器。

  1. > docker container run ubuntu:14.04 /bin/bash -c "while true;do echo hello world;sleep 1;done"
  2. > docker container run -d ubuntu:14.04 /bin/bash -c "while true;do echo hello world;sleep 1;done"

image.png

不使用 -d 选项时,输出是打印到宿主机上的;如果使用了 -d 选项则没有输出,不过容器启动后会返回一个唯一的id,可以通过 docker container logs [容器ID] 来从日志中查看。

docker container logs 支持的选项有:

  • -details:打印详细信息;
  • -f, -follow:持续保持输出;
  • -since string:输出从某个时间开始的日志;
  • -tail string:输出最近的若干日志;
  • -t, -timestamps:显示时间戳信息;
  • -until string:输出某个时间之前的日志。

pause暂停和unpause重新运行容器

可以使用 docker [container] pause [容器ID] 命令来暂停一个运行中的容器。
处于 paused 状态的容器,可以使用 docker [container] unpause [容器ID] 来重新运行。

  1. > docker container run --name test --rm -it ubuntu:14.04 /bin/bash
  2. > docker container pause test
  3. > docker container ps -a
  4. > docker container unpause test

image.png

这里通过创建两个 shell 界面,一个用来启动容器,另一个则进行暂停和重启的操作,可以发现在 paused 状态时,我们无法在第一个 shell 界面上输入命令行,当再次启动时,则又可以输入。

stop终止容器

使用 docker [container] stop [容器ID] 来终止一个运行中的容器。

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

  1. > docker container stop test -t=10

image.png

attach或exec进入容器

使用 -d 选项启动的容器是后台运行的,如果用户需要进入容器进行操作,则需要进入容器。

attach命令进入

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

  1. docker [container] attach [--detach-key[=[]]] [--no-stdin] [--sig-proxy[=true]] [容器ID]

其中,支持三个主要选项:

  • —detach-keys[=[]]:指定退出 attach 模式的快捷键序列,默认是 CTRL-p CTRL-q;
  • —no-stdin=true|false:是否关闭标准输入,默认是保持打开;
  • —sig-proxy=true|false:是否代理收到的系统信号给应用进程,默认为 true。
  1. > docker container run --name test -dit ubuntu:14.04 /bin/bash
  2. > docker container ps -a
  3. > docker container attach test

image.png

exec命令进入(推荐)

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

  1. docker [container] exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged]
  2. [-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。
  1. > docker container start test
  2. > docker container exec -it test bash

image.png

:::info 推荐使用 exec 的好处:

  1. 使用 attach 进入容器并退出,启动的容器会终止掉;而使用 exec 进入并退出,容器并不会被终止;
  2. 当多个窗口同时 attach 到同一个容器时,所有窗口都会同步显示,当某个窗口因命令阻塞时,其他窗口也无法操作;而使用 exec 每个窗口都是独立的 bash,操作命令互不影响; :::

export导出和import导出容器

有时,我们需要将容器从一个系统迁移到另一个系统,这时就需要使用 docker 的导入和导出功能。

expor导出

导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。命令格式如下:

  1. docker [container] export [-o|--output[=""]] [容器ID]

可以通过 -o 选项来指定导出的 tar 文件名。例子如下:

  1. > docker container export -o ubuntu.v1.tar 5f
  2. > docker container export 5f > ubuntu.v1.tar

image.png

之后就可以将导出的容器快照传输到其他的机子上,再使用导入命令导入,实现容器迁移。

import导入

导出的文件又可以使用 import 命令导入变成镜像,命令格式如下:

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

用户可以通过 -c, —change=[] 选项在导入的同时执行对容器进行修改的 Dockerfile 指令。

  1. # 使用容器快照导入
  2. > docker image import ubuntu.v1.tar test/ubuntu:v1
  3. # 指定 URL 或者某个目录来导入
  4. > docker import http://example.com/example.tar example/imagerepo

image.png

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

【疑惑】import 方法竟然在 image 下,而不是在 container 下?
image.png

rm删除容器和prune删除终止状态的容器

删除处于终止或退出状态的容器,其命令格式为:

  1. docker [container] rm [-f|--force] [-l|--link] [-v|--volumes] CONTAINER [CONTAINER...]

命令选项包括:

  • -f, —force=false:默认情况下,rm 只能删除处于终止或退出的容器;如果要强行终止并删除一个运行中的容器,则需要-f;
  • -l, —link=false:删除容器的连接,但保留容器;
  • -v, —volumes=false:删除容器挂载的数据卷。

同时,也可以通过执行 docker [container] prune 命令,清除掉所有处于停止状态的容器。

  1. > docker container rm test1
  2. > docker container prune

此外,还可以通过 docker [container] kill 直接发送 SIGKILL 信号来强行终止运行中的容器。

image.png

cp容器和主机间复制文件

可以将主机中的文件复制到容器中,命令:docker container cp [OPTIONS] [CONTAINER]

  1. > docker ps -a
  2. > ll
  3. > docker container cp ubuntu.v1.tar musing_carver:/tmp/
  4. > docker container exec -it musing_carver bash
  5. root@f924cc5ef9c1:/# ls /tmp

image.png

查看容器信息的操作

下面是一些查看容器信息的操作。

  • docker [container] inspect [OPTIONS] [CONTAINER]:查看容器详情;
  • docker [container] top [OPTIONS] [CONTAINER]:打印容器内的进程信息;
  • docker [container] stats [OPTIONS] [CONTAINER]:查看统计信息;
  • docker [container] diff [CONTAINER]:查看容器系统的变更;
  • docker [container] port:查看容器的端口映射情况;
  1. # 返回内容以json形式展示,包括容器Id、创建时间、路径、状态、镜像、配置等各项信息,内容太长,下面不做展示
  2. > docker inspect test
  3. # 查看容器内的进程信息,包括PID、用户、时间、命令等。例如,查看某容器内的进程信息
  4. > docker top test
  5. # 查看容器的系统资源使用统计
  6. > docker stats test
  7. # 查看容器内文件系统的变更,需要有文件修改才有输出
  8. > docker diff test
  9. # 查看容器端口映射情况,需要有端口映射才有输出
  10. > docker port test

image.png

update更新容器配置

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

  1. 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. > docker update --cpu-quota 10000 test

to be continue…