命令行参考

容器引擎

Docker daemon 是一个常驻后台的系统进程,docker 子命令执行前先要启动 docker daemon。

如果是通过 rpm 包或者系统包管理工具安装的,就可以使用 systemctl start docker 来启动 docker daemon。

docker 命令支持多个参数选项,对于参数选项有以下约定:

  1. 单个字符的选项可以合并在一起,如:

    docker run -t -i ubuntu:14.04 /bin/bash
    

    可以写成

    docker run -ti ubuntu:14.04 /bin/bash
    
  2. 在命令帮助中看到的如 --icc=true之类的 bool 命令选项,如果没有使用这个选项,则这个标志位的值就是在命令帮助中看到的默认值,如果使用了这个选项则这个标志位的值就是命令帮助中看的值的相反值,如果启动 docker daemon 没有加上使用 --icc选项,则默认设置了 --icc=true,如果使用了 --icc 选项则表示是 --icc=false

  3. 在命令帮助中看到的 --attach=[]之类的选项,表示这类的选项可以多次设置,如:

    docker run --attach=stdin --attach=stdout -i -t ubuntu:14.04 /bin/bash
    
  4. 在命令帮助中看到的 -a, –attach=[] 之类的选项,表示这种选项既可以用 -a value指定也可以用 --attach=value 指定。如:

    docker run -a stdin --attach=stdout -i -t ubuntu:14.04 /bin/bash
    
  5. --name=”” 之类的选项需要的是一个字符串,只能指定一次,-c=0 之类的选项需要的是一个整数,只能指定一次。

表 1 docker daemon 启动时指定参数详解

参数名称 说明
--api-cors-header 开放远程API调用的 CORS 头信息。这个接口开关对想进行二次开发的上层应用提供了支持。为remote API设置CORS头信息。
--authorization-plugin=[] 指定认证插件。
-b, --bridge=“” 挂载已经存在的网桥设备到 Docker 容器里。注意,使用 none 可以停用容器里的网络。
--bip=“” 使用 CIDR 地址来设定自动创建的网桥的 IP。注意,此参数和 -b 不能一起使用。
--cgroup-parent 为所有容器设定 cgroup 父目录。
--config-file=/etc/docker/daemon.json 启动 docker daemon 的配置文件。
--containerd 指定 containerd 的 socket 路径。
-D, --debug=false 开启 Debug 模式。
--default-gateway 容器 IPv4 地址的默认网关。
--default-gateway-v6 容器 IPv6 地址的默认网关。
--default-ulimit=[] 容器的默认 ulimit 值。
--disable-legacy-registry 不允许使用原版 registry。
--dns=[] 强制容器使用DNS服务器。例如: --dns 8.8.x.x
--dns-opt=[] 指定使用 DNS 的选项。
–dns-search=[] 强制容器使用指定的 DNS 搜索域名。
例如: --dns-search example.com
--exec-opt=[] 设置运行时执行选项。例如支持native.umask选项:
# 启动的容器umask值为0022
--exec-opt native.umask=normal
#启动的容器umask值为0027(默认值)
--exec-opt native.umask=secure
注意如果 docker create/run 也配置了 native.umask 参数则以 docker create/run 中的配置为准。
--exec-root=/var/run/docker 指定执行状态文件存放的根目录。
--fixed-cidr=“” 设定子网固定 IP(ex: 10.20.0.0/16),这个子网 IP 必须属于网桥内的。
--fixed-cidr-v6 同上,使用与 IPv6。
-G, --group=“docker” 在后台运行模式下,赋予指定的 Group 到相应的 unix socket 上。注意,当此参数 --group 赋予空字符串时,将去除组信息。
-g, --graph=“/var/lib/docker” 配置 Docker 运行时根目录。
-H, --host=[] 在后台模式下指定 socket 绑定,可以绑定一个或多个 tcp://host:port, unix:///path/to/socket, fd://* 或 fd://socketfd。例如:
$ dockerd -H tcp://0.0.0.0:2375
或者
$ export DOCKER_HOST=“tcp://0.0.0.0:2375”
--insecure-registry=[] 指定非安全连接的仓库,docker 默认所有的连接都是 TLS 证书来保证安全的,如果仓库不支持 https 连接或者证书是 docker daemon 不清楚的证书颁发机构颁发的,则启动 daemon 的时候要指定如 --insecure-registry=192.168.1.110:5000,使用私有仓库都要指定。
--image-layer-check=true 开启镜像层完整性检查功能,设置为 true;关闭该功能,设置为 false。如果没有该参数,默认为关闭。docker 启动时会检查镜像层的完整性,如果镜像层被破坏,则相关的镜像不可用。docker 进行镜像完整性校验时,无法校验内容为空的文件和目录,以及链接文件。因此若镜像因掉电导致上述类型文件丢失,docker 的镜像数据完整性校验可能无法识别。docker 版本变更时需要检查是否支持该参数,如果不支持,需要从配置文件中删除。
--icc=true 启用容器间的通信。
--ip=“0.0.0.0” 容器绑定端口时使用的默认 IP 地址。
--ip-forward=true 启动容器的 net.ipv4.ip_forward。
--ip-masq=true 使能 IP 伪装。
--iptables=true 启动 Docker 容器自定义的 iptable 规则。
-l, --log-level=info 设置日志级别。
--label=[] 设置 daemon 标签,以 key=value 形式设置。
--log-driver=json-file 设置容器日志的默认日志驱动。
--log-opt=map[] 设置日志驱动参数。
--mtu=0 设置容器网络的 MTU 值,如果没有这个参数,选用默认 route MTU,如果没有默认 route,就设置成常量值 1500。
-p, --pidfile=“/var/run/docker.pid” 后台进程 PID 文件路径。
--raw-logs 带有全部时间戳并不带ANSI颜色方案的日志。
--registry-mirror=[] 指定 dockerd 优先使用的镜像仓库。
-s, --storage-driver=“” 强制容器运行时使用指定的存储驱动
--selinux-enabled=false 启用 selinux 支持,3.10.0-862.14 及以上内核版本不支持– selinux-enabled=true。
--storage-opt=[] 配置存储驱动的参数,存储驱动为 devicemapper 的时候有效(e.g. dockerd --storage-opt dm.blocksize=512K)。
--tls=false 启动 TLS 认证开关。
--tlscacert=“/root/.docker/ca.pem” 通过 CA 认证过的的 certificate 文件路径。
--tlscert=“/root/.docker/cert.pem” TLS 的 certificate 文件路径。
--tlskey=“/root/.docker/key.pem” TLS 的 key 文件路径。
--tlsverify=false 使用 TLS 并做后台进程与客户端通讯的验证。
--insecure-skip-verify-enforce 是否强制跳过证书的主机名/域名验证,默认为 false(不跳过)。
--use-decrypted-key=true 指定使用解密私钥。
--userland-proxy=true 容器 LO 设备使用 userland proxy。
--userns-remap 容器内使用 user 命名空间的用户映射表。
说明:当前版本不支持该参数。



容器管理

当前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

示例:

$ sudo docker attach attach_test
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

$ sudo docker commit test busybox:test
sha256:be4672959e8bd8a4291fbdd9e99be932912fe80b062fba3c9b16ee83720c33e1

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
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 目录中

$ 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选项:
--annotation native.umask=normal # 启动的容器umask值为0022
--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=“” 指定容器的工作目录,进入容器时的目录

示例:

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

$ sudo docker create -ti --name=ubuntu ubuntu /bin/bash


diff

用法:docker diff CONTAINER

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

选项:无

示例:

$ sudo docker diff registry
C /root
A /root/.bash_history
A /test


exec

用法:docker exec [OPTIONS] CONTAINER COMMAND [ARG…]

功能:在一个运行的容器内执行命令

选项:

参数 说明
-d, --detach=false 在后台运行
-i, --interactive=false 保持容器的 STDIN 打开
-t, --tty=false 分配一个虚拟终端
--privileged 以特权模式执行命令
-u, --user 指定用户名或者 UID

示例:

$ sudo docker exec -ti exec_test ls
bin  etc   lib      media  opt   root  sbin  sys     tmp  var
dev  home  lib64  mnt     proc  run   srv   test  usr


export

用法:docker export CONTAINER

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

选项:无

示例:

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

$ sudo docker export busybox > busybox.tar
$ ls
busybox.tar


inspect

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

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

选项:

参数 说明
-f, --format=“” 按照给定的格式输出信息
-s, --size 若查询类型为容器,显示该容器的总体文件大小
--type 返回指定类型的 JSON 格式
-t, --time=120 超时时间的秒数,
若在该时间内 docker inspect 未执行成功,则停止等待并立即报错。
默认为 120 秒。

示例:

  1. 返回一个容器的信息

    $ sudo docker inspect busybox_test
    [
        {
            "Id": "9fbb8649d5a8b6ae106bb0ac7686c40b3cbd67ec2fd1ab03e0c419a70d755577",
            "Created": "2019-08-28T07:43:51.27745746Z",
            "Path": "bash",
            "Args": [],
            "State": {
                "Status": "running",
                "Running": true,
                "Paused": false,
                "Restarting": false,
                "OOMKilled": false,
                "Dead": false,
                "Pid": 64177,
                "ExitCode": 0,
                "Error": "",
                "StartedAt": "2019-08-28T07:43:53.021226383Z",
                "FinishedAt": "0001-01-01T00:00:00Z"
            },
    ......
    
  2. 按照给定格式返回一个容器的指定信息,下面的例子返回 ubuntu_test 容器 IP 地址

    $ sudo docker inspect -f {{.NetworkSettings.IPAddress}} ubuntu_test
    172.17.0.91
    


logs

用法:docker logs [OPTIONS] CONTAINER

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

选项:

参数 说明
-f, --follow=false 实时打印日志信息
-t, --timestamps=false 显示日志的时间戳
--since 显示指定时间之后的日志
--tail=“all” 设置显示的行数,默认显示所有

示例:

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

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

    $ sudo docker logs -f jaegertracing
    {"level":"info","ts":1566979103.3696961,"caller":"healthcheck/handler.go:99","msg":"Health Check server started","http-port":14269,"status":"unavailable"}
    {"level":"info","ts":1566979103.3820567,"caller":"memory/factory.go:55","msg":"Memory storage configuration","configuration":{"MaxTraces":0}}
    {"level":"info","ts":1566979103.390773,"caller":"tchannel/builder.go:94","msg":"Enabling service discovery","service":"jaeger-collector"}
    {"level":"info","ts":1566979103.3908608,"caller":"peerlistmgr/peer_list_mgr.go:111","msg":"Registering active peer","peer":"127.0.0.1:14267"}
    {"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 容器

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

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

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

    $ sudo docker pause pause_test
    

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

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

    $ sudo docker unpause pause_test
    

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


port

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

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

选项:无

示例:

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

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

    $ sudo docker port registry 5000
    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. 列出正在运行的容器

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

    $ sudo docker ps -a
    


rename

用法:docker rename [OPTIONS] OLD_NAME NEW_NAME

功能:重命名容器

选项:

示例:

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

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


restart

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

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

选项:

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

示例:

$ sudo docker restart ubuntu

说明:

容器在 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. 删除一个停止运行的容器

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

    $ 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 不使用代理

示例:

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

$ sudo docker run -ti ubuntu /bin/bash


start

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

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

选项:

参数 说明
-a, --attach=false 容器的标准输出和错误输出附加到 host 的 STDOUT 和 STDERR 上
-i, --interactive=false 容器的标准输入附加到 host 的 STDIN 上

实例:

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

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

$ sudo docker start -i -a ubuntu


stats

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

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

选项:

参数 说明
-a, --all 显示所有容器(默认仅显示运行状态的容器)
--no-stream 只显示第一次的结果,不持续监控

示例:

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

$ sudo docker stats
CONTAINER ID        NAME                    CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
2e242bcdd682        jaeger                  0.00%               77.08MiB / 125.8GiB   0.06%               42B / 1.23kB        97.9MB / 0B         38
02a06be42b2c        relaxed_chandrasekhar   0.01%               8.609MiB / 125.8GiB   0.01%               0B / 0B             0B / 0B             10
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。

示例:

$ sudo docker stop -t=15 ubuntu


top

用法:docker top CONTAINER [ps OPTIONS]

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

选项:无

示例:

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

$ sudo docker top top_test
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
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 信息

示例:

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

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


wait

用法:docker wait CONTAINER [CONTAINER…]

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

选项:无

示例:

先开启一个名为 ubuntu 的容器

$ sudo docker start -i -a ubuntu

执行docker wait

$ sudo docker wait ubuntu
0

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



镜像管理

build

用法:docker build [OPTIONS] PATH | URL | -

功能:使用指定路径中的 Dockerfile 生成构建一个新的 image

选项:常用选项参数如下,更多选项可以查看 docker help build

表 4 参数说明

参数 参数含义
--force-rm=false 即使没有构建成功也删除构建过程中生成的容器
--no-cache=false 构建 image 的过程中不使用缓存
-q, --quiet=false 禁止构建过程中产生的冗余信息
--rm=true 构建成功后删除过程中生成的容器
-t, --tag=“” 指定构建生成的 image 的 tag 名
--build-arg=[] 设置构建参数
--label=[] 镜像相关参数设置,各参数意义与 create 类似
--isolation 指定容器的隔离方法
--pull 构建时总是尝试获取最新版本镜像

Dockerfile 介绍:

Dockerfile 是一个镜像的表示,可以通过 Dockerfile 来描述构建镜像的步骤,并自动构建一个容器,所有的 Dockerfile 命令格式都是:INSTRUCTION arguments


FROM命令

格式:FROM 或 FROM :

功能:该命令指定基本镜像,是所有 Dockerfile 文件的第一个命令,如果没有指定基本镜像的 tag,使用默认 tag 名 latest。


RUN命令

格式:RUN (the command is run in a shell - /bin/sh -c) 或者

RUN [“executable”, “param1”, “param2” … ] (exec form)

功能:RUN 命令会在上面 FROM 指定的镜像里执行指定的任何命令,然后提交(commit)结果,提交的镜像会在后面继续用到。RUN 命令等价于:

docker run image command

docker commit container_id


注释

使用#注释


MAINTAINER命令

格式:MAINTAINER

功能:命令用来指定维护者的姓名和联系方式


ENTRYPOINT命令

格式:ENTRYPOINT cmd param1 param2 … 或者ENTRYPOINT [“cmd”, “param1”, “param2”…]

功能:设置在容器启动时执行命令


USER命令

格式:USER name

功能:指定 memcached 的运行用户


EXPOSE命令

格式:EXPOSE […]

功能:开放镜像的一个或多个端口


ENV命令

格式:ENV

功能:设置环境变量,设置了后,后续的 RUN 命令都可以使用


ADD命令

格式:ADD

功能:从src复制文件到 container 的 dest 路径, 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件 url, 是 container 中的绝对路径。


VOLUME命令

格式:VOLUME [““]

功能:创建一个挂载点用于共享目录


WORKDIR命令

格式:workdir

功能:配置 RUN, CMD, ENTRYPOINT 命令设置当前工作路径可以设置多次,如果是相对路径,则相对前一个 WORKDIR 命令。


CMD命令

格式:CMD [“executable”,“param1”,“param2”] (like an exec, preferred form)

CMD [“param1”,“param2”] (as default parameters to ENTRYPOINT)

CMD command param1 param2 (as a shell)

功能:一个 Dockerfile 里只能有一个 CMD,如果有多个,只有最后一个生效。


ONBUILD命令

格式:ONBUILD [其它指令]

功能:后面跟其它指令,比如 RUN、COPY 等,这些指令,在当前镜像构建时并不会被执行,只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。

下面是 Dockerfile 的一个完整例子,该 Dockerfile 将构建一个安装了 sshd 服务的 image:

FROM ubuntu:14.04 ENV  http_proxy http://192.168.0.226:3128 ENV  https_proxy https://192.168.0.226:3128 RUN apt-get update && apt-get install -y openssh-server RUN mkdir -p /var/run/sshd EXPOSE 22 ENTRYPOINT /usr/sbin/sshd -D

示例:

  1. 以上文的 Dockerfile 构建一个 image:

    $ sudo docker build -t ubuntu:latest
    
  2. 通过以下命令可以看到这个生成的 image:

    docker images | grep ubuntu
    


history

用法:docker history [OPTIONS] IMAGE

功能:显示一个 image 的变化历史

选项:

参数 说明
-H, --human=true
--no-trunc=false 不对输出进行删减
-q, --quiet=false 只显示 ID

示例:

$ sudo docker history busybox:test
IMAGE               CREATED             CREATED BY          SIZE                COMMENT
be4672959e8b        15 minutes ago      bash                23B
21970dfada48        4 weeks ago                             128MB               Imported from -


images

用法:docker images [OPTIONS] [NAME]

功能:列出存在的image,不加选项时不显示中间的image

选项:

参数 说明
-a, --all=false 显示所有的镜像
-f, --filter=[] 指定一个过滤值(i.e. ‘dangling=true’)
--no-trunc=false 不对输出进行删减
-q, --quiet=false 只显示 ID

示例:

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              e02e811dd08f        2 years ago         1.09MB


import

用法:docker import URL|- [REPOSITORY[:TAG]]

功能:把包含了一个 rootfs 的 tar 包导入为镜像。与 docker export 相对应。

选项:无

示例:

从上文介绍的 docker export 命令时导出的 busybox.tar 用 docker import 命令生成一个新的 image

$ sudo docker import busybox.tar busybox:test
sha256:a79d8ae1240388fd3f6c49697733c8bac4d87283920defc51fb0fe4469e30a4f
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             test                a79d8ae12403        2 seconds ago       1.3MB


load

用法:docker load [OPTIONS]

功能:把 docker save 出来的 tar 包重新加载一个镜像。与 docker save 相对应。

选项:

-i, --input=“”

示例:

$ sudo docker load -i busybox.tar
Loaded image ID: sha256:e02e811dd08fd49e7f6032625495118e63f597eb150403d02e3238af1df240ba
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              e02e811dd08f        2 years ago         1.09MB


login

用法:docker login [OPTIONS] [SERVER]

功能:登录到一个镜像服务库,没有指定 server 时,默认登录到https://index.docker.io/v1/

选项:

参数 说明
-e, --email=“” Email
-p, --password=“” 密码
-u, --username=“” 用户名

示例:

$ sudo docker login


logout

用法:docker logout [SERVER]

功能:从一个镜像服务器中登出,没有指定 server 时,默认登出https://index.docker.io/v1/

选项:无

示例:

$ sudo docker logout


pull

用法:docker pull [OPTIONS] NAME[:TAG]

功能:从一个镜像库(官方的或私有的)中拉取一个镜像

选项:

参数 说明
-a, --all-tags=false 下载一个镜像仓库的所有镜像(一个镜像仓库可以被打多个标签,比如一个
ubuntu 镜像库,可能有多个标签如 ubuntu:14.04,ubuntu:13.10,
ubuntu:latest 等,使用 -a 选项后,将所有标签的 ubuntu 镜像拉取下来)

示例:

  1. 从官方镜像库中拉取 nginx 镜像

    $ sudo docker pull nginx
    Using default tag: latest
    latest: Pulling from official/nginx
    94ed0c431eb5: Pull complete
    9406c100a1c3: Pull complete
    aa74daafd50c: Pull complete
    Digest: sha256:788fa27763db6d69ad3444e8ba72f947df9e7e163bad7c1f5614f8fd27a311c3
    Status: Downloaded newer image for nginx:latest
    

    拉取镜像时会检测所依赖的层是否存在,如果存在就用本地的层。

  2. 从私有镜像库中拉取镜像

    从私有镜像库中拉取 Fedora 镜像,比如所使用的私有镜像库的地址是 192.168.1.110:5000:

    $ sudo docker pull 192.168.1.110:5000/fedora
    


push

用法:docker push NAME[:TAG]

功能:将一个 image 推送到镜像库中

选项:无

示例:

  1. 将一个 image 推送到私有镜像库 192.168.1.110:5000 中

  2. 将要推送的镜像打标签( docker tag 命令将在下文介绍),本例中要推送的镜像为 ubuntu:sshd

    $ sudo docker tag ubuntu:sshd 192.168.1.110:5000/ubuntu:sshd
    
  3. 将打好标签的镜像推送到私有镜像库中

    $ sudo docker push 192.168.1.110:5000/ubuntu:sshd
    

    推送的时候会自动检测所依赖的层在镜像库中是否已存在,如果以存在,跳过该层。


rmi

用法:docker rmi [OPTIONS] IMAGE [IMAGE…]

功能:删除一个或多个镜像,如果一个镜像在镜像库中有多个标签,删除镜像的时候只是进行 untag 操作,当删除的是只有一个标签的镜像时,将依次删除所依赖的层。

选项:

参数 说明
-f, --force=false 强制删除image
--no-prune=false 不删除没有标签的父镜像

示例:

$ sudo docker rmi 192.168.1.110:5000/ubuntu:sshd


save

用法:docker save [OPTIONS] IMAGE [IMAGE…]

功能:保存一个 image 到一个 tar 包,输出默认是到 STDOUT

选项:

参数 说明
-o, --output=“” 输出到文件中而不是 STDOUT

示例:

$ sudo docker save -o nginx.tar nginx:latest
$ ls
nginx.tar


用法:docker search [OPTIONS] TERM

功能:在镜像库中查找特定的镜像

选项:

参数 说明
--automated=false 显示自动构建的 image
--no-trunc=false 不对输出进行删减
-s, --stars=0 只显示特定星级以上的 image

示例:

  1. 在官方镜像库中搜寻 nginx

    $ sudo docker search nginx
    NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
    nginx                             Official build of Nginx.                        11873               [OK]
    jwilder/nginx-proxy               Automated Nginx reverse proxy for docker con…   1645                                    [OK]
    richarvey/nginx-php-fpm           Container running Nginx + PHP-FPM capable of…   739                                     [OK]
    linuxserver/nginx                 An Nginx container, brought to you by LinuxS…   74
    bitnami/nginx                     Bitnami nginx Docker Image                      70                                      [OK]
    tiangolo/nginx-rtmp               Docker image with Nginx using the nginx-rtmp…   51                                      [OK]
    
  2. 在私有镜像库中搜寻 busybox,在私有镜像库中搜寻时要加上私有镜像库的地址

    $ sudo docker search 192.168.1.110:5000/busybox
    


tag

用法:docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

功能:将一个镜像打标签到一个库中

选项:

参数 说明
-f, --force=false 如果存在相同的 tag 名将强制替换原来的 image

示例:

$ sudo docker tag busybox:latest busybox:test



统计信息

events

用法:docker events [OPTIONS]

功能:从 docker daemon 中获取实时事件

选项:

参数 说明
--since=“” 显示指定时间戳之后的事件
--until=“” 显示直到指定之间戳的事件

示例:

该示例中,执行 docker events 后,用 docker run 创建并启动一个容器,docker events 将输出 create 事件和 start 事件。

$ sudo docker events
2019-08-28T16:23:09.338838795+08:00 container create 53450588a20800d8231aa1dc4439a734e16955387efb5f259c47737dba9e2b5e (image=busybox:latest, name=eager_wu)
2019-08-28T16:23:09.339909205+08:00 container attach 53450588a20800d8231aa1dc4439a734e16955387efb5f259c47737dba9e2b5e (image=busybox:latest, name=eager_wu)
2019-08-28T16:23:09.397717518+08:00 network connect e2e20f52662f1ee2b01545da3b02e5ec7ff9c85adf688dce89a9eb73661dedaa (container=53450588a20800d8231aa1dc4439a734e16955387efb5f259c47737dba9e2b5e, name=bridge, type=bridge)
2019-08-28T16:23:09.922224724+08:00 container start 53450588a20800d8231aa1dc4439a734e16955387efb5f259c47737dba9e2b5e (image=busybox:latest, name=eager_wu)
2019-08-28T16:23:09.924121158+08:00 container resize 53450588a20800d8231aa1dc4439a734e16955387efb5f259c47737dba9e2b5e (height=48, image=busybox:latest, name=eager_wu, width=210)


info

用法:docker info

功能:显示 docker 系统级的相关信息,包括系统中的 Container 数量、Image 数量、Image 的存储驱动、容器的执行驱动、内核版本、主机操作系统版本等信息。

选项:无

示例:

$ sudo docker info
Containers: 4
 Running: 3
 Paused: 0
 Stopped: 1
Images: 45
Server Version: 18.09.0
Storage Driver: devicemapper
 Pool Name: docker-thinpool
 Pool Blocksize: 524.3kB
 Base Device Size: 10.74GB
 Backing Filesystem: ext4
 Udev Sync Supported: true
 Data Space Used: 11GB
 Data Space Total: 51GB
 Data Space Available: 39.99GB
 Metadata Space Used: 5.083MB
 Metadata Space Total: 532.7MB
 Metadata Space Available: 527.6MB
 Thin Pool Minimum Free Space: 5.1GB
 Deferred Removal Enabled: true
 Deferred Deletion Enabled: true
 Deferred Deleted Device Count: 0
......


version

用法:docker version

功能:显示 docker 的版本信息,包括 Client 版本、Server 版本、Go 版本、OS/Arch 等信息

选项:无

示例:

$ sudo docker version
Client:
 Version:           18.09.0
 EulerVersion:      18.09.0.48
 API version:       1.39
 Go version:        go1.11
 Git commit:        cbf6283
 Built:             Mon Apr  1 00:00:00 2019
 OS/Arch:           linux/arm64
 Experimental:      false

Server:
 Engine:
  Version:          18.09.0
  EulerVersion:     18.09.0.48
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.11
  Git commit:       cbf6283
  Built:            Mon Apr  1 00:00:00 2019
  OS/Arch:          linux/arm64
  Experimental:     false

results matching ""

    No results matching ""