三、操作Docker容器(持续性纠正更新......)


容器是 Docker 的另一个核心概念。 简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态 。
如果认为虚拟机是模拟运行的一整套操作系统(包括内核 、 应用运行态环境和其他系统环境)和跑在上面的应用 。 那么 Docker 容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境 。

一.创建容器

1.新建容器

docker create :创建一个新的容器但不启动它
语法格式:docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
实例:

[root@LB-nginx-01 ~]# docker create -it centos:latest
104988bbe0966ae4865cf14dbbeae6d77298157b565877daf1194bbccaed9d1a
[root@LB-nginx-01 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
104988bbe096        centos:latest       "/bin/bash"         7 seconds ago       Created                                 elastic_williamson

使用 docker create 命令新建的容器处于停止状态,可以使用 docker start 命令来启动它。
选项主要包括如下几大类 : 与容器运行模式相关、与容器环境配置相关、与容器资源限制和安全保护相关:
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= “”容器内的默认工作目录

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=" "指定容器的别名

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

参数解释
- -blkio-weight=10~1000容器读写块设备的1/0性能权重,默认为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=[ ]挂载设备的读速率(以每秒io次数为单位)限制
- -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内存耗尽时是否杀死容器
- -00m-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来限制最大文件数、最大进程数

2.启动容器

使用 docker [container] start 命令来启动一个已经创建的容器。 例如,启动刚创建的 centos容器 :

[root@LB-nginx-01 ~]# docker start 104988bbe096
104988bbe096
[root@LB-nginx-01 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
104988bbe096        centos:latest       "/bin/bash"         About a minute ago   Up 5 seconds                            elastic_williamson

3 . 新建并启动容器

所需要的命令主要为 docker run,等价于先执行 docker create 命令,再执行 docker start 命令 。
docker run :创建一个新的容器并运行一个命令
语法格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
options说明:

-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
--volume , -v: 绑定一个卷

当利用 docker run 来创建并启动容器时, Docker 在后台运行的标准操作包括:
➢ 检查本地是否存在指定的镜像,不存在就从公有仓库下载;
➢ 利用镜像创建一个容器,并启动该容器;
➢ 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层 ;
➢ 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去;
➢ 从网桥的地址池配置一个 IP 地址给容器;
➢ 执行用户指定的应用程序;
➢ 执行完毕后容器被自动终止 。

下面的命令启动一个 bash 终端,允许用户进行交互:

[root@LB-nginx-01 ~]# docker run --name centos_docker -it centos /bin/bash
[root@7e003faf7500 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@7e003faf7500 /]# pwd
/
[root@7e003faf7500 /]# ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
   15 pts/0    00:00:00 ps
在容器内用 ps 命令查看进程,可以看到,只运行了 bash 应用,并没有运行其他无关的进程。用户可以按 Ctrl+d 或输入 exit 命令来退出容器:
[root@7e003faf7500 /]# exit
exit

对于所创建的 bash 容器,当用户使用 exit 命令退出 bash 进程之后,容器也会自动退出 。 这是因为对于容器来说,当其中的应用退出后,容器的使命完成,也就没有继续运行的必要了 。
某些时候,执行 docker [container] 川口时候因为命令无法正常执行容器会出错直接退出, 此时可以查看退出 的错误代码 。
默认情况下,常见错误代码包括 :
➢ 125 : Docker daemon 执行出错,例如指定了不支持的 Docker 命令参数;
➢ 126 :所指定命令无法执行,例如权限出错 ;
➢ 127 : 容器内命令无法找到 。
命令执行后出错,会默认返回命令的退出错误码 。

4. 守护态运行

更多的时候,需要让 Docker 容器在后台以守护态( Daemonized)形式运行。 此时,可以通过添加- d 参数来实现。
例如,下面的命令会在后台运行容器 :

[root@LB-nginx-01 ~]# docker run  -d centos  /bin/sh -c "while true; do echo hello world; sleep l; done"
c2d5f7b8ada0db8438f30417e101a5c1536c7023774cb4c0639579d06e49dcc0

容器启动后会返回一个唯一的 id ,也可以通过 docker ps 或 docker container ls命令来查看容器信息:

[root@LB-nginx-01 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c2d5f7b8ada0        centos              "/bin/sh -c 'while t…"   54 seconds ago      Up 54 seconds                           crazy_faraday
[root@LB-nginx-01 ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c2d5f7b8ada0        centos              "/bin/sh -c 'while t…"   2 minutes ago       Up 2 minutes                            crazy_faraday

5. 查看容器输出

docker logs : 获取容器的日志
语法格式:docker logs [OPTIONS] CONTAINER
options说明:

 --details : 打印详细信息
-f : 跟踪日志输出
--since :显示某个开始时间的所有日志
-t : 显示时间戳	
--tail :仅列出最新N条容器日志
--until string : 输出某个时间之前的日志 

实例:跟踪查看容器mynginx的日志输出

[root@LB-nginx-01 ~]# docker logs -f  3b675956c5cb
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up

查看容器mynginx从2021年1月17日后的最新2条日志

[root@LB-nginx-01 ~]# docker logs --since="2021-01-17" --tail=2 3b675956c5cb
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up

二.停止容器

1. 暂停/恢复容器

docker pause :暂停容器中所有的进程。
语法格式:docker pause [OPTIONS] CONTAINER [CONTAINER...]

实例:启动一个容器,并将其暂停:

[root@LB-nginx-01 ~]# docker run --name test --rm -d centos /bin/sh -c "while true; do echo hello world; sleep l; done"
1a3bf02a65f34fc1e4a601ebf82a38d5f7181e21ba7bb612892bfc9b650d2602
[root@LB-nginx-01 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
1a3bf02a65f3        centos              "/bin/sh -c 'while t…"   7 seconds ago       Up 6 seconds                            test
[root@LB-nginx-01 ~]# docker pause 1a3bf02a65f3
1a3bf02a65f3
[root@LB-nginx-01 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS               NAMES
1a3bf02a65f3        centos              "/bin/sh -c 'while t…"   40 seconds ago      Up 38 seconds (Paused)                       test

处于 paused 状态的容器,可以使用 docker unpause命令来恢复到运行状态 。
docker unpause :恢复容器中所有的进程。
docker unpause [OPTIONS] CONTAINER [CONTAINER...]
实例:将刚刚暂停的容器恢复

[root@LB-nginx-01 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS               NAMES
1a3bf02a65f3        centos              "/bin/sh -c 'while t…"   40 seconds ago      Up 38 seconds (Paused)                       test
[root@LB-nginx-01 ~]# docker unpause 1a3bf02a65f3
1a3bf02a65f3
[root@LB-nginx-01 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
1a3bf02a65f3        centos              "/bin/sh -c 'while t…"   4 minutes ago       Up 4 minutes                            test
对比 STATUS列观察其状态

2. 终止容器

docker stop :终止一个运行中的容器
语法格式:docker stop [OPTIONS] CONTAINER [CONTAINER...]
该命令会首先向容器发送 SIGTERM 信号,等待一段超时时间后(默认为 10 秒),再发送 SIGKILL 信号来终止容器:

[root@LB-nginx-01 ~]# docker stop 1a3bf02a65f3
1a3bf02a65f3
[root@LB-nginx-01 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
f4e94eb7ce3e        centos              "/bin/sh -c 'while t…"   29 seconds ago      Exited (137) 3 seconds ago                       test

此时,执行 docker container prune 命令,会自动清除掉所有处于停止状态的容器。

[root@LB-nginx-01 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
f4e94eb7ce3e        centos              "/bin/sh -c 'while t…"   29 seconds ago      Exited (137) 3 seconds ago                       test
[root@LB-nginx-01 ~]# docker container prune 
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
f4e94eb7ce3e6c6e7dae9a1eec34ea42f4fbea2e8f27096ddc9f53fe07f48be8

Total reclaimed space: 0B
[root@LB-nginx-01 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

此外,还可以通过 docker kill 直接发送 SIGKILL 信号来强行终止容器 。
当 Docker 容器中指定的应用终结时,容器也会自动终止 。 例用户通过 exit 命令或 Ctrl+d 来退出终端时,所创建的容器立刻终
止,处于 stopped 状态 。
可以用 docker ps -qa 命令看到所有容器的 ID。 例如 :

[root@LB-nginx-01 ~]# docker ps -qa
d0bc813cabcf
08155d6e09bf
f76f5f918b3d
9bdf0ff0069e

处于终止状态的容器,可以通过 docker start 命令来重新启动:

[root@LB-nginx-01 ~]# docker start  d0bc813cabcf
d0bc813cabcf
[root@LB-nginx-01 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
d0bc813cabcf        centos              "/bin/sh -c 'while t…"   4 minutes ago       Up 2 seconds                            test3

docker restart 命令会将一个运行态的容器先终止,然后再重新启动:

[root@LB-nginx-01 ~]# docker restart  d0bc813cabcf
d0bc813cabcf
[root@LB-nginx-01 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
d0bc813cabcf        centos              "/bin/sh -c 'while t…"   5 minutes ago       Up 4 seconds                            test3

三.进人容器

在使用- d 参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。这个时候如果需要进入容器进行操作,推荐使用官方的 attach 或 exec 命令。

1.attach命令

docker attach :连接到正在运行中的容器。
语法格式:docker attach [OPTIONS] CONTAINER
实例:

[root@LB-nginx-01 ~]# docker run -itd --name mytext centos
59b48d0cbff4b73d831f571511a875dbc4c1e39898ad52a0b7ea87e54c7d592a
[root@LB-nginx-01 ~]# docker attach mytext 
[root@59b48d0cbff4 /]# 

然而使用 attach 命令有时候并不方便 。 当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作了 。

2.exec命令

从 Docker 的 1.3.0 版本起, Docker 提供了一个更加方便的工具 exec 命令,可以在运行中容器内直接执行任意命令 。
docker exec :在运行的容器中执行命令
语法格式:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
options说明:

--detach, -d	:后台运行模式,在后台执行命令相关命令
--detach-keys	:覆盖容器后台运行的一些参数信息
--env, -e	:设置环境变量
--interactive, -i	:展示容器输入信息STDIN
--privileged	:为命令提供一些扩展权限
--tty, -t	:命令行交互模式
--user, -u	:设置用户名(format: <name|uid>[:<group|gid>])
--workdir, -w	:指定容器内的目录

实例:在容器 test中开启一个交互模式的终端:

[root@LB-nginx-01 ~]# docker exec -it test /bin/bash
[root@9bdf0ff0069e /]# 

在容器 test 中以交互模式执行容器内 常用命令:

[root@LB-nginx-01 ~]# docker exec -it test /bin/touch test
[root@LB-nginx-01 ~]# docker exec -it test /bin/ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var  yulei

四.删除容器

docker rm :删除一个或多个容器。
语法格式:docker rm [OPTIONS] CONTAINER [CONTAINER...]
options说明:

-f :通过 SIGKILL 信号强制删除一个运行中的容器。
-l :移除容器间的网络连接,而非容器本身。
-v :删除与容器关联的卷。

默认情况下, docker rm 命令只能删除已经处于终止或退出状态的容器,并不能删除还处于运行状态的容器 。
如果要直接删除一个运行中的容器,可以添加 - f 参数。 Docker 会先发送 SIGKILL 信号给容器,终止其中的应用,之后强行删除 :

[root@LB-nginx-01 ~]# docker rm test    #只能删除已经处于终止或退出状态的容器
test
[root@LB-nginx-01 ~]# docker rm -f test1    #强制删除正在运行的容器
test1
[root@LB-nginx-01 ~]# docker rm -f `docker ps -qa`     #强制删除所有容器
59b48d0cbff4
90faf221c739
957c694439dc
d0bc813cabcf
08155d6e09bf

五.导入和导出容器

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

1.导出容器

导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态
docker export :将文件系统作为一个tar归档文件导出到STDOUT。
````语法格式:docker export [OPTIONS] CONTAINER```
options说明:

-o :将输入内容写到文件。

实例:将id为5384a58e2ffe的容器按日期保存为tar文件。

[root@LB-nginx-01 ~]# docker export -o mysql-`date +%Y%m%d`.tar 5384a58e2ffe
[root@LB-nginx-01 ~]# ls mysql-`date +%Y%m%d`.tar
mysql-20210117.tar

之后,可将导出的 tar 文件传输到其他机器上,然后再通过导人命令导入到系统中,实现容器的迁移 。

2.导入容器

docker import : 从归档文件中创建镜像。
语法格式:docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
options说明:

-c :应用docker 指令创建镜像;
-m :提交时的说明文字;

实例:将上面导出的mysql-20210117.tar创建镜像,命名为yulei/centos:v4

[root@LB-nginx-01 ~]# docker import mysql-20210117.tar yulei/centos:v4
sha256:d4e4198ff4407da12e0e8a0cc03ad559e806d07c158451ef39c0ec62b2c1df18
[root@LB-nginx-01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
yulei/centos        v4                  d4e4198ff440        4 seconds ago       209MB

之前的文章中(Docker镜像的使用)曾介绍过使用 docker load 命令来导人一个镜像文件,与 docker import 命令十分类似 。实际上,既可以使用 docker load 命令来导入镜像存储文件到本地镜像库,也可以使用 docker import 命令来导入一个容器快照到本地镜像库 。 这两者的区别在于 : 容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大。 此外,从容器快照文件导人时可以重新指定标签等元数据信息 。

六.查看容器

1.查看容器详情

docker inspect : 获取容器/镜像的元数据。
语法格式:docker inspect [OPTIONS] NAME|ID [NAME|ID…]
实例:查看某容器的具体信息,会以 json 格式返回包括容器 Id 、 创建时间、路径、状态、镜像、配置等在内的各项信息:

[root@LB-nginx-01 ~]# docker inspect 5384a58e2ffe
[
    {
        "Id": "5384a58e2ffe4275258df1123d879ac3515d897bbd85e13fcbf7e970a9a3e58e",
        "Created": "2021-01-17T14:19:52.733783042Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 37969,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-01-17T14:19:53.139480475Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        .......
        }
    ]

输出量太多,就不一一截屏展示了。
上面代码返回的是一 个 JSON 格式的消息, 如果我们只要其中一项内容时, 可以使用 -f 来指定, 例如, 获取容器的详细Id:

[root@LB-nginx-01 ~]# docker inspect -f {{.Id}} 5384a58e2ffe
5384a58e2ffe4275258df1123d879ac3515d897bbd85e13fcbf7e970a9a3e58e

2.查看容器内进程

docker top :查看容器中运行的进程信息,支持 ps 命令参数。
语法格式:docker top [OPTIONS] CONTAINER [ps OPTIONS]
这个子命令类似于 Linux 系统中的 top 命令,会打印出容器内的进程信息,包括 PID 、用户、时间、命令等 。
实例:查看某容器内的进程信息:

[root@LB-nginx-01 ~]# docker top 5384a58e2ffe
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                37969               37953               0                   22:19               pts/0               00:00:00            /bin/bash

查看所有运行容器的进程信息:

[root@LB-nginx-01 ~]# for i in  `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done
 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                42196               42180               1                   22:45               pts/0               00:00:00            /bin/bash
 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                37969               37953               0                   22:19               pts/0               00:00:00            /bin/bash

3.查看统计信息

docker stats:实时监控容器资源数据统计
语法格式:docker [container] stats [OPTIONS] [CONTAINER ... ]
options说明:

 -a, --all:输出所有容器统计信息,默认仅在运行中;
     --format string:格式化输出信息;
     --no-stream :不持续输出,默认会自动更新持续实时结果;
     --no-trunc :不截断输出信息 。

[CONTAINER]:以短格式显示容器的 ID。
[CPU %]:CPU 的使用情况。
[MEM USAGE / LIMIT]:当前使用的内存和最大可以使用的内存。
[MEM %]:以百分比的形式显示内存使用情况。
[NET I/O]:网络 I/O 数据。
[BLOCK I/O]:磁盘 I/O 数据。
[PIDS]:PID 号。
实例:查看容器5384a58e2ffe实时资源数据统计

[root@LB-nginx-01 ~]# docker stats 5384a58e2ffe
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
5384a58e2ffe        relaxed_kilby       0.00%               524KiB / 661.9MiB   0.08%               656B / 0B           0B / 0B             1

七.其他容器命令

1.复制文件

docker cp :用于容器与主机之间的数据拷贝。
语法格式:

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

options说明:

-a, --archive:打包模式,复制文件会带有原始的 uid/gid 信息;
-L, --follow-link:跟随软连接。当原路径为软连接时\默认只复制链接信息,使用该选项会复制链接的目标内容 。

实例:将主机/root/test拷贝到容器5470272ef96e /centos目录中

[root@LB-nginx-01 ~]# docker cp /root/test 5470272ef96e:/centos
[root@LB-nginx-01 ~]# docker exec -it 5470272ef96e /bin/ls /centos
test

将容器5470272ef96e /1.txt拷贝到主机/root中

[root@LB-nginx-01 ~]# docker cp 5470272ef96e:/1.txt /root
[root@LB-nginx-01 ~]# ls 1.txt 
1.txt

2.查看变更

docker diff : 检查容器里文件结构的更改。
语法格式:docker diff [OPTIONS] CONTAINER
实例:查看容器5470272ef96e文件结构的变更

[root@LB-nginx-01 ~]# docker diff 5470272ef96e
A /1.txt
A /centos
A /centos/test
A /centos/linux
A /centos/linux/3.txt
A /centos/linux/1.txt
A /centos/linux/2.txt
A /yulei
A /centos1
A /centos1/1.txt
A /centos1/2.txt
A /centos1/3.txt

3.查看端口映射

docker port :列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口。
语法格式:docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]
实例:
查看容器1618fc5b1d78的端口映射情况

[root@LB-nginx-01 ~]# docker port 1618fc5b1d78
5000/tcp -> 0.0.0.0:5000

4.更新配置

docker update:更新一个或多个容器的配置
语法格式:docker update [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS 说明:

      --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 表示为对缓冲区无限制;
      --pids-limit int :调节容器pids限制(-1表示无限制)
      --restart string: 容器退出后的重启策略。

实例:

docker update --cpu-shares 512 f361b7d8465 		#更新 CPU 共享数量
docker update --restart=always f361b7d8465		#更新容器的重启策略
docker update -m 500M f361b7d8465				#更新容器内存

容器是直接提供应用服务的组件,也是 Docker 整个技术核中最为核心的概念 。 围绕容器,Docker 提供了十分丰富的操作命令,允许用户高效地管理容器的整个生命周期 。 可以使用 docker help 命令查看 Docker 支持的容器操作子命令 。
在生产环境中,为了提高容器的高可用性和安全性,一方面要合理使用资源限制参数来管理容器的资源消耗;另一方面要指定合适的容器重启策略,来自动重启退出的容器。 此外,还可以使用 HAProxy 等辅助工具来处理负载均衡,自动切换故障的应用容器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值