容器是镜像的一个运行实例。
镜像是静态的只读文件,而容器带有运行时需要的可写文件层。

4.1 创建容器

1. 新建容器

  1. docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

选项:
https://docs.docker.com/engine/reference/commandline/create/
选项主要分为以下几类:

  • 与容器运行模式相关
  • 与容器和环境配置相关
  • 与容器资源限制和安全保护相关

使用 docker create 命令新建的容器初始时处于停止状态,可使用 docker start 命令来启动它。

2. 启动容器

  1. docker start [OPTIONS] CONTAINER [CONTAINER...]

选项:

Name, shorthand Default Description
--attach , -a Attach STDOUT/STDERR and forward signals
--checkpoint experimental (daemon)
Restore from this checkpoint
--checkpoint-dir experimental (daemon)
Use a custom checkpoint storage directory
--detach-keys Override the key sequence for detaching a container
--interactive , -i Attach container’s STDIN

可通过 docker ps 命令来查看运行中的容器。

3. 新建并启动容器

  1. docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

等价于 docker create + docker start 。因此其选项也是两者的结合体。
当执行 docker run 时,Docker后台运行的操作包括:

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

例1:启动容器,执行命令,然后关闭容器:

  1. docker run ubuntu /bin/echo 'Hello World'

例2:启动容器,进入交互模式:

  1. docker run -it ubuntu /bin/bash

其中, -i 表示让容器的标准输入保持打开。 -t 表示让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上。
交互模式下,退出容器:按 Ctrl + d 或输入 exit 命令。退出后容器自动处于退出( Exited )状态。

4. 守护态运行

以守护态(Daemonized)运行于后台。添加 -d 参数。
例:

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

守护态运行的容器状态是 up


4.2 终止容器

渐进终止:docker stop

先向容器发送SIGTERM信号,等待一段时间(默认10秒)后,再发送SIGKILL信号。

  1. docker stop [OPTIONS] CONTAINER [CONTAINER...]

选项:

Name, shorthand Default Description
--time , -t 10 Seconds to wait for stop before killing it

直接终止:docker kill

直接向容器发送SIGKILL信号。

  1. docker kill [OPTIONS] CONTAINER [CONTAINER...]

选项:

Name, shorthand Default Description
--signal , -s KILL Signal to send to the container

重启

处于终止(退出)状态的容器,可以通过 docker start 命令来重新启动。
另外, docker restart 命令可作用与运行中的容器,先终止,再启动。


4.3 进入容器

在使用 -d 参数以守护态启动容器时,用户无法看到容器中的信息,也无法进行操作。如果想要进入容器进行操作,有以下方式。

1. attach命令

功能:将本地标准输入、标准输出、标准错误流与一个运行中的容器关联。

  1. docker attach [OPTIONS] CONTAINER

选项:

Name, shorthand Default Description
--detach-keys 指定推出attach模式的快捷键序列。默认是CTRL+p。注意是推出attach模式,不是终止容器。
--no-stdin false 是否不关联标准输入。默认是false。用于一些只读场景。
--sig-proxy true 是否代理所有收到的系统信号给应用进程。

2. exec命令

功能:在容器中执行一条命令。

  1. docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

选项:

Name, shorthand Default Description
--detach , -d Detached mode: run command in the background
--detach-keys Override the key sequence for detaching a container
--env , -e API 1.25+
Set environment variables
--interactive , -i Keep STDIN open even if not attached
--privileged Give extended privileges to the command
--tty , -t Allocate a pseudo-TTY
--user , -u Username or UID (format: [:])
--workdir , -w API 1.35+
Working directory inside the container

例:执行打开终端命令:

  1. docker exec -it my-container /bin/bash

3. nsente工具


4.4 删除容器

  1. docker rm [OPTIONS] CONTAINER [CONTAINER...]

选项:

Name, shorthand Default Description
--force , -f false 强制终止一个运行中的容器 (uses SIGKILL)
--link , -l false 删除容器的连接,但保留容器
--volumes , -v false 删除容器关联的数据卷

4.5 导入和导出容器

某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用Dockerde导入和导出功能。

1. 导出容器

功能:将一个容器(无论容器处于什么状态)导出为一个tar文件。

  1. docker export [OPTIONS] CONTAINER

选项:

Name, shorthand Default Description
--output , -o Write to a file, instead of STDOUT

注意,该命令不会导出容器关联的Volume的内容。https://docs.docker.com/v17.12/engine/reference/commandline/export/#parent-command

2. 导入容器

功能:从一个文件导入一个镜像

  1. docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

选项:

Name, shorthand Default Description
--change , -c Apply Dockerfile instruction to the created image
--message , -m Set commit message for imported image

注意区别 docker save/loaddocker export/import 。前者操作的目标是镜像,后者操作的目标是容器。不过 docker import 通过容器快照导入的依然是镜像,而非直接启动一个容器。