Docker笔记-03 容器

文章目录

  • 1 创建容器
    • 1.1 使用Create命令新建容器
      • 1.1.1 Create命令与容器运行模式相关的选项
      • 1.1.2 Create命令与容器环境和配置相关的选项
      • 1.1.3 Create命令与容器资源限制和安全保护相关的选项
      • 1.1.4 其他选项
    • 1.2 使用Start命令启动容器
    • 1.3 使用Run命令新建并启动容器
    • 1.4 守护态运行
    • 1.5 查看容器输出
  • 2 停止容器
    • 2.1 暂停容器
    • 2.2 终止容器
  • 3 进入容器
    • 3.1 attach命令
    • 3.2 exec命令
    • 3.3 nsenter工具
  • 4 删除容器
  • 5 导入和导出容器
    • 5.1 导出容器
    • 5.2 导入容器
  • 6 查看容器
    • 6.1 使用inspect命令查看容器详情
    • 6.2 使用top命令查看容器内进程
    • 6.3 使用stats命令查看统计信息
  • 7 其他容器命令
    • 7.1 使用cp命令复制文件
    • 7.2 使用diff命令查看变更
    • 7.3 查看端口映射
    • 7.4 更新配置

容器是Docker又一核心概念。简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。

1 创建容器

1.1 使用Create命令新建容器

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$ 

1.1.1 Create命令与容器运行模式相关的选项

选项 说明
-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="" 容器内的默认工作目录

1.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=[:alias] 链接到其他容器
--link-local-ip=[]: 容器的本地链接地址列表
--mac-address="" 指定容器的Mac地址
--name="" 指定容糕的别名

1.1.3 Create命令与容器资源限制和安全保护相关的选项

选项 说明
--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来限制最大文件数、最大进程数等

1.1.4 其他选项

选项 说明
-l,--label=[] 以键值对方式指定容器的标签信息
--label-file=[] 从文件中读取标签信息

1.2 使用Start命令启动容器

使用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$ 

1.3 使用Run命令新建并启动容器

除了创建容器后通过start命令来启动 也可以直接新建并启动容器。所需要的命令主要为docker [container]run

等价于先执行docker [container] create命令,再执行docker [container] start命令。

当利用docker run来创建并启动容器时,Docker在后台运行的标准操作包括:

  1. 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
  2. 利用镜像创建并启动一个容器。
  3. 分配一个文件系统,并在制度的镜像层外面挂载一层可读写层。
  4. 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
  5. 从地址池配置一个IP地址给容器。
  6. 执行用户指定的应用程序
  7. 执行完毕后容器被终止。

如:

(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命令来退出容器,退出后容器就自动处于终止状态。

1.4 守护态运行

如果需要让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$ 

1.5 查看容器输出

要获取容器的输出信息,可以通过docker [container] logs [container ID|NAMES]命令。该命令支持的选项包括:

  • -details : 打印详细信息;
  • -f, -follow:持续保持输出;
  • -since string :输出从某个时间开始的日志;
  • -tail string : 输出最近的若干日志;
  • -t, -timestamps : 显示时间戳信息;
  • -until string : 输出某个时间之前的日志 。

如:sudo docker logs 002d5caaf325 。(002d5caaf325为CONTAINER ID)

2 停止容器

主要介绍Docker容器的pause/unpause、stop和prune子命令。

2.1 暂停容器

可以使用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 ... ]命令来恢复到运行状态 。

2.2 终止容器

可以使用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

3 进入容器

当使用-t参数是,会打开虚拟的终端,故而此时是已经进入了容器中的。

(base) pang@pang-HP:~/dockerfile$ sudo docker run -it centos:7 /bin/bash
[root@002d5caaf325 /]# 
[root@002d5caaf325 /]# exit

在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。此时如果需要操作容器,可以使用attachexec命令或nsenter工具等。

3.1 attach命令

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到同一个容器的时候,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

3.2 exec命令

从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命令。

3.3 nsenter工具

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

4 删除容器

可以使用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信号给容器,终止其中的应用,之后强行删除。

5 导入和导出容器

某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用Docker的导人和导出功能,这也是Docker自身提供的一个重要特性。

5.1 导出容器

导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态 。 可以使用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文件传输到其他机器上,然后再通过导人命令导入到系统中,实现容器的迁移 。

5.2 导入容器

导出的文件又可以使用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命令来导入一个容器快照到本地镜像库 。 这两者的区别在于:

  • 容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态);
  • 而镜像存储文件将保存完整记录,体积更大。 此外,从容器快照文件导人时可以重新指定标签等元数据信息 。

6 查看容器

主要介绍Docker容器的inspecttopstats子命令。

6.1 使用inspect命令查看容器详情

查看容器详情可以使用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",
...        

6.2 使用top命令查看容器内进程

查看容器内进程可以使用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$ 

6.3 使用stats命令查看统计信息

查看统计信息可以使用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

7 其他容器命令

主要介绍Docker容器的cp、diff、port和update子命令。

7.1 使用cp命令复制文件

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

7.2 使用diff命令查看变更

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$ 

7.3 查看端口映射

container port命令可以查看容器的端口映射情况。 命令格式为:

docker container port CONTAINER [PRIVATE_PORT[/PROTO]]

例如,查看容器的端口映射情况:

$ docker container port test
9000/tcp - > o.o o 0:9000

7.4 更新配置

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

你可能感兴趣的:(容器,docker,容器,kubernetes)