镜像-类– -只读

容器-容器-可写(带有运行时需要的可写文件层)

实例

运行bash应用

运行bash应用,执行打印“Hello World”命令:

$ docker run -it ubuntu:18.04 bash
root@65663247040f:/# echo "Hello World"
Hello World
root@65663247040f:/# exit

容器操作

create-新建容器

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

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

image-20210222202611157

docker create --help

例子

docker create -it ubuntu:latest
$ docker create -it ubuntu:latest
af8f4f922dafee22c8fe6cd2ae11d16e25087d61f1b1fa55b36e94db7ef45178
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af8f4f922daf ubuntu:latest "/bin/bash" 17 seconds ago Created silly_euler

选项-列表-全

  • --add-host list: Add a custom host-to-IP mapping (host:ip) 添加自定义主机到IP的映射

    在容器内添加一个主机名到IP地址的映射关系(通过/etc/hosts文件)

  • -a, --attach list

    --attach=[]

    Attach to STDIN, STDOUT or STDERR

    是否绑定到标准输入、输出和错误

  • --blkio-weight uint16: Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0) 块IO(相对权重),介于10到1000之间,或者为0禁用(默认为0)

    容器读写块设备的I/O性能权重,默认为0

  • --blkio-weight-device list: Block IO weight (relative device weight) (default []) 块IO权重(相对设备权重)(默认为[])

    指定各个块设备的I/O性能权重

  • --cap-add list: Add Linux capabilities

    增加容器的 Linux指定安全能力

  • --cap-drop list: Drop Linux capabilities

    移除容器的 Linux指定安全能力

  • --cgroup-parent string: Optional parent cgroup for the container 容器的可选父cgroup

    容器 groups限制的创建路径

  • --cgroupns string: Cgroup namespace to use (host|private) 要使用的Cgroup命名空间(host|private)
    • 'host':
      Run the container in the Docker host’s cgroup namespace 在Docker主机的cgroup命名空间中运行容器
    • 'private': Run the container in its own private cgroup namespace 在自己的私有cgroup命名空间中运行容器
    • '':
      Use the cgroup namespace as configured by the default-cgroupns-mode option on the daemon (default) 使用守护程序上default-cgroupns-mode选项配置的cgroup命名空间(默认)
  • --cidfile string: Write the container ID to the file 将容器ID写入文件

    指定容器的进程ID号写到文件

  • --cpu-period int: Limit CPU CFS (Completely Fair Scheduler) period Limit CPU CFS(完全公平的调度程序)period

    限制容器在CFS调度器下的CPU占用时间片

  • --cpu-quota int: Limit CPU CFS (Completely Fair Scheduler) quota Limit CPU CFS(完全公平的调度程序)配额

    限制容器在CFS调度器下的CPU配额

  • --cpu-rt-period int: Limit CPU real-time period in microseconds 限制CPU实时时间(以微秒为单位)

  • --cpu-rt-runtime int: Limit CPU real-time runtime in microseconds 限制CPU实时运行时间(以微秒为单位)

  • -c, --cpu-shares int: CPU shares (relative weight) CPU份额(相对重量)

    允许容器使用CPU资源的相对权重,默认一个容器能用满一个核的CPU

  • --cpus decimal: Number of CPUs CPU数量

  • --cpuset-cpus string: CPUs in which to allow execution (0-3, 0,1) 允许执行的CPU(0-3,0,1)

    限制容器能使用哪些CPU核心

  • --cpuset-mems string: MEMs in which to allow execution (0-3, 0,1) 允许执行的MEM(0-3,0,1)

    NUMA架构下使用哪些核心的内存??

  • --device list: Add a host device to the container 将主机设备添加到容器

    映射物理机上的设备到容器内

  • --device-cgroup-rule list: Add a rule to the cgroup allowed devices list 将规则添加到cgroup允许的设备列表中

  • --device-read-bps list: Limit read rate (bytes per second) from a device (default []) 限制从设备读取的速率(每秒字节数)(默认为[])

    挂载设备的读吞吐率(以bps为单位)限制

  • --device-read-iops list: Limit read rate (IO per second) from a device (default []) 限制从设备读取的速率(每秒IO)(默认[])

    挂载设备的读速率(以每秒i/o次数为单位)限制

  • --device-write-bps list: Limit write rate (bytes per second) to a device (default []) 将写入速率(每秒的字节数)限制为设备(默认为[])

    挂载设备的写吞吐率(以bps为单位)限制

  • --device-write-iops list: Limit write rate (IO per second) to a device (default []) 将写入速率(每秒的IO)限制为设备(默认为[])

    挂载设备的写速率(以每秒i/o次数为单位)限制

  • --disable-content-trust: Skip image verification (default true) 跳过容器验证(默认为true)

  • --dns list: Set custom DNS servers 设置自定义DNS服务器

    自定义的DNS服务器

  • --dns-option list: Set DNS options 设定DNS选项

    自定义的DNS选项

  • --dns-search list: Set custom DNS search domains 设置自定义DNS搜索域

    DNS搜索域

  • --domainname string: Container NIS domain name 容器NIS域名

  • --entrypoint string: Overwrite the default ENTRYPOINT of the image 覆盖容器的默认ENTRYPOINT

    镜像存在入口命令时,覆盖为新的命令

  • -e, --env list: Set environment variables 设置环境变量

    指定容器内环境变量

  • --env-file list: Read in a file of environment variables 读入环境变量文件

    从文件中读取环境变量到容器内

  • --expose list: Expose a port or a range of ports 公开一个或多个端口

    指定容器会暴露出来的端口或端口范围

  • --gpus gpu-request: GPU devices to add to the container (‘all’ to pass all GPUs) 要添加到容器中的GPU设备('all'指定所有GPU)

  • --group-add list: Add additional groups to join 添加其他群组加入

    运行容器的用户组

  • --health-cmd string: Command to run to check health 运行命令以检查运行状况

    指定检查容器健康状态的命令

  • --health-interval duration: Time between running the check (ms|s|m|h) (default 0s) 运行检查之间的时间间隔(ms | s | m | h)(默认为0s)

    执行健康检查的间隔时间,单位可以为ms、s、m或h

  • --health-retries int: Consecutive failures needed to report unhealthy 需要报告不健康的连续失败数

    健康检查失败重试次数,超过则认为不健康

  • --health-start-period duration: Start period for the container to initialize before starting health-retries countdown (ms|s|m|h) (default 0s) 开始运行状况重试倒计时之前,容器初始化的开始时间(毫秒|秒|米|小时)(默认为0秒)

    容器启动后进行健康检查的等待时间,单位可以为ms、s、m或h

  • --health-timeout duration: Maximum time to allow one check to run (ms|s|m|h) (default 0s) 允许执行一次检查的最大时间(ms | s | m | h)(默认为0s)

    健康检查的执行超时,单位可以为ms、s、m或h

  • --help: Print usage

  • -h, --hostname string: Container host name 容器主机名

    指定容器内的主机名

  • --init: Run an init inside the container that forwards signals and reaps processes 在容器内运行一个初始化程序,以转发信号并获取进程

    在容器中执行一个init进程,来负责响应信号和处理僵尸状态子进程

  • -i, --interactive: Keep STDIN open even if not attached 即使未被连接STDIN也保持打开状态

    保持标准输入打开,默认为false

  • --ip string: IPv4 address (e.g., 172.30.100.104) IPv4地址

    指定容器的IPv4地址

  • --ip6 string: IPv6 address (e.g., 2001:db8::33) IPv6地址

    指定容器的IPv6地址

  • --ipc string: IPC mode to use 使用的IPC模式

    容器IPC命名空间,可以为其他容器或主机

  • --isolation string: Container isolation technology 容器隔离技术

    容器使用的隔离机制,如”default”

  • --kernel-memory bytes: Kernel memory limit 内核内存限制

    限制容器使用内核的内存大小,单位可以是b、k、m或g

  • -l, --label list: Set meta data on a container 在容器上设置元数据

    以键值对方式指定容器的标签信息;

  • --label-file list: Read in a line delimited file of labels 读入行分隔的标签文件

    从文件中读取标签信息

  • --link list: Add link to another container 将链接添加到另一个容器

    链接到其他容器(name or id)

  • --link-local-ip list: Container IPv4/IPv6 link-local addresses 容器IPv4 / IPv6链接本地地址

    容器的本地链接地址列表

  • --log-driver string: Logging driver for the container 容器的日志记录驱动程序

    指定容器的日志驱动类型,可以为json-file、syslog、journald、 gelf、fluentd、awslogs、splunk、etwlogs、gcplogs或 none

  • --log-opt list: Log driver options 日志驱动程序选项

    传递给日志驱动的选项

  • --mac-address string: Container MAC address (e.g., 92:d0:c6:0a:29:33) 容器MAC地址

    指定容器的Mac地址

  • -m, --memory bytes: Memory limit 内存限制

    限制容器内应用使用的内存,单位可以是b、k、m或g

  • --memory-reservation bytes: Memory soft limit 内存软限制

    当系统中内存过低时,容器会被强制限制内存到给定值,默认情况下等于内存限制值

  • --memory-swap bytes: Swap limit equal to memory plus swap: ‘-1’ to enable unlimited swap 交换限制等于内存加交换:“-1”以启用无限交换

    限制容器使用内存和交换区的总大小

  • --memory-swappiness int: Tune container memory swappiness (0 to 100) (default -1) 调优容器内存交换(0到100)(默认-1)

    调整容器的内存交换区参数

  • --mount mount: Attach a filesystem mount to the container 将文件系统挂载附加到容器

  • --name string: Assign a name to the container 为容器分配一个名称

    指定容器的别名

  • --network network: Connect a container to a network 将容器连接到网络

    指定容器网络模式,包括bridge、none、其他容器内网络、host的网络或某个现有网络等

  • --network-alias list

    Add network-scoped alias for the container 为容器添加网络范围的别名

  • --no-healthcheck: Disable any container-specified HEALTHCHECK 禁用任何容器指定的健康检查

    是否禁用健康检查

  • --oom-kill-disable: Disable OOM Killer 禁用OOM Killer

    内存耗尽时是否杀死容器

  • --oom-score-adj int: Tune host’s OOM preferences (-1000 to 1000) Tune host’s OOM 首选项(-1000至1000)

    调整容器的内存耗尽参数

  • --pid string: PID namespace to use 使用的PID名称空间

    容器的PID命名空间

  • --pids-limit int: Tune container pids limit (set -1 for unlimited) Tune容器pids限制(将-1设置为无限制)

    限制容器的pid个数

  • --platform string: Set platform if server is multi-platform capable 如果服务器支持多平台,则设置平台

  • --privileged: Give extended privileges to this container 赋予此容器扩展的特权

    💫是否给容器高权限,这意味着容器内应用将不受权限的限制.一般不推荐

  • -p, --publish list: Publish a container’s port(s) to the host 将容器的端口发布到主机

    指定如何映射到本地主机端口,例如-p 11234-12234:1234-2234

  • -P, --publish-all: Publish all exposed ports to random ports 将所有公开的端口发布到随机端口

    通过NAT机制将容器标记暴露的端口自动映射到本地主机的临时端口

  • --pull string: Pull image before creating (“always”|”missing”|”never”) (default “missing”) 创建前拉取镜像

  • --read-only: Mount the container’s root filesystem as read only 将容器的根文件系统挂载为只读

    是否让容器内的文件系统只读

  • --restart string: Restart policy to apply when a container exits (default “no”) 容器退出时重新启动策略以应用(默认为“否”)

    容器的重启策略,包括no、on-failure [:max-retry]、always、 unless-stopped 等

  • --rm: Automatically remove the container when it exits 退出时自动删除容器

    容器退出后是否自动删除,不能跟-d同时使用

  • --runtime string: Runtime to use for this container 用于此容器的运行时

  • --security-opt list: Security Options 安全选项

    指定一些安全参数,包括权限、安全能力、 apparmor等

  • --shm-size bytes: Size of /dev/shm

    dev/shm的大小

  • --stop-signal string: Signal to stop a container (default “SIGTERM”) 停止容器的信号

    指定停止容器的系统信号

  • --stop-timeout int: Timeout (in seconds) to stop a container 停止容器的超时时间(以秒为单位)

  • --storage-opt list: Storage driver options for the container 容器的存储驱动程序选项

  • --sysctl map: Sysctl options (default map[]) Sysctl选项(默认映射[])

  • --tmpfs list: Mount a tmpfs directory 挂载tmpfs目录

    挂载临时文件系统到容器

  • -t, --tty: Allocate a pseudo-TTY 分配伪TTY

    是否分配一个伪终端,默认为false

  • --ulimit ulimit: Ulimit options (default []) Ulimit选项(默认[])

    通过ulimit来限制最大文件数、最大进程数等

  • -u, --user string: Username or UID (format: <name|uid>[:<group|gid>]) 用户名或UID

    指定在容器内执行命令的用户信息

  • --userns string: User namespace to use 要使用的用户名称空间

    指定用户命名空间

  • 启用userns-remap时配置用户命名空间的模式

  • --uts string: UTS namespace to use 使用的UTS名称空间

    容器的UTS命名空间

  • -v, --volume list

    --volume [=[[HOST-DIR:]CONTAINER-DIR[:OPTIONS]]]

    Bind mount a volume 绑定挂载卷

  • --volume-driver string: Optional volume driver for the container 容器的可选卷驱动器

    挂载文件卷的驱动类型

  • --volumes-from list: Mount volumes from the specified container(s) 从指定的容器挂载卷

  • -w, --workdir string: Working directory inside the container 容器内的默认工作目录

其他地方查到的

  • --sig-proxy=true|false

    是否代理收到的信号给应用,默认为true,不能代理 SIGCHLD、SIGSTOP和 SIGKILL信号

    是否代理收到的系统信号给应用进程,默认为true。

选项-表格-分类

运行模式相关

create命令与容器运行模式相关的选项

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

环境和配置相关

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

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

资源限制和安全保护相关

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

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

start-启动容器

可以使用docker [container] start命令来启动处于停止状态的容器:

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

image-20210222210317655

docker start --help

例子:启动刚创建的ubuntu容器af:

$ docker start af
af

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

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af8f4f922daf ubuntu:latest "/bin/bash" 2 minutes ago Up 7 seconds silly_euler

选项

  • -a, --attach: Attach STDOUT/STDERR and forward signals

  • --detach-keys string: Override the key sequence for detaching a container

    从attach模式退出的快捷键

  • -i, --interactive: Attach container’s STDIN

run-新建并启动容器

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

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

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

参数和create一致,直接看上面部分即可。

docker run --help

例子:输出一个“HelloWorld”,之后容器自动终止:

docker run busybox:latest /bin/echo 'Hello world'

image-20210222231659785

run暗地里的操作

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

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

-it 交互

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

$ docker run -it busybox
root@af8bae53bdd3:/#
# 或
$ docker run -it busybox:latest /bin/sh
root@af8bae53bdd3:/#
# 可以根据之前镜像知识得到
virhuiaivirhuiai@virhuiaideMBP RamDisk % docker inspect busybox:latest -f .ContainerConfig.Cmd
[/bin/sh -c #(nop)  CMD ["sh"]]
virhuiaivirhuiai@virhuiaideMBP RamDisk % docker inspect busybox:latest -f .Config.Cmd 
[sh]

image-20210222232402960

image-20210222232341348

其中:

  • -t选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
  • -i则让容器的标准输入保持打开。

退出的错误代码

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

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

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

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

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

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

-d 守护态运行

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

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

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

image-20210222233049956

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

image-20210222233059791

logs=查看容器输出信息

docker container logs --help

image-20210222235853770

例子:查看某容器的输出:

先运行一个不断输出hello world的容器

$docker run --name dtest -d busybox  /bin/sh -c "while true; do echo hello world; sleep 1; done"

再用logs命令查看

$ docker logs dtest
hello world
. . .

效果如图:

image-20210222235750489

logs选项

  • --details: Show extra details provided to logs 打印详细信息;
  • -f, --follow: Follow log output 持续保持输出;
  • --since string: Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes) 输出从某个时间开始的日志;
  • -n, --tail string: Number of lines to show from the end of the logs (default “all”) 输出最近的若干日志;
  • -t, --timestamps: Show timestamps 显示时间戳信息;
  • --until string: Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes) 输出某个时间之前的日志。

停止容器

pause-暂停容器

docker run --name test --rm -it ubuntu bash
docker pause test
docker ps
$ docker run --name test --rm -it ubuntu bash
$ docker pause test
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
893c811cf845 ubuntu "bash" 2 seconds ago Up 12 seconds (Paused) test

unpause-恢复暂停容器

处于paused状态的容器,可以使用docker [container]unpause CONTAINER [CONTAINER…]命令来恢复到运行状态。

stop终止容器,变为停止状态

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

$ docker stop ce5
ce5

当Docker容器中指定的应用终结时,容器也会自动终止。

例如,只启动了一个终端的容器,用户通过exit命令或Ctrl+d来退出终端时,所创建的容器立刻终止,处于stopped状态。

处于终止状态的容器,可以通过docker [container] start命令来重新启动,这个看前面的介绍:start-启动容器。

restart重启容器

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

$ docker restart ce554267d7a4
ce554267d7a4
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce554267d7a4  ubuntu:latest  "/bin/sh  -c  'while  t     5  minutes  ago  Up  14  seconds
determined_pike

prune清除掉所有处于停止状态的容器

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

prune - 必应词典
美[prun]英[pruːn]
v.精简;修剪(树木的枝叶);修枝;删去
n.【食】梅干;西梅脯
网络李子;剪除;剪枝

kill强行终止容器

可以通过docker [container] kill直接发送SIGKILL信号来强行终止容器。

进入容器

exec -it命令,推荐

可以在运行中容器内直接执行任意命令

比较重要的参数有:

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

例如

$ docker exec -it 243c32535da7   /bin/bash
root@243c32535da7:/#

可以看到会打开一个新的bash终端,在不影响容器内其他应用的前提下,用户可以与容器进行交互。注意通过指定-it参数来保持标准输入打开,并且分配一个伪终端。通过exec命令对容器执行操作是最为推荐的方式。

attach命令-不推荐

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

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

缺点:

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

rm删除容器

docker [container] rm

主要支持的选项包括:

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

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

$ docker ps -a
CONTAINER ID     IMAGE        COMMAND        CREATED        STATUS        PORTS        NAMES
ce554267d7a4      ubuntu:latest     "/bin/sh -c 'while t     3 minutes agoExited (-1)
13 seconds ago                    determined_pike
d58050081fe3     ubuntu:latest     "/bin/bash"                About an hour ago
Exited (0)   About an hour ago berserk_brattain
e812617b41f6     ubuntu:latest     "echo 'hello! I am h     2 hours ago   Exited (0)
3 minutes ago

$ docker rm ce554267d7a4
ce554267d7a4

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

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

导出容器

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

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

其中,可以通过-o选项来指定导出的tar文件名,也可以直接通过重定向来实现。

首先,查看所有的容器,如下所示:

$ docker ps -a
CONTAINER ID        IMAGE        COMMAND        CREATED        STATUS      PORTS      NAMES
ce554267d7a4     ubuntu:latest     "/bin/sh -c 'while t"    3 minutes ago
Exited (-1) 13 seconds ago     determined_pike
d58050081fe3     ubuntu:latest     "/bin/bash"                About an hour ago
Exited (0) About an hour ago     berserk_brattain
e812617b41f6     ubuntu:latest     "echo 'hello! I am h"    2 hours ago
Exited (0) 3 minutes ago      silly_leakey

分别导出ce554267d7a4容器和e812617b41f6容器到文件test_for_run.tar文件和test_for_stop.tar文件:

$ docker export -o test_for_run.tar ce5
$ ls
test_for_run.tar
$ docker export e81 >test_for_stop.tar
$ ls
test_for_run.tar test_for_stop.tar

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

导入容器

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

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

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

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

$ docker import test_for_run.tar - test/ubuntu:v1.0
$ docker images
REPOSITORY         TAG         IMAGE ID          CREATED                  VIRTUAL SIZE
test/ubuntu        v1.0        9d37a6082e97      About a minute ago       171.3 MB

导入镜像和导入容器的区别

导入镜像文件命令docker load,与docker [container] import命令十分类似。

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

与导入 镜像的load命令对比 - 容器快照文件仅保存容器当时的快照状 - 镜像存储文件将保存完整记录,体积更大 - 此外,从容器快照文件导入时可以重新指定标签等元数据信息

查看容器详情

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

例如,查看某容器的具体信息,会以json格式返回包括容器Id、创建时间、路径、状态、镜像、配置等在内的各项信息:

$ docker container inspect test
[
{
"Id": "2d4be6a584ec23e2a0b3eabb8909fd51960c11031df09513c6ba863c919bf2e8",
"Created": "2018-02-21T05:04:17.089267701Z",
"Path": "/portainer",
"Args": [],
"State": {
        "Status": "running",
        ...
}
]

top查看容器内进程

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

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

$ docker top test
PID                     USER                     TIME                    COMMAND
5730                    0                        0:00                    /portainer

stats查看统计信息

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

支持选项包括:

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

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

CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
2d4be6a584ec test 0.00% 3.164MiB / 1.952GiB    0.16% 2.37kB / 0B 0B / 65.5kB 4

复制文件

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

docker [container] cp [OPTIONS]  CONTAINER:SRC_PATHDEST_PATH|

支持的选项包括:

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

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

docker [container] cp data test:/tmp/

查看变更

container diff查看容器内文件系统的变更。命令格式为

docker[container] diff CONTAINER

例如,查看test容器内的数据修改:

$ docker container diff test
C /root
A /root/.bash_history
C /tmp
A /tmp/Dockerfile
A /tmp/etcd-test

查看端口映射

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

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

更新配置

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

支持的选项包括:

  • -blkio-weight uint16:更新块IO限制,10~1000,默认值为0,代表着无限制;
  • -cpu-period int:限制CPU调度器CFS(CompletelyFair 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