文章目录
- 一.创建容器
- 1.新建容器
- 2.启动容器
- 3 . 新建并启动容器
- 4. 守护态运行
- 5. 查看容器输出
- 二.停止容器
- 1. 暂停/恢复容器
- 2. 终止容器
- 三.进人容器
- 1.attach命令
- 2.exec命令
- 四.删除容器
- 五.导入和导出容器
- 1.导出容器
- 2.导入容器
- 六.查看容器
- 1.查看容器详情
- 2.查看容器内进程
- 3.查看统计信息
- 七.其他容器命令
- 1.复制文件
- 2.查看变更
- 3.查看端口映射
- 4.更新配置
容器是 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 等辅助工具来处理负载均衡,自动切换故障的应用容器。