容器管理

总体说明

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

用法:docker attach [OPTIONS] CONTAINER

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

选项:

--no-stdin=false 不附加STDIN

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

示例:

commit

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

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

选项:

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

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

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

示例:

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

  1. sha256:be4672959e8bd8a4291fbdd9e99be932912fe80b062fba3c9b16ee83720c33e1
  2. $ sudo docker images
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. 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 参数说明

示例:

创建了一个名为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的输出将合并为单流。

export

用法:docker export CONTAINER

选项:无

示例:

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

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

用法: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. "Running": true,
    10. "Paused": false,
    11. "Restarting": false,
    12. "OOMKilled": false,
    13. "Dead": false,
    14. "Pid": 64177,
    15. "ExitCode": 0,
    16. "Error": "",
    17. "StartedAt": "2019-08-28T07:43:53.021226383Z",
    18. "FinishedAt": "0001-01-01T00:00:00Z"
    19. },
    20. ......

logs

用法:docker logs [OPTIONS] CONTAINER

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

选项:

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

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

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

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

示例:

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

  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. 恢复运行这个容器内的进程

    此时步骤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对容器重命名,并查看容器名是否改变。

restart

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

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

选项:

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

示例:

  1. $ sudo docker restart busybox

用法: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 参数说明

示例:

变更一个容器名为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

用法:docker wait CONTAINER [CONTAINER…]

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

选项:无

示例:

先开启一个名为busybox的容器

执行docker wait

  1. $ sudo docker wait busybox
  2. 0