CHAPTER 3 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 psdocker 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参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。
这个时候如果需要进入容器进行操作,推荐使用官方的attachexec命令。

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…]更新配置
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值