容器是Docker又一核心概念。简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。
Docker的容器十分轻量级,用户可以随时创建或删除容器。可以使用docker [container] create
命令新建一个容器。
(base) pang@pang-HP:~/dockerfile$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python 3 763642b839b7 About an hour ago 55.4MB
debian stretch-slim a88d8e7bd33c 2 weeks ago 55.4MB
hello-world latest feb5d9fea6a5 8 months ago 13.3kB
centos 7 eeb6ee3f44bd 9 months ago 204MB
(base) pang@pang-HP:~/dockerfile$
(base) pang@pang-HP:~/dockerfile$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d6f4e669c61 hello-world "/hello" 5 hours ago Exited (0) 5 hours ago priceless_lewin
(base) pang@pang-HP:~/dockerfile$
(base) pang@pang-HP:~/dockerfile$ sudo docker create -it centos:7
960e542763b0c883a2a34fac1782e4f3313866b4876b54957aaa6ebd78eab751
(base) pang@pang-HP:~/dockerfile$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
960e542763b0 centos:7 "/bin/bash" 2 seconds ago Created heuristic_herschel
3d6f4e669c61 hello-world "/hello" 5 hours ago Exited (0) 5 hours ago priceless_lewin
(base) pang@pang-HP:~/dockerfile$
使用docker [container] create
命令新建的容器处于停止状态,可以使用docker [container] start
命令来启动它。
(base) pang@pang-HP:~/dockerfile$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
960e542763b0 centos:7 "/bin/bash" 2 seconds ago Created heuristic_herschel
3d6f4e669c61 hello-world "/hello" 5 hours ago Exited (0) 5 hours ago priceless_lewin
(base) pang@pang-HP:~/dockerfile$ sudo docker start 960e542763b0
960e542763b0
(base) pang@pang-HP:~/dockerfile$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
960e542763b0 centos:7 "/bin/bash" 3 minutes ago Up 1 second heuristic_herschel
3d6f4e669c61 hello-world "/hello" 5 hours ago Exited (0) 5 hours ago priceless_lewin
(base) pang@pang-HP:~/dockerfile$
选项 | 说明 |
---|---|
-a ,--attach=[] |
是否绑定到标准输入、输出和错误 |
-d ,--detach=true|false |
是否在后台运行容器,默认为否 |
--detach-keys="" |
从attach模式退出的快捷键 |
--entrypoint="" |
镜像存在入口命令时,覆盖为新的命令 |
--expose=[] |
指定容器会暴露出来的端口或端口范围 |
--group-add=[] |
运行容器的用户组 |
-i ,--interactive=true|false |
保持标准输入打开,默认为false |
--ipc="" |
容器IPC命名空间,可以为其他容器或主机 |
--isolation="default" |
容器使用的隔离机制 |
--log-driver="json-file" |
指定容器的日志驱动类型,可以为json-file、syslog、journald、gelf、fluentd、awslogs、splunk、etwlogs、gcplogs或none |
--log-opt=[] |
传递给日志驱动的选项 |
--net="bridge" |
指定容器网络模式,包括 bridge、none、其他容器内网络、host的网络或某个现有网络等 |
--net-alias=[] |
容器在网络中的别名 |
-P ,--publish-all=true|false |
通过NAT机制将容器标记暴露的端口自动映射到本地主机的临时端口 |
-p ,--publish=[] |
指定如何映射到本地主机端口,例如 -p 11234-12234:1234-2234 |
--pid=host |
容器的PID命名空间 |
--userns="" |
启用userns-remap时配置用户命名空间的模式 |
--uts=host |
容器的UTS命名空间 |
--restart="no" |
容器的重启策略,包括no、on-failure[:max-retry]、always、unless-stopped等 |
--rm=true|false |
容器退出后是否自动删除,不能跟-d 同时使用 |
-t ,--tty=true|false |
是否分配一个伪终端,默认为false |
--tmpfs=[] |
挂载临时文件系统到容器 |
-v ,volume[=[[HOST -DIR:] CONTAINER-DIR [:OPTIONS]]] |
挂载主机上的文件卷到容器内 |
--volume-driver="" |
挂载文件卷的驱动类型 |
--volumes-from=[] |
从其他容器挂载卷 |
-w ,--workdir="" |
容器内的默认工作目录 |
选项 | 说明 |
---|---|
--add-host=[] |
在容器内添加一个主机名到IP地址的映射关系(通过/etc/hosts文件) |
--device=[] |
映射物理机上的设备到容器内 |
--dns-search=[] |
DNS搜索域 |
--dns-opt=[] |
自定义的DNS选项 |
--dns=[] |
自定义的DNS服务都 |
-e ,--env=[] |
指定容器内环境变量 |
--env-file=[] |
从文件中读取环境变量到容器内 |
-h , --hostname="" |
指定容器内的主机名 |
--ip="" |
指定容器的IPv4地址 |
--ip6="" |
指定容器的IPv6地址 |
--link=[ |
链接到其他容器 |
--link-local-ip=[]: |
容器的本地链接地址列表 |
--mac-address="" |
指定容器的Mac地址 |
--name="" |
指定容糕的别名 |
选项 | 说明 |
---|---|
--blkio-weight=10~1000 |
容器读写块设备的I/O性能权重,默认为0 |
--blkio-weight-device=[DEVICE_NAME:WEIGHT] |
指定各个块设备的I/O性能权重 |
--cpu-shares=0 |
允许容器使用CPU资源的相对权重,默认一个容器能用满一个核的CPU |
--cap-add=[] |
增加容器的Linux指定安全能力 |
--cap-drop=[] |
移除容器的Linux指定安全能力 |
--cgroup-parent="" |
容器cgroups限制的创建路径 |
--cidfile="" |
指定容器的进程ID号写到文件 |
--cpu-period=0 |
限制容器在CFS调度器下的CPU占用时间片 |
--cpuset-cpus="" |
限制容器能使用哪些CPU核心 |
--cpuset-mems="" |
NUMA架构下使用哪些核心的内存 |
--cpu-quota=0 |
限制容器在CFS调度器下的CPU配额 |
--device-read-bps=[] |
挂载设备的读吞吐率(以bps为单位)限制 |
--device-write-bps=[] |
挂载设备的写吞吐率(以bps为单位)限制 |
--device-read-iops=[] |
挂载设备的读速率(以每秒i/o次数为单位)限制 |
--device-write-iops=[] |
挂载设备的写速率(以每秒i/o次数为单位)限制 |
--health-cmd="" |
指定检查容器健康状态的命令 |
--health-interval=0s |
执行健康检查的间隔时间,单位可以为ms、s、m或h |
--health-retries=int |
健康检查失败重试次数,超过则认为不健康 |
--health-start-period=0s |
容器启动后进行健康检查的等待时间,单位可以为ms、s、m或h |
--health-timeout=0s |
健康检查的执行超时,单位可以为ms、s、m或h |
--no-healthcheck=true|false |
是否禁用健康检查 |
--init |
在容器中执行一个 init进程,来负责响应信号和处理僵尸状态子进程 |
--kernel-memory="" |
限制容器使用内核的内存大小, 单位可以是b、k、m或g |
-m ,--memory="" |
限制容器内应用使用的内存,单位可以是b、k、m或g |
--memory-reservation="" |
当系统中内存过低时,容器会被强制限制内存到给定值,默认情况下等于内存限制值 |
--memory-swap="LIMIT" |
限制容器使用内存和交换区的总大小 |
--oom-kill-disable=true|false |
内存耗尽时是否杀死容器 |
--oom-score-adj="" |
调整容器的内存耗尽参数 |
--pids-limit="" |
限制容器的pid个数 |
--privileged=true|false |
是否给容器高权限,这意味着容器内应用将不受权限的限制,一般不推荐 |
--read-only=true|false |
是否让容器内的文件系统只读 |
--security-opt=[] |
指定一些安全参数,包括权限、安全能力、apparmor等 |
--stop-signal=SIGTERM |
指定停止容器的系统信号 |
--shm-size="" |
/dev/shm的大小 |
--sig-proxy=true|false |
是否代理收到的信号给应用,默认为true,不能代理SIGCHLD、SIGSTOP和SIGKILL信号 |
--memory-swappiness="0~100" |
调整容器的内存交换区参数 |
-u ,--user="" |
指定在容器内执行命令的用户信息 |
--userns="" |
指定用户命名空间 |
--ulimit=[] |
通过ulimit来限制最大文件数、最大进程数等 |
选项 | 说明 |
---|---|
-l ,--label=[] |
以键值对方式指定容器的标签信息 |
--label-file=[] |
从文件中读取标签信息 |
使用docker [container] start
命令来启动一个已经创建的容器。 例如,启动刚创建的centos容器:
(base) pang@pang-HP:~/dockerfile$ sudo docker start 960e542763b0
960e542763b0
(base) pang@pang-HP:
此时,通过docker ps
命令,可以查看到一个运行中的容器。
(base) pang@pang-HP:~/dockerfile$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
960e542763b0 centos:7 "/bin/bash" 3 minutes ago Up 1 second heuristic_herschel
3d6f4e669c61 hello-world "/hello" 5 hours ago Exited (0) 5 hours ago priceless_lewin
(base) pang@pang-HP:~/dockerfile$
除了创建容器后通过start
命令来启动 也可以直接新建并启动容器。所需要的命令主要为docker [container]run
。
等价于先执行docker [container] create
命令,再执行docker [container] start
命令。
当利用docker run来创建并启动容器时,Docker在后台运行的标准操作包括:
如:
(base) pang@pang-HP:~/dockerfile$ sudo docker run -it centos:7 /bin/bash
[root@002d5caaf325 /]#
[root@002d5caaf325 /]# exit
exit
(base) pang@pang-HP:~/dockerfile$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
002d5caaf325 centos:7 "/bin/bash" 26 seconds ago Exited (0) 10 seconds ago affectionate_rubin
3d6f4e669c61 hello-world "/hello" 27 hours ago Exited (0) 27 hours ago priceless_lewin
(base) pang@pang-HP:~/dockerfile$
/bin/bash,其中,-t选项让Docker分配一个伪终端并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。这样在交互模式下,可以通过所创建的终端来输入命令。
用户可以按Ctrl+d或输入exit命令来退出容器,退出后容器就自动处于终止状态。
如果需要让Docker容器在后台以守护态(Daemonized)形式运行,用户可以通过添加-d
参数来实现。如:
sudo docker run -d centos:7 /bin/bash -c "while true;do echo hello world;sleep 1;done"
容器启动后会返回一个唯一的ID,也可以通过docker -ps
命令来查看容器信息。
(base) pang@pang-HP:~/dockerfile$ sudo docker run -d centos:7 /bin/bash
f9085f49eeba1698b72670b02c0dab00432039df9db96e1f0baa03145e3bd1e5
(base) pang@pang-HP:~/dockerfile$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f9085f49eeba centos:7 "/bin/bash" 15 seconds ago Exited (0) 14 seconds ago amazing_banach
(base) pang@pang-HP:~/dockerfile$
此时容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面,需要通过log命令查看日志。
使用-d
参数启动后会返回一个唯一的 id,也可以通过docker container ls
命令来查看正在运行容器信息。
(base) pang@pang-HP:~/dockerfile$ sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
(base) pang@pang-HP:~/dockerfile$
(base) pang@pang-HP:~/dockerfile$ sudo docker start 002d5caaf325
002d5caaf325
(base) pang@pang-HP:~/dockerfile$ sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
002d5caaf325 centos:7 "/bin/bash" 42 minutes ago Up 2 seconds affectionate_rubin
(base) pang@pang-HP:~/dockerfile$
要获取容器的输出信息,可以通过docker [container] logs [container ID|NAMES]
命令。该命令支持的选项包括:
-details
: 打印详细信息;-f
, -follow
:持续保持输出;-since string
:输出从某个时间开始的日志;-tail string
: 输出最近的若干日志;-t, -timestamps
: 显示时间戳信息;-until string
: 输出某个时间之前的日志 。如:sudo docker logs 002d5caaf325
。(002d5caaf325为CONTAINER ID)
主要介绍Docker容器的pause/unpause、stop和prune子命令。
可以使用docker [container] pause CONTAINER [CONTAINER ...
命令来暂停一个运行中的容器。
(base) pang@pang-HP:~/dockerfile$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
002d5caaf325 centos:7 "/bin/bash" 45 minutes ago Up 3 minutes affectionate_rubin
3d6f4e669c61 hello-world "/hello" 28 hours ago Exited (0) 28 hours ago priceless_lewin
(base) pang@pang-HP:~/dockerfile$ sudo docker pause 002d5caaf325
002d5caaf325
(base) pang@pang-HP:~/dockerfile$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
002d5caaf325 centos:7 "/bin/bash" 46 minutes ago Up 4 minutes (Paused) affectionate_rubin
3d6f4e669c61 hello-world "/hello" 28 hours ago Exited (0) 28 hours ago priceless_lewin
(base) pang@pang-HP:~/dockerfile$
处于paused状态的容器,可以使用docker [container ] unpause CONTAINER [CONTAINER ... ]
命令来恢复到运行状态 。
可以使用docker [container] stop
来终止一个运行中的容器。 该命令的格式为docker [container] stop [-t|--time[=10]] [CONTAINER... ]
。
该命令会首先向容器发送SIGTER 信号,等待一段超时时间后(默认为 10 秒),再发送SIGKILL信号来终止容器。
(base) pang@pang-HP:~/dockerfile$ sudo docker stop 002d5caaf325
002d5caaf325
(base) pang@pang-HP:~/dockerfile$
此时执行docker container prune
命令,会自动删除掉所有处于停止状态的容器。
(base) pang@pang-HP:~/dockerfile$ sudo docker stop 002d5caaf325
002d5caaf325
(base) pang@pang-HP:~/dockerfile$
(base) pang@pang-HP:~/dockerfile$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
002d5caaf325 centos:7 "/bin/bash" 55 minutes ago Exited (137) 48 seconds ago affectionate_rubin
3d6f4e669c61 hello-world "/hello" 28 hours ago Exited (0) 28 hours ago priceless_lewin
(base) pang@pang-HP:~/dockerfile$ sudo docker prune
docker: 'prune' is not a docker command.
See 'docker --help'
(base) pang@pang-HP:~/dockerfile$ sudo docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
002d5caaf325fc94dbdc7c6f40db5cf827e72479fd63a1a5a00e34d712cf55b4
3d6f4e669c6103fb721ae076cd2900d444a09d273982ffffb71044beb046eeb4
Total reclaimed space: 5B
(base) pang@pang-HP:~/dockerfile$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
(base) pang@pang-HP:~/dockerfile$
此外,还可以通过docker [container] kill
直接发送SIGKIL 信号来强行终止容器。
当Docker容器中指定的应用终结时,容器也会自动终止 。
可以用docker ps -qa
命令看到所有容器的ID。
(base) pang@pang-HP:~/dockerfile$ sudo docker ps -aq
df328f6381a2
(base) pang@pang-HP:~/dockerfile$
此外,docker restart
命令会将一个运行态的容器终止,然后再重新启动它。如:sudo docker restart ce5
。
当使用-t
参数是,会打开虚拟的终端,故而此时是已经进入了容器中的。
(base) pang@pang-HP:~/dockerfile$ sudo docker run -it centos:7 /bin/bash
[root@002d5caaf325 /]#
[root@002d5caaf325 /]# exit
在使用-d
参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。此时如果需要操作容器,可以使用attach
或exec
命令或nsenter工具等。
attach
是Docker自带的命令,命令格式为:
docker [container] attach [--detach-keys[;[]]] [--no-stdin] [--sig-proxy[;true]] CONTAINER
这个命令支持三个主要选项:
--detach-keys[=[]]
:指定退出attach模式的快捷键序列, 默认是CTRL-p、CTRL-q;--no-stdin=true|false
:是否关闭标准输入,默认是保持打开;--sig-proxy=true|false
:是否代理收到的系统信号给应用进程,默认为true。(base) pang@pang-HP:~/dockerfile$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
df328f6381a2 centos:7 "/bin/bash" 49 minutes ago Up 3 seconds mystifying_carson
(base) pang@pang-HP:~/dockerfile$
(base) pang@pang-HP:~/dockerfile$
(base) pang@pang-HP:~/dockerfile$ sudo docker attach df328f6381a2
[root@df328f6381a2 /]#
[root@df328f6381a2 /]#
[root@df328f6381a2 /]# exit
(base) pang@pang-HP:~/dockerfile$
exit
然而使用attach命令有时候并不方便。当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
从Docker的1.3.0版本起,Docker提供了一个更加方便的工具exec命令,可以在运行中容器内直接执行任意命令。该命令的基本格式为:
docker [container] exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged] [-t|--tty] [ -u|--user[=USER]] CONTAINER COMMAND[ARG...]
比较重要的参数有:
选项 | 说明 |
---|---|
-d ,--detach |
在容器中后台执行命令 |
--detach-keys="" |
指定将容器切回后台的按键 |
-e ,--env=[] |
指定环境变量列表 |
-i ,--interactive=true|false |
打开标准输入接受用户输入命令, 默认值为false |
--privileged=true|false |
是否给执行命令以高权限,默认值为false |
-t ,--tty=true|false |
分配伪终端,默认值为false |
-u ,--user="" |
执行命令的用户名或ID |
例如:
(base) pang@pang-HP:~/dockerfile$ sudo docker exec -it df328f6381a2 /bin/bash
[root@df328f6381a2 /]# who
[root@df328f6381a2 /]# w
08:04:42 up 1 day, 7:26, 0 users, load average: 0.69, 1.09, 1.11
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
[root@df328f6381a2 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 08:04 pts/0 00:00:00 /bin/bash
root 15 0 0 08:04 pts/1 00:00:00 /bin/bash
root 31 15 0 08:04 pts/1 00:00:00 ps -ef
[root@df328f6381a2 /]#
可以看到会打开一个新的bash终端,在不影响容器内其他应用的前提下,用户可以与容器进行交互并执行Linux命令。
nsenter工具在util-linux包2.23版本后包含。如果系统中util-linux包没有该命令,可以按照下面的方法从源码安装:
$cd /tmp;curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
$./configure --without -ncurses
$make nsenter && sudo cp nsenter /usr/local/bin
为了使用nsenter连接到容器,还需要找到容器的进行的PID,通过如下命令获取:
PID=$(docker inspect --format "{{ .State.Pid}}" )
通过这个PID,就可以连接到这个容器:
nsenter --target $PID --mount --uts --ipc --net --pid
例子:
sudo docker run -idt ubuntu
sudo docker ps
PID=$(docker-pid XXXXXXXX)
sudo nesenter --target YYYY --mount --uts --ipc --net --pid
可以使用docker [container] rm
命令来删除处于终止或退出状态的容器,命令格式为:
docker [container] rm [-f|--force] [-l|--link] [-v|--volumes] CONTAINER [CONTAINER ...]
主要支持的选项包括 :
选项 | 说明 |
---|---|
-f ,--force=false |
是否强行终止并删除一个运行中的容器 |
-l ,--link=false |
删除容器的连接 ,但保留容器 |
-v ,--volumes=false |
删除容器挂载的数据卷 |
例如:
docker rm ce554267d7a4
默认情况下,docker rm
命令只能删除已经处于终止或退出状态的容器,并不能删除还处于运行状态的容器。如果要直接删除一个运行中的容器,可以添加-f
参数。 Docker会先发送SIGKILL信号给容器,终止其中的应用,之后强行删除。
某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用Docker的导人和导出功能,这也是Docker自身提供的一个重要特性。
导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态 。 可以使用docker [container ] export
命令,该命令格式为:
docker [container] export [-o|--output [=""]] CONTAINER
其中,可以通过-o
选项来指定导出的tar文件名,也可以直接通过重定向来实现。
(base) pang@pang-HP:~/dockerfile$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
df328f6381a2 centos:7 "/bin/bash" 19 hours ago Up 18 hours mystifying_carson
(base) pang@pang-HP:~/dockerfile$
# 两种方法均可以导出,且导出文件一样。
(base) pang@pang-HP:~/dockerfile$ sudo docker export -o centos7.tar df328f6381a2
(base) pang@pang-HP:~/dockerfile$ sudo docker export df328f6381a2 > centos7-1.tar
(base) pang@pang-HP:~/dockerfile$ ll
-rw-rw-r-- 1 pang pang 211688960 6月 16 09:57 centos7-1.tar
-rw------- 1 root root 211688960 6月 16 09:56 centos7.tar
(base) pang@pang-HP:~/dockerfile$
之后,可将导出的tar文件传输到其他机器上,然后再通过导人命令导入到系统中,实现容器的迁移 。
导出的文件又可以使用docker [container] import
命令导入变成镜像,该命令格式为 :
docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|-- [REPOSITORY [:TAG]]
用户可以通过-c
, --change=[]
选项在导人的同时执行对容器进行修改的Dockerfile指令(可参考后续相关章节)。
(base) pang@pang-HP:~/dockerfile$ sudo docker import centos7.tar -- test/centos7:v1.0
sha256:9df7664eae766c47102b73dda888b908776d1e0ba7286a1527c6a2a587e534c8
(base) pang@pang-HP:~/dockerfile$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/centos7 v1.0 9df7664eae76 20 seconds ago 204MB
python 3 763642b839b7 44 hours ago 55.4MB
debian stretch-slim a88d8e7bd33c 2 weeks ago 55.4MB
hello-world latest feb5d9fea6a5 8 months ago 13.3kB
centos 7 eeb6ee3f44bd 9 months ago 204MB
(base) pang@pang-HP:~/dockerfile$
实际上,既可以使用docker load
命令来导入镜像存储文件到本地镜像库,也可以使用docker [container] import
命令来导入一个容器快照到本地镜像库 。 这两者的区别在于:
主要介绍Docker容器的inspect
、top
和stats
子命令。
查看容器详情可以使用docker container inspect [OPTIONS] CONTAINER [CONTAINER ...]
子命令 。
查看某容器的具体信息,会以json格式返回包括容器Id、创建时间、路径、状态、镜像、配置等在内的各项信息:
(base) pang@pang-HP:~/dockerfile$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f9085f49eeba centos:7 "/bin/bash" 15 seconds ago Exited (0) 14 seconds ago amazing_banach
(base) pang@pang-HP:~/dockerfile$
(base) pang@pang-HP:~/dockerfile$ sudo docker inspect f9085f49eeba
[
{
"Id": "f9085f49eeba1698b72670b02c0dab00432039df9db96e1f0baa03145e3bd1e5",
"Created": "2022-06-16T02:10:25.361840395Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 0,
"Error": "",
"StartedAt": "2022-06-16T02:10:25.662402927Z",
"FinishedAt": "2022-06-16T02:10:25.663637373Z"
},
"Image": "sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9",
...
查看容器内进程可以使用docker [container] top [OPTIONS] CONTAINER [CONTAINER ...]
子命令。
这个子命令类似于Linux系统中的top命令,会打印出容器内的进程信息,包括PID、用户、时间、命令等。
例如,查看某容器内的进程信息,命令如下:
(base) pang@pang-HP:~/dockerfile$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98bbce6f5691 centos:7 "/bin/bash" 35 seconds ago Up 4 seconds reverent_morse
(base) pang@pang-HP:~/dockerfile$
(base) pang@pang-HP:~/dockerfile$ sudo docker top 98bbce6f5691
UID PID PPID C STIME TTY TIME CMD
root 235672 235653 0 10:25 pts/0 00:00:00 /bin/bash
(base) pang@pang-HP:~/dockerfile$
查看统计信息可以使用docker [container] stats [OPTIONS] [CONTAINER ...]
子命令,会显示CPU、内存、存储、网络等使用情况的统计信息。支持选项包括 :
-a
,-all
:输出所有容器统计信息,默认仅在运行中;-format string
:格式化输出信息;-no-stream
:不持续输出,默认会自动更新持续实时结果;-no-trunc
:不截断输出信息 。例如,查看当前运行中容器的系统资源使用统计:
(base) pang@pang-HP:~/dockerfile$ sudo docker stats 98bbce6f5691
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
98bbce6f5691 reverent_morse 0.00% 756KiB / 14.98GiB 0.00% 10.6kB / 0B 0B / 0B 1
主要介绍Docker容器的cp、diff、port和update子命令。
container cp
命令支持在容器和主机之间复制文件。 命令格式为:
docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH |-
支持的选项包括 :
-a
, -archive
:打包模式,复制文件会带有原始的uid/gid信息;-L
, -follow-link
:跟随软连接。当原路径为软连接时\默认只复制链接信息,使用该选项会复制链接的目标内容。例如,将本地路径中的Dockerfile复制到reverent_morse容器的/路径下 :
(base) pang@pang-HP:~/dockerfile$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98bbce6f5691 centos:7 "/bin/bash" 22 minutes ago Up 21 minutes reverent_morse
(base) pang@pang-HP:~/dockerfile$
(base) pang@pang-HP:~/dockerfile$ sudo docker cp Dockerfile 98bbce6f5691:/
(base) pang@pang-HP:~/dockerfile$ sudo docker exec -it 98bbce6f5691 /bin/bash
[root@98bbce6f5691 /]# ls
Dockerfile anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
container diff
查看容器内文件系统的变更。 命令格式为:
docker [container] diff CONTAINER
例如,查看 test 容器内的数据修改:
(base) pang@pang-HP:~/dockerfile$ sudo docker diff 98bbce6f5691
A /Dockerfile
C /root
A /root/.bash_history
(base) pang@pang-HP:~/dockerfile$
container port
命令可以查看容器的端口映射情况。 命令格式为:
docker container port CONTAINER [PRIVATE_PORT[/PROTO]]
例如,查看容器的端口映射情况:
$ docker container port test
9000/tcp - > o.o o 0:9000
container update
命令可以更新容器的一些运行时配置,主要是一些资源限制份额。命令格式为:
docker [container] update [OPTIONS] CONTAINER [CONTAINER ...]
支持的选项包括:
选项 | 值类型 | 说明 |
---|---|---|
--blkio-weight |
uint16 | 更新块IO限制,10~1000,默认值为0,代表着无限制 |
--cpu-period |
int | 限制CPU调度器CFS (Completely Fair 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