docker容器
3.1 docker容器简介
容器是Docker的另一个核心概念。简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。
如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行态环境和其他系统环境)和跑在上面的应用。那么Docker容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。
本章将具体介绍围绕容器的重要操作,包括:
- 创建一个容器
- 启动容器
- 终止一个容器
- 进入容器内执行操作
- 删除容器
- 通过导人导出容器来实现容器迁移。
3.2 创建容器(create、start、run、wait和logs)
3.2.1 创建容器(create)
从现在开始,忘掉“臃肿”的虚拟机吧,对容器的操作就像直接操作应用一样简单和快速。
新建容器可以使用docker create
命令新建一个容器,命令格式:
SYNOPSIS
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS
...
-i, --interactive[=false] Keep STDIN open even if not attached
...
-t, --tty[=false] Allocate a pseudo-TTY
...
该命令的选项非常多,我们只列举本次使用的选项:
-i, --interactive=true/false 保持标准输入打开,默认为false
-t, --tty=true/false 是否分配一个伪终端,默认为false
创建一个容器:
[root@dbc-server-554 docker]# docker create -it ubuntu:18.04
6d69a9f5a5b92ad3f677eae2723f83302faa4a32f952bb7fe3db40b21d5077be
[root@dbc-server-554 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d69a9f5a5b9 ubuntu:18.04 "bash" 10 seconds ago Created stupefied_carson
由于容器是整个Docker技术栈的核心,create命令和后续的run命令支持的选项都十分复杂,需要读者在实践中不断体会。
选项主要包括如下几大类:
- 与容器运行模式相关
- 与容器环境配置相关
- 与容器资源限制
- 安全保护相关
3.2.1.1 create命令与容器运行模式相关的选项
选项 | 说明 |
---|---|
-a, -- attach=[] | 是否绑定到标准输入、输出和错误 |
-d,-- detach=true/false | 是否在后台运行容器,默认为否 |
-- detach-keys=“” | 从attach模式退出的快捷键 |
-- entrypoint=“” | 镜像存在入口命令时,覆盖为新的命令 |
-- expose=[] | 指定容器会暴露出来的端口或端口范围 |
-- group-add=[] | 运行容器的用户组 |
-i, -- interactive=true/false | 保持标准输入打开,默认为false |
-- ipc="" | 容器lPC命名空间,可以为其他容器或主机 |
-- 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- l2234: 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=[] | 挂载临时文件系统到容器 |
-vi, -- volume[=[[HOST-DIR:]CONTAINER-DIR [:OPTIONS]]] | 挂载主机上的文件卷到容器内 |
-- volume-driver=“” | 挂载文件卷的驱动类型 |
-- volumes-from=[] | 从其他容器挂载卷 |
-w, -- workdir=“” | 容器内的默认工作目录 |
3.2.1.2 create命令与容器环境和配置相关的选项
选项 | 说明 |
---|---|
-- 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=[<name or id>:alias] | 链接到其他容器 |
-- link-local-ip= [] | 容器的本地链接地址列表 |
-- mac-address=“” | 指定容器的Mac地址 |
-- name=“” | 指定容器的别名 |
3.2.1.3 create命令与容器资源限制和安全保护相关的选项
选项 | 说明 |
---|---|
-- blkio-weight=l0-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-re servation=“” | 当系统中内存过低时,容器会被强制限制内存到给定值,默认情况下等于内存限制值 |
-- memory swap=”LIMIT" | 限制容器使用内存和交换区的总大小 |
-- oom-kill-d isable=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~10” | 调整容器的内存交换区参数 |
-u , -- user="" | 指定在容器内执行命令的用户信息 |
-- userns=" " | 指定用户命名空间 |
-- ulimit =[] | 通过ulimit来限制最大文件数、最大进程数等 |
3.2.1.4 其他选项
选项 | 说明 |
---|---|
-l,–label=[] | 以键值对方式指定容器的标签信息 |
-- label-file=[] | 从文件中读取标签信息 |
3.2.2 启动容器(start)
使用docker [container] create
命令新建的容器处于停止状态,可以使用docker [container] start
命令来启动它,通过exec可以进入容器
[root@dbc-server-554 docker]# docker start 6d6
6d6
[root@dbc-server-554 docker]# docker exec -it 6d6 bash
root@6d69a9f5a5b9:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
3.2.3 新建井启动容器(run)
新建井启动容器所需要的命令主要为docker [container] run
,等价于先执行docker [container] create
命令,再执行docker[container] start
命令
下面的命令输出一个“HelloWorld",之后容器自动终止:
[root@dbc-server-554 docker]# docker run ubuntu:18.04 /bin/echo "hello world"
hello world
[root@dbc-server-554 docker]#
这跟在本地直接执行/bin/echo 'hello world'
相比几乎感觉不出任何区别。
当利用docker [container] run
来创建并启动容器时,Docker在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载;
- 利用镜像创建一个容器,并启动该容器;
- 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
- 从宿主主机配置的网桥接口桥接一个虚拟接口到容器中去;
- 从网桥的地址池配置一个IP地址给容器;
- 执行用户指定的应用程序;
- 执行完毕后容器被自动终止。
下面的命令启动一个bash终端,允许用户进行交互:
[root@dbc-server-554 docker]# docker run -it ubuntu:18.04 /bin/bash
root@bca8bdedf8bf:/# pwd
/
root@bca8bdedf8bf:/# w
03:17:49 up 42 days, 1:24, 0 users, load average: 0.08, 0.04, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root@bca8bdedf8bf:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
其中,-t
选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i
则让容器的标准输入保持打开。
更多的命令选项可以通过mandocker-run命令来查看。
用户可以按Ctrl+d
或输入exit
命令来退出容器
对于所创建的bash容器,当用户使用exit命令退出bash进程之后,容器也会自动退出。这是因为对于容器来说,当其中的应用退出后,容器的使命完成,也就没有继续运行的必要了。
可以使用docker container wait CONTAINER [CONTAINER ... ]
子命令来等待容器退出,并打印退出返回结果。
[root@dbc-server-554 docker]# docker run -d ubuntu:18.04 /bin/sleep 10
2eb64bec33250504bdfcca459218b3ff3a9fe64fd944e6dd453cf27583784fb8
[root@dbc-server-554 docker]# docker container wait 2eb
0
某些时候,执行docker [container] run
的时候因为命令无法正常执行容器会出错直接退出,此时可以查看退出的错误代码。
默认情况下,常见错误代码包括:
- 125: Docker daemon执行出错,例如指定了不支持的Docker命令参数;
- 126:所指定命令无法执行,例如权限出错;
- 127:容器内命令无法找到。命令执行后出错,会默认返回命令的退出错误码。
3.2.4 守护态运行(-d)
更多的时候,需要让Docker容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加-d
参数来实现。
[root@dbc-server-554 docker]# docker run -d ubuntu:18.04 /bin/sleep 10
2eb64bec33250504bdfcca459218b3ff3a9fe64fd944e6dd453cf27583784fb8
容器启动后会返回一个唯一的id,也可以通过docker ps
或docker container ls
命令来查看容器信息
3.2.5 查看容器输出(logs)
要获取容器的输出信息,可以通过docker [container] logs
命令。命令格式:
SYNOPSIS
docker logs [OPTIONS] CONTAINER
OPTIONS
--details[=false] Show extra details provided to logs #打印详细信息
-f, --follow[=false] Follow log output #持续输出
-h, --help[=false] help for logs
--since="" Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 min‐
utes) #输出从某个时间开始的日志
-n, --tail="all" Number of lines to show from the end of the logs #输出最近的若干日志
-t, --timestamps[=false] Show timestamps #显示时间戳信息
--until="" Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42
minutes) #输出某个时间之前的日志
[root@dbc-server-554 docker]# docker logs 277
hello world
3.3 停止容器(pause/unpause、stop和prune)
3.3.1 暂停容器(pause/unpause)
可以使用docker [container] pause CONTAINER [CONTAINER ... ]
命令来暂停一个运行中的容器。例如,启动一个容器,并将其暂停:
[root@dbc-server-554 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d69a9f5a5b9 ubuntu:18.04 "bash" 4 hours ago Up 4 hours stupefied_carson
[root@dbc-server-554 docker]# docker pause 6d6
6d6
[root@dbc-server-554 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d69a9f5a5b9 ubuntu:18.04 "bash" 4 hours ago Up 4 hours (Paused) stupefied_carson
[root@dbc-server-554 docker]# docker unpause 6d6
6d6
[root@dbc-server-554 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d69a9f5a5b9 ubuntu:18.04 "bash" 4 hours ago Up 4 hours stupefied_carson
处于paused状态的容器,可以使用docker [container] unpause CONTAINER [CONTAINER ... ]
命令来恢复到运行状态。
3.3.2 终止容器(stop)
可以使用docker [container] stop
来终止一个运行中的容器。该命令的格式为
SYNOPSIS
docker stop [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS
-h, --help[=false] help for stop
-t, --time=10 Seconds to wait for stop before killing it
该命令会首先向容器发送SIGTERM信号,等待一段超时时间后(默认为10秒),再发送SIGKILL信号来终止容器:
系统信号
[root@dbc-server-554 docker]# docker stop 6d6
6d6
[root@dbc-server-554 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@dbc-server-554 docker]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
277210edcd8865328638308190ada0a93d420c98f944f5cb0a7c6e6c308935e1
e33e12b055f0428e742f25ed28b0cc788075e15dc199c0c6caf7bfcb2a02be59
2eb64bec33250504bdfcca459218b3ff3a9fe64fd944e6dd453cf27583784fb8
1e8b13f5239cca7e6fa836a63b43482d4fcb8a8041924437342177043e6d07da
eb8bb348f058f8d9ac483bf4f2c8f74bb94fdbcc5f55d7b923519baa999601f0
3f101d9d98dd55e3c526e4d7af693c64893603fca7714b632b296ac381a167d2
8bd59e1aab0862689827ecc89fec20c24132f58ad89f190e75430fea874fe9d9
bca8bdedf8bfe133d23942fe485d15d22c1764063658de49ab07bff321e50d97
781711201f3e42a2a2c45fe387a0ebff163557e87ce53151eb91693beac4eb51
6d69a9f5a5b92ad3f677eae2723f83302faa4a32f952bb7fe3db40b21d5077be
944742a90200593fd129848b756e5ddca8b125711926ec875c23bf3c4036413c
fe01b86f100c3313229a11a5e057b0893cbf356995ab0310638082d5b32231a7
69c9479cfafd71f6a89a31de5a3065a4b5580ad602df619c0e23e223f575386b
Total reclaimed space: 60B
[root@dbc-server-554 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
此时再执行docker container prune
命令,会自动清除掉所有处于停止状态的容器。
此外,还可以通过docker [container] kill
直接发送SIGKILL信号来强行终止容器。
当Docker容器中指定的应用终结时,容器也会自动终止。例如,对于上一章节中只启动了一个终端的容器,用户通过exit命令或Ctrl+d来退出终端时,所创建的容器立刻终止,处于stopped状态。可以用docker ps -qa
命令看到所有容器的ID。例如
[root@dbc-server-554 docker]# docker ps -aq
367fbc30e42a
处于终止状态的容器,可以通过docker start
命令来重新启动:
[root@dbc-server-554 docker]# docker start 367
367
[root@dbc-server-554 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
367fbc30e42a ubuntu:18.04 "bash" About a minute ago Up 9 seconds test
docker [container] restart
命令会将一个运行态的容器先终止,然后再重新启动:
[root@dbc-server-554 docker]# docker restart 367
367
3.4 进入容器(attach,exec)
在使用-d
参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。
这个时候如果需要进入容器进行操作,推荐使用官方的attach
或exec
命令。
3.4.1 attach命令
命令格式:
SYNOPSIS
docker attach [OPTIONS] CONTAINER
OPTIONS
--detach-keys="" Override the key sequence for detaching a container #:指定退出attach模式的快捷键序列,默认是CTRL-p或CTRL-q;
-h, --help[=false] help for attach
--no-stdin[=false] Do not attach STDIN #是否关闭标准输入,默认是保持打开;
--sig-proxy[=true] Proxy all received signals to the process #是否代理收到的系统信号给应用进程,默认为true
示例:
[root@dbc-server-554 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
367fbc30e42a ubuntu:18.04 "bash" 11 minutes ago Up 8 minutes test
[root@dbc-server-554 docker]# docker attach test
root@367fbc30e42a:/# w
然而使用attach命令有时候并不方便。当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
3.4.2 exec命令
命令格式:
SYNOPSIS
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS
-d, --detach[=false] Detached mode: run command in the background
--detach-keys="" Override the key sequence for detaching a container #指定将容器切回后台的按键;
-e, --env= Set environment variables #指定环境变量列表;
--env-file= Read in a file of environment variables
-h, --help[=false] help for exec
-i, --interactive[=false] Keep STDIN open even if not attached #打开标准输入接受用户输入命令,默认值为false;
--privileged[=false] Give extended privileges to the command #是否给执行命令以高权限,默认值为false;
-t, --tty[=false] Allocate a pseudo-TTY #分配伪终端,默认值为false;
-u, --user="" Username or UID (format: [:]) #执行命令的用户名或ID
-w, --workdir="" Working directory inside the container
示例:
[root@dbc-server-554 docker]# docker exec -it 367 /bin/bash
Error response from daemon: Container 367fbc30e42a523bd95d80aebd22e403d040dd54d8b4db5f99d7950b857c3aa0 is not running
[root@dbc-server-554 docker]# docker start 367
367
[root@dbc-server-554 docker]# docker exec -it 367 /bin/bash
root@367fbc30e42a:/# w
07:50:15 up 42 days, 5:56, 0 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
可以看到会打开一个新的bash终端,在不影响容器内其他应用的前提下,用户可以与容器进行交互。
通过指定-it
参数来保持标准输入打开,并且分配一个伪终端。通过exec命令对容器执行操作是最为推荐的方式。
需要注意:attach和exec无法进入处于停止状态的容器。
3.5 删除容器(rm)
可以使用docker [container] rm
命令来删除处于终止或退出状态的容器,命令格式为
SYNOPSIS
docker rm [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS
-f, --force[=false] Force the removal of a running container (uses SIGKILL) #是否强行终止并删除一个运行中的容器
-h, --help[=false] help for rm
-l, --link[=false] Remove the specified link #删除容器的连接,但保留容器;
-v, --volumes[=false] Remove anonymous volumes associated(有关联的) with the container #删除容器挂载的数据卷
例如,查看处于终止状态的容器,并删除
[root@dbc-server-554 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
367fbc30e42a ubuntu:18.04 "bash" 25 minutes ago Exited (0) 5 minutes ago test
[root@dbc-server-554 docker]# docker rm 367
367
[root@dbc-server-554 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
默认情况下,docker rm
命令只能删除已经处于终止或退出状态的容器,并不能删除还处于运行状态的容器。
如果要直接删除一个运行中的容器,可以添加-f
参数。Docker会先发送SIGKILL信号给容器,终止其中的应用,之后强行删除
3.6 导入和导出容器(export,import)
某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用Docker的导入和导出功能,这也是Docker自身提供的一个重要特性。
3.6.1 导出容器(export)
导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。可以使用docker [container] export
命令,该命令格式为:
SYNOPSIS
docker export [OPTIONS] CONTAINER
OPTIONS
-h, --help[=false] help for export
-o, --output="" Write to a file, instead of STDOUT
其中,可以通过-o
选项来指定导出的tar文件名,也可以直接通过重定向来实现
[root@dbc-server-554 docker]# docker run --name=test -itd ubuntu:18.04 bash
ba12ebfbd8a7560b6e3a320a64ed2531e78f9676bc7e2f0392fe06fa0ea9f9b8
[root@dbc-server-554 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba12ebfbd8a7 ubuntu:18.04 "bash" 6 seconds ago Up 4 seconds test
[root@dbc-server-554 docker]# docker export -o test.tar ba1
[root@dbc-server-554 docker]# docker export ba1 > test2.tar
[root@dbc-server-554 docker]# ll
total 705880
-rw------- 1 root root 446125056 Jan 10 16:41 centos7.tar
-rw-r--r-- 1 root root 145639219 Jan 10 16:23 centos-7-x86_64-minimal.tar.gz
-rw-r--r-- 1 root root 55 Jan 10 16:34 dockerfile
-rw-r--r-- 1 root root 65521152 Jan 11 16:03 test2.tar
-rw------- 1 root root 65521152 Jan 11 16:02 test.tar
之后,可将导出的tar文件传输到其他机器上,然后再通过导入命令import导入到系统中,实现容器的迁移。
3.6.2 导入容器(import)
导出的文件又可以使用docker [container] import
命令导入变成镜像,该命令格式为
SYNOPSIS
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
OPTIONS
-c, --change= Apply Dockerfile instruction to the created image #在导入的同时执行对容器进行修改的Dockerfile指令
-h, --help[=false] help for import
-m, --message="" Set commit message for imported image
--platform="" Set platform if server is multi-platform capable
下面将导出的test.tar文件导入到系统中:
[root@dbc-server-554 docker]# docker import test.tar test/test:v0.1
sha256:6b234ff8dcf1250b55d748892f5a89b1e3596445b85c1287bbcdb991df747a37
[root@dbc-server-554 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/test v0.1 6b234ff8dcf1 3 seconds ago 63.1MB
之前的镜像章节(第3章)中,笔者曾介绍过使用docker load
命令来导入一个镜像文件,与docker [container] import
命令十分类似。实际上,既可以使用docker load
命令来导入镜像存储文件到本地镜像库,也可以使用docker [container] import
命令来导入一个容器快照到本地镜像库。
这两者的区别在于:容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大。此外,从容器快照文件导人时可以重新指定标签等元数据信息。
3.7 查看容器(inspect、top和stats)
3.7.1 查看容器详情(inspect)
查看容器详情可以使用docker [container] inspect [OPTIONS] CONTAINER [CONTAINER ... ]
子命令。
例如,查看某容器的具体信息,会以json格式返回包括容器Id、创建时间、路径、状态、镜像、配置等在内的各项信息:
[root@dbc-server-554 docker]# docker container inspect ba1
[
{
"Id": "ba12ebfbd8a7560b6e3a320a64ed2531e78f9676bc7e2f0392fe06fa0ea9f9b8",
"Created": "2023-01-11T08:01:28.815920323Z",
"Path": "bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 9295,
"ExitCode": 0,
"Error": "",
"StartedAt": "2023-01-11T08:01:29.370766209Z",
"FinishedAt": "0001-01-01T00:00:00Z"
...
选项包括:
Options:
-f, --format string Format output using a custom template:
'json': Print in JSON format
'TEMPLATE': Print output using the given Go template.
Refer to https://docs.docker.com/go/formatting/ for more information about formatting output with templates
-s, --size Display total file sizes if the type is container
--type string Return JSON for specified type
常用筛选:
docker inspect --format="{{json .Mounts}}" container #容器的Mounts信息,可以看到容器中各个目录在宿主机的具体挂载位置。
docker inspect --format="{{json .NetworkSettings}}" container | jq #查看完整网络信息
docker inspect --format="{{json .NetworkSettings.Ports}}" container | jq #查看网络端口映射
docker inspect --format="{{json .NetworkSettings.Networks}}" container | jq # 查看容器的网络ip、网关等信息
参数中的json是go语言的方法名,后面是取Mounts的值做json化处理。去掉json也是可以的。
如果觉得这样输入还是不太好看,可以对json再作进一步处理,如使用python的json模块或者jq美化输出。命令如下:
#使用python的json模块美化
docker inspect --format="{{json .Mounts}}" container | python -m json.tool
#使用jq美化
docker inspect --format="{{json .Mounts}}" container | jq
3.7.2 查看容器内进程(top)
查看容器内进程可以使用docker [container] top [OPTIONS] CONTAINER [CONTAINER ... ]
子命令。这个子命令类似于Linux系统中的top命令,会打印出容器内的进程信息,包括PID、用户、时间、命令等。例如,查看某容器内的进程信息,命令如下
[root@dbc-server-554 docker]# docker container top ba1
UID PID PPID C STIME TTY TIME CMD
root 9295 9273 0 16:01 pts/0 00:00:00 bash
3.7.3 查看统计信息(stats)
查看统计信息可以使用docker [container] stats [OPTIONS] [CONTAINER ... ]
子命令,会显示CPU、内存、存储、网络等使用情况的统计信息
SYNOPSIS
docker stats [OPTIONS] [CONTAINER...]
OPTIONS
-a, --all[=false] Show all containers (default shows just running)
--format="" Pretty-print images using a Go template
-h, --help[=false] help for stats
--no-stream[=false] Disable streaming stats and only pull the first result
--no-trunc[=false] Do not truncate output
例如,查看当前运行中容器的系统资源使用统计:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
ba12ebfbd8a7 test 0.00% 404KiB / 7.517GiB 0.01% 656B / 0B 0B / 0B 1
3.8 其他容器命令(cp、diff、port和update)
3.8.1 复制文件(cp)
container cp
命令支持在容器和主机之间复制文件。命令格式为:
SYNOPSIS
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker cp [OPTIONS] SRC_PATH CON‐TAINER:DEST_PATH
OPTIONS
-a, --archive[=false] Archive mode (copy all uid/gid information) #打包模式,复制文件会带有原始的uid/gid信息;
-L, --follow-link[=false] Always follow symbol link in SRC_PATH #跟随软连接。当原路径为软连接时,默认只复制链接信息,使用该选项会复制链接的目标内容。
-h, --help[=false] help for cp
把本地文件拷贝至容器内
[root@dbc-server-554 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba12ebfbd8a7 ubuntu:18.04 "bash" 37 minutes ago Up 37 minutes test
[root@dbc-server-554 docker]# ll
total 705880
-rw------- 1 root root 446125056 Jan 10 16:41 centos7.tar
-rw-r--r-- 1 root root 145639219 Jan 10 16:23 centos-7-x86_64-minimal.tar.gz
-rw-r--r-- 1 root root 55 Jan 10 16:34 dockerfile
-rw-r--r-- 1 root root 65521152 Jan 11 16:03 test2.tar
-rw------- 1 root root 65521152 Jan 11 16:02 test.tar
[root@dbc-server-554 docker]# docker cp dockerfile ba1:/tmp/
[root@dbc-server-554 docker]# docker exec -it ba1 bash
root@ba12ebfbd8a7:/# ls /tmp/
dockerfile
将容器中文件拷贝至本地
[root@dbc-server-554 docker]# docker cp ba1:/tmp/dockerfile /tmp/
[root@dbc-server-554 docker]# ls /tmp/
192.168.71.183
ansible
dockerfile
3.8.2 查看变更(diff)
container diff
查看容器内文件系统的变更。命令格式为:
SYNOPSIS
docker diff CONTAINER
OPTIONS
-h, --help[=false] help for diff
例如,查看ba1容器内的数据修改:
[root@dbc-server-554 docker]# docker diff ba1
C /root
A /root/.bash_history
C /tmp
A /tmp/dockerfile
3.8.3 查看端口映射(port)
container port
命令可以查看容器的端口映射情况。命令格式为
SYNOPSIS
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
OPTIONS
-h, --help[=false] help for port
例如,查看ba1容器的端口映射情况
[root@dbc-server-554 docker]# docker run -itd -p 2376:2376 ubuntu:18.04
bee4d4e3890996a320a0eb21ddef195ba38abec1782caa5e38d314054149e0c4
[root@dbc-server-554 docker]# docker port bee
2376/tcp -> 0.0.0.0:2376
2376/tcp -> :::2376
3.8.4 更新配置(update)
container update命令可以更新容器的一些运行时配置,主要是一些资源限制份额。命令格式为
SYNOPSIS
docker 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秒,容器bee所占用时间为10%,代码如下所示:
[root@dbc-server-554 docker]# docker update --cpu-quota 1000000 bee
bee
[root@dbc-server-554 docker]# docker update --cpu-period 1000000 bee
bee
3.9 容器命令汇总
命令 | 说明 |
---|---|
docker create [OPTIONS] IMAGE [COMMAND] [ARG…] | 创建容器,参数较多 |
docker start CONTAINER | 启动容器 |
docker run [OPTIONS] IMAGE [COMMAND] [ARG…] | 新建井启动容器,参数较多 |
docker run -it IMAGE [COMMAND] [ARG…] | 新建井启动容器,保持标准输入打开,并且分配一个伪终端 |
docker run -d IMAGE [COMMAND] [ARG…] | 新建井启动容器,后台启动 |
docker logs [OPTIONS] CONTAINER | 查看容器输出 |
docker pause CONTAINER [CONTAINER … ] | 暂停容器 |
docker unpause CONTAINER [CONTAINER … ] | 恢复暂停容器 |
docker stop [OPTIONS] CONTAINER [CONTAINER…] | 终止容器 |
docker container prune | 清除掉所有处于停止状态的容器 |
docker kill CONTAINER [CONTAINER … ] | 强行终止容器 |
docker restart CONTAINER | 重启容器 |
docker attach [OPTIONS] CONTAINER | 进入容器,多窗口阻塞 |
docker exec [OPTIONS] CONTAINER COMMAND [ARG…] | 进入容器 |
docker exec -it [OPTIONS] CONTAINER COMMAND [ARG…] | 保持标准输入打开,并且分配一个伪终端 |
docker rm [OPTIONS] CONTAINER [CONTAINER…] | 删除容器 |
docker export [OPTIONS] CONTAINER | 导出容器 |
docker import [OPTIONS] file/URL/- [REPOSITORY[:TAG]] | 导入容器 |
docker container inspect [OPTIONS] CONTAINER [CONTAINER … ] | 查看容器详情 |
docker [container] top [OPTIONS] CONTAINER [CONTAINER … ] | 查看容器内进程 |
docker [container] stats [OPTIONS] [CONTAINER … ] | 查看统计信息 |
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH | 从容器向本地拷贝文件 |
docker cp [OPTIONS] SRC_PATH CON‐TAINER:DEST_PATH | 从本地向容器拷贝文件 |
docker diff CONTAINER | 查看变更 |
docker port CONTAINER [PRIVATE_PORT[/PROTO]] | 查看端口映射 |
docker update [OPTIONS] CONTAINER [CONTAINER…] | 更新配置 |