容器管理
总体说明
当前docker支持的子命令,按照功能划分为以下几组:
其中有些子命令还有一些参数选项如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 解析并跟踪文件的符号链接
示例:
复制registry容器中/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 参数说明
示例:
创建了一个名为busybox的容器,创建之后的容器用docker start命令启动。
$ sudo docker create -ti --name=busybox busybox /bin/bash
diff
用法:docker diff CONTAINER
功能:检视容器的差异,相比于容器刚创建时做了哪些改变
选项:无
示例:
$ sudo docker diff registry
C /root
A /root/.bash_history
A /test
exec
接口原型
rpc Exec(ExecRequest) returns (ExecResponse) {}
接口描述
在容器中执行命令,采用的gRPC通讯方式从CRI服务端获取url,再通过获得的url与websocket服务端建立长连接,实现与容器的交互。
注意事项
执行执行一条单独的命令,也能打开终端与容器交互。stdin/stdout/stderr之一必须是真的。如果tty为真,stderr必须是假的。 不支持多路复用,在这种情况下,stdout和stderr的输出将合并为单流。
参数
返回值
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秒。
示例:
返回一个容器的信息
$ 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" }, ......
按照给定格式返回一个容器的指定信息,下面的例子返回busybox_test容器IP地址
$ sudo docker inspect -f {{.NetworkSettings.IPAddress}} busybox_test 172.17.0.91
logs
用法:docker logs [OPTIONS] CONTAINER
功能:抓取容器内的日志信息,容器可以是运行状态的也可以是停止状态的
选项:
-f, --follow=false 实时打印日志信息
-t, --timestamps=false 显示日志的时间戳
--since 显示指定时间之后的日志
--tail="all" 设置显示的行数,默认显示所有
示例:
查看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}
加上-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命令访问。
启动一个registry容器
$ sudo docker run -d --name pause_test -p 5000:5000 registry
此时可以用curl命令访问这个服务,请求状态码会返回200 OK。
$ sudo curl -v 127.0.0.1:5000
暂停这个容器内的进程
$ sudo docker pause pause_test
此时用curl命令访问这个服务将阻塞,等待服务开启。
恢复运行这个容器内的进程
$ sudo docker unpause pause_test
此时步骤2中的curl访问将恢复运行,请求状态码返回200 OK。
port
用法:docker port CONTAINER [PRIVATE_PORT[/PROTO]]
功能:列出容器的端口映射,或者查找指定端口在主机的哪个端口
选项:无
示例:
列出容器所有的端口映射
$ sudo docker port registry 5000/tcp -> 0.0.0.0.:5000
查找容器指定端口的映射
$ sudo docker port registry 5000 0.0.0.0.:5000
ps
用法:docker ps [OPTIONS]
功能:根据不同的选项列出不同状态的容器,在不加任何选项的情况下,将列出正在运行的容器
选项:
-a, --all=false 显示所用的容器
-f, --filter=[] 筛选值,可用的筛选值有:exited=<int>容器的退出码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 显示容器的大小
示例:
列出正在运行的容器
$ sudo docker ps
列出所有的容器
$ sudo docker ps -a
rename
用法:docker rename 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 busybox
说明:
容器在restart过程中,如果容器内存在D状态或Z状态的进程,可能会导致容器重启失败,这需要进一步分析导致容器内进程D状态或Z状态的原因,待容器内进程D状态或Z状态解除后,再进行容器restart操作。
rm
用法:docker rm [OPTIONS] CONTAINER [CONTAINER...]
功能:删除一个或多个容器
选项:
-f, --force=false 强制删除运行中的容器
-l, --link=false 删除指定的链接,而不是底层容器
-v, --volumes=false 删除与容器关联的卷
示例:
删除一个停止运行的容器
$ sudo docker rm test
删除一个正在运行的容器
$ 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
$ 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选项,容器将在后台启动。
$ sudo docker start -i -a busybox
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 busybox
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 参数说明
示例:
变更一个容器名为busybox的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...]
功能:等待一个容器停止,并打印出容器的退出码
选项:无
示例:
先开启一个名为busybox的容器
$ sudo docker start -i -a busybox
执行docker wait
$ sudo docker wait busybox
0
将阻塞等待busybox容器的退出,退出busybox容器后将看到打印退出码“0”。