容器管理

总体说明

当前docker支持的子命令,按照功能划分为以下几组:

功能划分

命令

命令功能

主机环境相关

version

查看docker版本信息

info

查看docker系统和主机环境信息

容器相关

容器生命周期管理

create

由image创建一个容器

run

由image创建一个容器并运行

start

开始一个已停止运行的容器

stop

停止一个运行中的容器

restart

重启一个容器

wait

等待一个容器停止,并打印出退出码

rm

删除一个容器

容器内进程管理

pause

暂停一个容器内的所有进程

unpause

恢复一个容器内被暂停的所用进程

top

查看容器内的进程

exec

在容器内执行进程

容器检视工具

ps

查看运行中的容器(不加任何选项)

logs

显示一个容器的日志信息

attach

连接到一个容器的标准输入输出

inspect

返回容器的底层信息

port

列出容器与主机的端口映射

diff

返回容器相对于镜像中的rootfs所作的改动

cp

容器与主机之间复制文件

export

将一个容器中的文件系统导出为一个tar包

stats

实时查看容器的资源占用情况

images相关

生成一个新image

build

通过一个Dockerfile构建一个image

commit

基于容器的rootfs创建一个新的image

import

将tar包中的内容作为文件系统创建一个image

load

从一个tar包中加载一个image

与image仓库有关

login

登录一个registry

logout

登出一个registry

pull

从registry中拉取一个image

push

将一个image推送到registry中

search

在registry中搜寻image

与image管理有关

images

显示系统中的image

history

显示一个image的变化历史

rmi

删除image

tag

给image打标签

save

将一个image保存到一个tar包中

其他

events

从docker daemon中获取实时事件

rename

重命名容器

其中有些子命令还有一些参数选项如docker run,通过docker COMMAND —help可以查看相应COMMAND命令的帮助,命令选项参考上文的命令选项约定。下面详细介绍每个命令的使用。

attach

用法:docker attach [OPTIONS] CONTAINER

功能:附加到一个运行着的容器

选项:

--no-stdin=false 不附加STDIN

--sig-proxy=true 代理所有到容器内部的信号,不代理SIGCHLD, SIGKILL, SIGSTOP

示例:

  1. $ sudo docker attach attach_test
  2. root@2988b8658669:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

commit

用法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

功能:由一个容器创建一个新的image

选项:

-a, --author=”” 指定作者

-m, --message=”” 提交的信息

-p, --pause=true 在提交过程中暂停容器

示例:

运行一个容器,然后将这个容器提交成一个新的image

  1. $ sudo docker commit test busybox:test
  2. sha256:be4672959e8bd8a4291fbdd9e99be932912fe80b062fba3c9b16ee83720c33e1
  3. $ sudo docker images
  4. REPOSITORY TAG IMAGE ID CREATED SIZE
  5. busybox latest e02e811dd08f 2 years ago 1.09MB

cp

用法:docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

功能:从指定的容器内的一个路径复制文件或文件夹到主机的指定路径中,或者把主机的文件或者文件夹拷贝到容器内。

注意:docker cp不支持容器内/proc,/sys,/dev,/tmp等虚拟文件系统以及用户在容器内自行挂载的文件系统内的文件拷贝。

选项:

-a, --archive 将拷贝到容器的文件属主设置为容器运行用户(--user)

-L, --follow-link 解析并跟踪文件的符号链接

示例:

复制reigistry容器中/test目录到主机的/home/aaa目录中

  1. $ sudo docker cp registry:/test /home/aaa

create

用法:docker create [OPTIONS] IMAGE [COMMAND] [ARG…]

功能:使用image创建一个新的容器,并将返回一个容器的ID,创建之后的容器用docker start命令启动,OPTIONS用于创建容器时对容器进行配置,有些选项将覆盖image中对容器的配置,COMMAND指定容器启动时执行的命令。

选项:

表 2 参数说明

参数

参数含义

-a —attach=[]

使控制台Attach到容器内进程的STDIN,STDOUT,STDERR

—name=””

指定容器的名字

—add-host=[host:ip]

在容器内的/etc/hosts中添加一个hostname到IP地址的映射

e.g. —add-host=test:10.10.10.10

—annotation

设置容器的annotations。例如支持native.umask选项:

  1. annotation native.umask=normal 启动的容器umask值为0022
  2. annotation native.umask=secure # 启动的容器umask值为0027

注意如果没有配置该参数,则使用dockerd中的umask配置。

—blkio-weight

blockio的相对权重,从10到1000

—blkio-weight-device=[]

blockio权重(设置相对权重)

-c, —cpu-shares=0

容器获得主机CPU的相对权重,通过设置这个选项获得更高的优先级,默认所有的容器都是获得相同的CPU优先权。

—cap-add=[]

添加Linux权能

—cap-drop=[]

清除Linux权能

—cgroup-parent

为容器设置cgroup父目录

—cidfile=””

将容器的ID写到指定的文件中

e.g. —cidfile=/home/cidfile-test 将该容器的ID写入到/home/cidfile-test中

—cpu-period

设置CFS(完全公平调度策略)进程的CPU周期。

默认值为100ms;一般—cpu-period参数和—cpu-quota是配合使用的,比如—cpu-period=50000 —cpu-quota=25000,意味着如果有1个CPU,该容器可以每50ms获取到50%的CPU。

使用—cpus=0.5也可达到同样的效果

—cpu-quota

设置CFS(完全公平调度策略)进程的CPU配额,默认为0,即没有限制

—cpuset-cpus

设置容器中进程允许运行的CPU (0-3, 0,1)。默认没有限制

—cpuset-mems

设置容器中进程运行运行的内存内存节点 (0-3, 0,1),只对NUMA系统起作用

—device=[]

将主机的设备添加到容器中 (e.g. —device=/dev/sdc:/dev/xvdc:rwm)

—dns=[]

强制容器使用指定的dns服务器(e.g. 创建容器时指定—dns=114.114.xxx.xxx,将在容器的/etc/resolv.conf中写入nameserver 114.114.xxx.xxx并将覆盖原来的内容)

—dns-opt=[]

设置DNS选项

—dns-search=[]

强制容器使用指定的dns搜索域名

-e, —env=[]

设置容器的环境变量

—env=[KERNEL_MODULES=]:

在容器中插入指定模块。目前仅支持Host主机上有的模块,且容器删除后Host主机上模块仍然驻留,且容器需要同时指定—hook-spec选项。以下都是参数的合法格式:

KERNEL_MODULERS=

KERNEL_MODULERS=a

KERNEL_MODULERS=a,b

KERNEL_MODULERS=a,b,

—entrypoint=””

覆盖image中原有的entrypoint,entrypoint设置容器启动时执行的命令

—env-file=[]

从一个文件中读取环境变量,多个环境变量在文件中按行分割(e.g. —env-file=/home/test/env,其中env文件中存放了多个环境变量)

—expose=[]

开放一个容器内部的端口,使用下文介绍的-P选项将会使开放的端口映射到主机的一个端口。

—group-add=[]

指定容器添加到额外的组

-h, —hostname=””

设置容器主机名

—health-cmd

设置容器健康检查执行的命令

—health-interval

相邻两次命令执行的间隔时间,默认 30s

—health-timeout

单次检查命令执行的时间上限,超时则任务命令执行失败,默认30s

—health-start-period

容器启动距离第一次执行健康检查开始的时间,默认0s

—health-retries

健康检查失败最大的重试次数,默认3

—health-exit-on-unhealthy

容器被检查为非健康后停止容器,默认false

—host-channel=[]

设置一个通道供容器内进程与主机进行通信,格式:<host path>:<container path>:<rw/ro>:<size limit>

-i, —interactive=false

设置STDIN打开即使没有attached

—ip

设置容器的IPv4地址

—ip6

设置容器的IPv6地址

—ipc

指定容器的ipc命名空间

—isolation

指定容器隔离策略

-l, —label=[]

设置容器的标签

—label-file=[]

从文件中获取标签

—link=[]

链接到其他容器,这个选项将在容器中添加一些被链接容器IP地址和端口的环境变量及在/etc/hosts中添加一条映射(e.g. —link=name:alias)

—log-driver

设置容器的日志驱动

—log-opt=[]

设置日志驱动选项

-m, —memory=””

设置容器的内存限制,格式<number><optional unit>, 其中 unit = b, k, m or g。该参数最小值为4m。

—mac-address

设置容器的mac地址 (e.g. 92:d0:c6:0a:xx:xx)

—memory-reservation

设置容器内存限制,默认与—memory一致。可认为—memory是硬限制,—memory-reservation是软限制;当使用内存超过预设值时,会动态调整(系统回收内存时尝试将使用内存降低到预设值以下),但不确保一定不超过预设值。一般可以和—memory一起使用,数值小于—memory的预设值。

—memory-swap

设置普通内存和交换分区的使用总量,-1为不做限制。如果不设置,则为—memory值的2倍,即SWAP可再使用与—memory相同的内存量。

—memory-swappiness=-1

设置容器使用交换内存的时机,以剩余内存百分比为度量(0-100)

—net=”bridge”

设置容器的网络模式,当前1.3.0版本的docker有四个模式:bridge、host、none、container:<name|id>。默认使用的是bridge。

  • bridge:使用桥接模式在docker daemon启动时使用的网桥上创建一个网络栈。
  • host:在容器内使用主机的网络栈
  • none:不使用网络
  • container:<name|id>:重复利用另外一个容器的网络栈

—no-healthcheck

设置容器不使用健康检查

—oom-kill-disable

禁用OOM killer,建议如果不设置-m参数,也不要设置此参数。

—oom-score-adj

调整容器的oom规则(-1000到1000)

-P, —publish-all=false

将容器开放的所有端口一一映射到主机的端口,通过主机的端口可以访问容器内部,通过下文介绍的docker port命令可以查看具体容器端口和主机端口具体的映射关系。

-p, —publish=[]

将容器内的一个端口映射到主机的一个端口,format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort,如果没有指定IP代表侦听主机所有网卡的访问,如果没有指定hostPort,表示自动分配主机的端口。

—pid

设置容器的PID命名空间

—privileged=false

给予容器额外的权限,当使用了—privileged选项,容器将可以访问主机的所有设备。

—restart=””

设置容器退出时候的重启规则,当前1.3.1版本支持3个规则:

  • no:当容器停止时,不重启。
  • on-failure:当容器退出码为非0时重启容器,这个规则可以附加最大重启次数,如on-failure:5,最多重启5次。
  • always:无论退出码是什么都退出。

—read-only

将容器的根文件系统以只读的形式挂载

—security-opt=[]

容器安全规则

—shm-size

/dev/shm设备的大小,默认值是64M

—stop-signal=SIGTERM

容器停止信号,默认为SIGTERM

-t, —tty=false

分配一个伪终端

—tmpfs=[]

挂载tmpfs目录

-u, —user=””

指定用户名或者用户ID

—ulimit=[]

ulimit选项

—userns

指定容器的user命名空间

-v, —volume=[]

将主机的一个目录挂载到容器内部,或者在容器中创建一个新卷(e.g. -v /home/test:/home将主机的/home/test目录挂载到容器的/home目录下,-v /tmp 在容器中的根目录下创建tmp文件夹,该文件夹可以被其他容器用—volumes-from选项共享 )。不支持将主机目录挂载到容器/proc子目录,否则启动容器会报错。

—volume-driver

设置容器的数据卷驱动,可选。

—volumes-from=[]

将另外一个容器的卷挂载到本容器中,实现卷的共享(e.g. -volumes-from container_name将container_name中的卷挂载到这个容器中 )。-v和—volumes-from=[]是两个非常重要的选项用于数据的备份和热迁移。

-w, —workdir=””

指定容器的工作目录,进入容器时的目录

示例:

创建了一个名为busybox的容器,创建之后的容器用docker start命令启动。

  1. $ sudo docker create -ti --name=busybox busybox /bin/bash

diff

用法:docker diff CONTAINER

功能:检视容器的差异,相比于容器刚创建时做了哪些改变

选项:无

示例:

  1. $ sudo docker diff registry
  2. C /root
  3. A /root/.bash_history
  4. A /test

exec

接口原型

  1. rpc Exec(ExecRequest) returns (ExecResponse) {}

接口描述

在容器中执行命令,采用的gRPC通讯方式从CRI服务端获取url,再通过获得的url与websocket服务端建立长连接,实现与容器的交互。

注意事项

执行执行一条单独的命令,也能打开终端与容器交互。stdin/stdout/stderr之一必须是真的。如果tty为真,stderr必须是假的。 不支持多路复用, 在这种情况下, stdout和stderr的输出将合并为单流。

参数

参数成员

描述

string container_id

容器ID

repeated string cmd

待执行的命令

bool tty

是否在TTY中执行命令

bool stdin

是否流式标准输入

bool stdout

是否流式标准输出

bool stderr

是否流式输出标准错误

返回值

返回值

描述

string url

exec流服务器的完全限定URL

export

用法:docker export CONTAINER

功能:将一个容器的文件系统内容以tar包导出到STDOUT

选项:无

示例:

将名为busybox的容器的内容导出到busybox.tar包中:

  1. $ sudo docker export busybox > busybox.tar
  2. $ ls
  3. busybox.tar

inspect

用法:docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE…]

功能:返回一个容器或者镜像的底层信息

选项:

-f, --format=”” 按照给定的格式输出信息

-s, --size 若查询类型为容器,显示该容器的总体文件大小

--type 返回指定类型的JSON格式

-t, --time=120 超时时间的秒数,若在该时间内docker inspect未执行成功,则停止等待并立即报错。默认为120秒。

示例:

  1. 返回一个容器的信息

    1. $ sudo docker inspect busybox_test
    2. [
    3. {
    4. "Id": "9fbb8649d5a8b6ae106bb0ac7686c40b3cbd67ec2fd1ab03e0c419a70d755577",
    5. "Created": "2019-08-28T07:43:51.27745746Z",
    6. "Path": "bash",
    7. "Args": [],
    8. "State": {
    9. "Status": "running",
    10. "Running": true,
    11. "Paused": false,
    12. "Restarting": false,
    13. "OOMKilled": false,
    14. "Dead": false,
    15. "Pid": 64177,
    16. "ExitCode": 0,
    17. "Error": "",
    18. "StartedAt": "2019-08-28T07:43:53.021226383Z",
    19. "FinishedAt": "0001-01-01T00:00:00Z"
    20. },
    21. ......
  1. 按照给定格式返回一个容器的指定信息,下面的例子返回busybox_test容器IP地址

    1. $ sudo docker inspect -f {{.NetworkSettings.IPAddress}} busybox_test
    2. 172.17.0.91

logs

用法:docker logs [OPTIONS] CONTAINER

功能:抓取容器内的日志信息,容器可以使运行状态的也可以是停止状态的

选项:

-f, --follow=false 实时打印日志信息

-t, --timestamps=false 显示日志的时间戳

--since 显示指定时间之后的日志

--tail=”all” 设置显示的行数,默认显示所有

示例:

  1. 查看jaegertracing容器的日志信息,该容器上跑了一个jaegertracing服务

    1. $ sudo docker logs jaegertracing
    2. {"level":"info","ts":1566979103.3696961,"caller":"healthcheck/handler.go:99","msg":"Health Check server started","http-port":14269,"status":"unavailable"}
    3. {"level":"info","ts":1566979103.3820567,"caller":"memory/factory.go:55","msg":"Memory storage configuration","configuration":{"MaxTraces":0}}
    4. {"level":"info","ts":1566979103.390773,"caller":"tchannel/builder.go:94","msg":"Enabling service discovery","service":"jaeger-collector"}
    5. {"level":"info","ts":1566979103.3908608,"caller":"peerlistmgr/peer_list_mgr.go:111","msg":"Registering active peer","peer":"127.0.0.1:14267"}
    6. {"level":"info","ts":1566979103.3922884,"caller":"all-in-one/main.go:186","msg":"Starting agent"}
    7. {"level":"info","ts":1566979103.4047635,"caller":"all-in-one/main.go:226","msg":"Starting jaeger-collector TChannel server","port":14267}
    8. {"level":"info","ts":1566979103.404901,"caller":"all-in-one/main.go:236","msg":"Starting jaeger-collector HTTP server","http-port":14268}
    9. {"level":"info","ts":1566979103.4577134,"caller":"all-in-one/main.go:256","msg":"Listening for Zipkin HTTP traffic","zipkin.http-port":9411}
  1. 加上-f选项,实时打印jaegertracing容器的日志信息

    1. $ sudo docker logs -f jaegertracing
    2. {"level":"info","ts":1566979103.3696961,"caller":"healthcheck/handler.go:99","msg":"Health Check server started","http-port":14269,"status":"unavailable"}
    3. {"level":"info","ts":1566979103.3820567,"caller":"memory/factory.go:55","msg":"Memory storage configuration","configuration":{"MaxTraces":0}}
    4. {"level":"info","ts":1566979103.390773,"caller":"tchannel/builder.go:94","msg":"Enabling service discovery","service":"jaeger-collector"}
    5. {"level":"info","ts":1566979103.3908608,"caller":"peerlistmgr/peer_list_mgr.go:111","msg":"Registering active peer","peer":"127.0.0.1:14267"}
    6. {"level":"info","ts":1566979103.3922884,"caller":"all-in-one/main.go:186","msg":"Starting agent"}

pause-unpause

用法:docker pause CONTAINER

docker unpause CONTAINER

功能:这两个命令是配对使用的,docker pause暂停容器内的所有进程,docker unpause恢复暂停的进程

选项:无

示例:

本示例将演示一个跑了docker registry(docker镜像服务)服务的容器,当使用docker pause 命令暂停这个容器的进程后,使用curl命令访问该registry服务将阻塞,使用docker unpause命令将恢复registry服务,可以用curl命令访问。

  1. 启动一个registry容器

    1. $ sudo docker run -d --name pause_test -p 5000:5000 registry

    此时可以用curl命令访问这个服务,请求状态码会返回200 OK。

    1. $ sudo curl -v 127.0.0.1:5000
  1. 暂停这个容器内的进程

    1. $ sudo docker pause pause_test

    此时用curl命令访问这个服务将阻塞,等待服务开启。

  2. 恢复运行这个容器内的进程

    1. $ sudo docker unpause pause_test

    此时步骤2中的curl访问将恢复运行,请求状态码返回200 OK。

port

用法:docker port CONTAINER [PRIVATE_PORT[/PROTO]]

功能:列出容器的端口映射,或者查找指定端口在主机的哪个端口

选项:无

示例:

  1. 列出容器所有的端口映射

    1. $ sudo docker port registry
    2. 5000/tcp -> 0.0.0.0.:5000
  2. 查找容器指定端口的映射

    1. $ sudo docker port registry 5000
    2. 0.0.0.0.:5000

ps

用法:docker ps [OPTIONS]

功能:根据不同的选项列出不同状态的容器,在不加任何选项的情况下,将列出正在运行的容器

选项:

-a, --all=false 显示所用的容器

-f, --filter=[] 筛选值,可用的筛选值有:exited=容器的退出码status=(restarting|running|paused|exited)容器的状态码(e.g. -f status=running,列出正在运行的容器)

-l, --latest=false 列出最近创建的一个容器

-n=-1 列出最近n此创建的容器

--no-trunc=false 将64位的容器ID全部显示出来,默认显示12位容器的ID

-q, --quiet=false 显示容器的ID

-s, --size=false 显示容器的大小

示例:

  1. 列出正在运行的容器

    1. $ sudo docker ps
  2. 列出所有的容器

    1. $ sudo docker ps -a

rename

用法:docker rename OLD_NAME NEW_NAME

功能:重命名容器

示例:

示例中,用docker run创建并启动一个容器,使用docker rename对容器重命名,并查看容器名是否改变。

  1. $ sudo docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. b15976967abb busybox:latest "bash" 3 seconds ago Up 2 seconds festive_morse
  4. $ sudo docker rename pedantic_euler new_name
  5. $ sudo docker ps
  6. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  7. b15976967abb busybox:latest "bash" 34 seconds ago Up 33 seconds new_name

restart

用法:docker restart [OPTIONS] CONTAINER [CONTAINER…]

功能:重启一个运行中的容器

选项:

-t, --time=10 在杀掉容器之前等待容器停止的秒数,如果容器已停止,就重启。默认为10秒。

示例:

  1. $ sudo docker restart busybox

容器管理 - 图1 说明:
容器在restart过程中,如果容器内存在D状态或Z状态的进程,可能会导致容器重启失败,这需要进一步分析导致容器内进程D状态或Z状态的原因,待容器内进程D状态或Z状态解除后,再进行容器restart操作。

rm

用法:docker rm [OPTIONS] CONTAINER [CONTAINER…]

功能:删除一个或多个容器

选项:

-f, --force=false 强制删除运行中的容器

-l, --link=false Remove the specified link and not the underlying container

-v, --volumes=false Remove the volumes associated with the container

示例:

  1. 删除一个停止运行的容器

    1. $ sudo docker rm test
  2. 删除一个正在运行的容器

    1. $ sudo docker rm -f rm_test

run

用法:docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

功能:该命令将由指定的image(如果指定的IMAGE不存在,则从官方镜像库中下载一个镜像)创建一个容器,并启动这个容器,并在容器中执行指定的命令。该命令集成了docker create命令、docker start命令、docker exec命令。

选项:(该命令的选项与docker create命令的选项一样,请参考docker create命令选项,仅仅多了以下两个选项)

--rm=false 设置容器退出时自动删除容器

-v 挂载本地目录或匿名卷到容器内。注意:当将本地目录以带有selinux的安全标签的方式挂载到容器内的同时,尽量不要同时做该本地目录的增删操作,否则该安全标签可能不生效

--sig-proxy=true 发往进程信号的代理,SIGCHLD, SIGSTOP, SIGKILL不使用代理

示例:

使用busybox镜像运行一个容器,在容器启动后执行/bin/sh

  1. $ sudo docker run -ti busybox /bin/sh

start

用法:docker start [OPTIONS] CONTAINER [CONTAINER…]

功能:启动一个或多个未运行容器

选项:

-a, --attach=false 容器的标准输出和错误输出附加到host的STDOUT和STDERR上

-i, --interactive=false 容器的标准输入附加到host的STDIN上

实例:

启动一个名为busybox的容器,添加-i -a选项附加标准输入输出,容器启动后直接进入容器内部,输入exit可以退出容器。

如果启动容器时不加-i -a选项,容器将在后台启动。

  1. $ sudo docker start -i -a busybox

stats

用法:docker stats [OPTIONS] [CONTAINER…]

功能:持续监控并显示指定容器(若不指定,则默认全部容器)的资源占用情况

选项:

-a, --all 显示所有容器(默认仅显示运行状态的容器)

--no-stream 只显示第一次的结果,不持续监控

示例:

示例中,用docker run创建并启动一个容器,docker stats将输出容器的资源占用情况。

  1. $ sudo docker stats
  2. CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
  3. 2e242bcdd682 jaeger 0.00% 77.08MiB / 125.8GiB 0.06% 42B / 1.23kB 97.9MB / 0B 38
  4. 02a06be42b2c relaxed_chandrasekhar 0.01% 8.609MiB / 125.8GiB 0.01% 0B / 0B 0B / 0B 10
  5. deb9e49fdef1 hardcore_montalcini 0.01% 12.79MiB / 125.8GiB 0.01% 0B / 0B 0B / 0B 9

stop

用法:docker stop [OPTIONS] CONTAINER [CONTAINER…]

功能:通过向容器发送一个SIGTERM信号并在一定的时间后发送一个SIGKILL信号停止容器

选项:

-t, --time=10 在杀掉容器之前等待容器退出的秒数,默认为10S

示例:

  1. $ sudo docker stop -t=15 busybox

top

用法:docker top CONTAINER [ps OPTIONS]

功能:显示一个容器内运行的进程

选项:无

示例:

先运行了一个名为top_test的容器,并在其中执行了top指令

  1. $ sudo docker top top_test
  2. UID PID PPID C STIME TTY TIME CMD
  3. root 70045 70028 0 15:52 pts/0 00:00:00 bash

显示的PID是容器内的进程在主机中的PID号。

update

用法:docker update [OPTIONS] CONTAINER [CONTAINER…]

功能:热变更一个或多个容器配置。

选项:

表 3 参数说明

参数

参数含义

—accel=[]

设置容器加速器,可设置一个或多个

—blkio-weight

设置容器blockio的相对权重,从10到1000

—cpu-shares

设置容器获得主机CPU的相对权重,通过设置这个选项获得更高的优先级,默认所有的容器都是获得相同的CPU优先权。

—cpu-period

设置CFS(完全公平调度策略)进程的CPU周期。

默认值为100ms;一般—cpu-period参数和—cpu-quota是配合使用的,比如—cpu-period=50000 —cpu-quota=25000,意味着如果有1个CPU,该容器可以每50ms获取到50%的CPU。

—cpu-quota

设置CFS(完全公平调度策略)进程的CPU配额,默认为0,即没有限制

—cpuset-cpus

设置容器中进程允许运行的CPU (0-3, 0,1)。默认没有限制

—cpuset-mems

设置容器中进程运行运行的内存内存节点 (0-3, 0,1),只对NUMA系统起作用

—kernel-memory=””

设置容器的kernerl内存限制,格式<number><optional unit>, 其中 unit = b, k, m or g

-m, —memory=””

设置容器的内存限制,格式<number><optional unit>, 其中 unit = b, k, m or g。该参数最小值为4m。

—memory-reservation

设置容器内存限制,默认与—memory一致。可认为—memory是硬限制,—memory-reservation是软限制;当使用内存超过预设值时,会动态调整(系统回收内存时尝试将使用内存降低到预设值以下),但不确保一定不超过预设值。一般可以和—memory一起使用,数值小于—memory的预设值。

—memory-swap

设置普通内存和交换分区的使用总量,-1为不做限制。如果不设置,则为—memory值的2倍,即SWAP可再使用与—memory相同的内存量。

—restart=””

设置容器退出时候的重启规则,当前1.3.1版本支持3个规则:

  • no:当容器停止时,不重启。
  • on-failure:当容器退出码为非0时重启容器,这个规则可以附加最大重启次数,如on-failure:5,最多重启5次。
  • always:无论退出码是什么都退出。

—help

打印help信息

示例:

变更一个容器名为busybox的cpu和mem配置,包括容器获得主机CPU的相对权重值为512,容器中进程允许运行的CPU核心为0,1,2,3,容器运行内存限制为512m。

  1. $ sudo docker update --cpu-shares 512 --cpuset-cpus=0,3 --memory 512m ubuntu

wait

用法:docker wait CONTAINER [CONTAINER…]

功能:等待一个容器停止,并打印出容器的退出码

选项:无

示例:

先开启一个名为busybox的容器

  1. $ sudo docker start -i -a busybox

执行docker wait

  1. $ sudo docker wait busybox
  2. 0

将阻塞等待busybox容器的退出,退出busybox容器后将看到打印退出码“0”。