【Docker 05】Container - 容器
🌈 一、容器介绍
⭐ 01. 什么是容器
- 镜像(image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样。
- 镜像是静态的只读文件,而容器是镜像运行起来的实体,容器带有运行时需要的可写文件层。
- 容器中的进程属于运行状态,即容器内运行着真正的应用进程,容器有 5 种状态,分别是:创建、启动、停止、删除、暂停。
容器的本质
- 容器本质上是在主机上运行的一个进程,但是容器有着自己独立的命名空间隔离和资源限制(容器可以拥有自己的 root 文件系统、网络配置、进程空间、用户 ID 空间)。容器内的进程运行在一个隔离的环境中,在容器内部无法看到主机上的进程、环境变量、网络等信息。
- 和镜像一样,容器也采用分层存储。每个容器在运行时,是以镜像为基础层,在上面创建一个当前容器的存储层,这个存储层被称为容器存储层。
⭐ 02. 为什么需要容器
- 镜像只是一个静态的文件,并不能提供服务。就好比一个装着操作系统(OS)的光盘一样,这个光盘就是一个静态的文件,并不能提供服务。只有将这个光盘中的 OS 安装到主机里运行起来才可以对外提供服务。
容器的优势
- 资源利用率高:可以将利用率较低的服务器资源进行整合,用更少的硬件资源运行更多的业务。
- 环境标准化:镜像打包了一个应用需要的所有的依赖信息,解决了环境差异化的问题,而容器是在镜像的基础上添加的一层,天然具备环境标准化的能力。
- 资源弹性伸缩:借助容器能够实现资源的控制(控制每个容器能够使用的内存、CPU 等资源)。
- 差异化环境提供:假设当前有两个服务,分别要在 Ubuntu 和 Centos 上,此时容器就可以很好的提供多种不同的环境。
- 沙箱安全:容器内的文件与主机是隔离的,对容器内的文件进行操作,或者容器内的应用崩了不会影响到宿主机。
- 比虚拟机更轻量、启动更快:容器它就是一个进程,不用开机关机什么的。
- 维护和扩展容易:容器依赖于镜像技术,使得在应用重复部分的复用更加容器,也让应用的维护更新更加简单
⭐ 03. 容器的生命周期
- 容器的生命周期指的是容器可能处于的状态,分别有以下 5 种状态:
- 初建:
created
- 运行:
running
- 停止:
stopped
- 暂停:
paused
- 删除:
deleted
- 初建:
1. 各生命周期之间的转换关系
说明 | |
---|---|
docker create | 创建容器后,不立即启动运行,容器进入创建状态 |
docker run | 创建容器,并立即启动运行,进入运行状态 |
docker start | 容器进入运行状态 |
docker stop | 容器进入停止状态 |
docker kill | 容器在故障(死机)时,执行 kill(断电),让容器进入停止状态。注:该操作容易丢失数据,除非必须,否则不建议使用。 |
docker restart | 重启容器,让容器进入运行状态 |
docker pause | 容器进入暂停状态 |
docker unpause | 容器退出暂停状态,进入运行状态 |
docker rm | 删除容器,让容器进入删除状态 |
killed by-out-of-memory | 因为内存不足而被终止:宿主机内存被耗尽,也被称为 OOM,此时 Linux 会杀死最占内存的容器。如果一个容器因为触发了 OOM 机制而被干掉了,它是被系统而不是 Docker 干掉的。 |
container process exited | 异常终止:出现容器被终止后,进入 restart? 选择操作;Yes 则需要重启,执行 start 命令,转为运行状态;No 则不需要重启,容器转为停止状态。 |
2. 容器 OOM
- Docker 在处理 OOM 事件时,分别有以下 3 种情况:
- 如果容器中的应用耗尽了主机系统分配给该容器的内存限制,就会触发 OOM 事件。此时的容器并不是被 Docker 关闭的,而是被宿主机操作系统关闭的。
- 如果用户并不想关闭这个容器,可以通过
--oom-kill-disable
来禁用 OOM-Killer。注:在使用该参数时,如果使用 -m 设置了该容器的内存上限,一旦该容器达到了内存上限,主机不会关闭该容器,但也不会继续给该容器分配资源。 - 如果用户使用了
--oom-kill-disable
,但没有使用 -m 选项来设定资源上限,主机就会尽可能的为该容器分配资源,即主机有多少资源,容器就能占多少。
3. 容器异常退出
- 每个容器内部都有一个
Init
进程,容器中的其他所有进程都是该进程的子进程。如果某个子进程因为某种原因退出了,它的父进程也会同步退出,直到Init
进程也退出位置。如果Init
进程也退出了,则表示该容器被关闭了。 - Docker 目前没办法直到此时的进程退出是不是正常退出,容器一旦出现关闭情况,Docker 就会尝试将该容器由 Stopped 状态转换为 Running 状态(前提:容器被设置了
--restart
参数,否则会保持在停止状态)。
4. 容器暂停
- 容器被 Docker 剥夺了 CPU 资源,但其他资源(如 Memory、Network)还保留没动。
- 失去了 CPU 资源的进程是不会被主机的内核系统所调度的,此时容器就处于暂停状态。
🌈 二、容器命令
命令 | 别名 | 功能 | |
---|---|---|---|
01 | docker create | docker container create | 创建容器 |
02 | docker run | docker container run | 运行容器 |
03 | docker ps | docker container ps | 查看正在运行的进程 |
04 | docker logs | docker container logs | 查看日志 |
05 | docker attach | docker container attach | 连接到正在运行的容器 |
06 | docker exec | docker container exec | 在运行的容器中执行命令 |
07 | docker start | docker container start | 启动容器 |
08 | docker stop | docker container stop | 停止容器 |
09 | docker restart | docker container restart | 重启容器 |
10 | docker kill | docker container kill | 杀死容器 |
11 | docker top | docker container top | 查看某个容器的资源占用 |
12 | docker stats | docker container stats | 查看资源占用信息 |
13 | docker container inspect | 查看容器的详细信息 | |
14 | docker port | docker container port | 查看容器的端口映射 |
15 | docker cp | docker container cp | 在容器和宿主机之间拷贝 |
16 | docker diff | docker container diff | 检查容器里文件结构的更改 |
17 | docker commit | docker container commit | 将镜像提交为容器 |
18 | docker pause | docker container pause | 暂停容器进程 |
19 | docker unpause | docker container unpause | 接触暂停,继续运行容器 |
20 | docker rm | docker container rm | 删除容器 |
21 | docker export | docker container export | 将容器导出为 tar |
22 | docker wait | docker container wait | 阻止 1 / n 个容器停止,然后打印退出代码 |
23 | docker rename | docker container rename | 重命名容器 |
24 | docker container prune | 删除停止的容器 | |
25 | docker update | docker container update | 更新容器配置 |
⭐ 01. docker create
- 用于创建一个新的容器,但是不启动它。
1. 基础语法
shelldocker create [options] image [command] [arg...]
options 的可选项 | 功能 |
---|---|
-i | 以交互模式运行容器,通常与 -t 同时使用 |
-P | 随机端口映射:容器内部的端口随机映射到主机的端口 |
-p | 指定端口映射:格式为 主机端口:容器端口 |
-t | 为容器重新分配一个伪输入终端,通常与 -i 同时使用 |
--name="nginx-lb" | 为容器指定一个名称 |
-h"mars" | 指定容器的 hostname |
-e username="ritchie" | 设置环境变量 |
--cpuset-cpus="0-2" 或 --cpuset-cppus="0,1,2" | 绑定容器到指定的 CPU 核上运行 |
-m | 设置容量使用内存最大值 |
--network="bridge" | 指定容器的网络连接类型 |
--link=[容器名] | 添加链接到另一个容器,可以访问另一个容器的网络 |
--volume 或 -v | 绑定一个卷 |
--rm | shell 退出的时候自动删除容器 |
--restart | 自动重启容器 |
2. 使用示例
- 使用 nginx:1.24.0 镜像创建一个名为
CoffeeCat
的容器,并将宿主机 8050 端口映射到容器的 80 端口上。
docker create --name CoffeeCat -p 8050:80 nginx:1.24.0
- 再使用
docker start CoffeeCat
启动这个容器。
- 在浏览器上访问本主机的 8050 端口,可以看到 nginx 已经在跑了。
⭐ 02. docker run
- 用于创建一个新的容器并运行一个默认 / 指定的命令。
1. 基础语法
docker run [options] image [command] [arg...]
options 的可选项 | 功能 |
---|---|
-d | 在后台运行容器,并返回容器的 ID;比 docker create 多了这个参数(不带该参数默认在前台) |
-i | 以交互模式运行容器,通常与 -t 同时使用 |
-P | 随机端口映射:容器内部的端口随机映射到主机的端口 |
-p | 指定端口映射:格式为 主机端口:容器端口 |
-t | 为容器重新分配一个伪输入终端,通常与 -i 同时使用 |
--name="nginx-lb" | 为容器指定一个名称 |
-h"mars" | 指定容器的 hostname |
-e username="ritchie" | 设置环境变量 |
--cpuset-cpus="0-2" 或 --cpuset-cppus="0,1,2" | 绑定容器到指定的 CPU 核上运行 |
-m | 设置容量使用内存最大值 |
--network="bridge" | 指定容器的网络连接类型 |
--link=[容器名] | 添加链接到另一个容器,可以访问另一个容器的网络 |
--volume 或 -v | 绑定一个卷 |
--rm | shell 退出的时候自动删除容器 |
--restart | 自动重启容器 |
2. 使用示例
- 使用 Docker 镜像 nginx:latest 以后台模式启动一个容器,并将该容器命名为 CoffeeCat2
docker run --name CoffeeCat2 -d nginx:latest
- 使用 Docker 镜像 nginx:latest 以后台模式启动一个容器,将容器的 80 端口映射到主机的 8060 端口,将主机的 /data 目录映射到容器的 /data 目录。
docker run -p 8060:80 -v /data:/data -d nginx:latest
⭐ 03. docker ps
- 该命令用于列出容器
1. 基础语法
docker ps [options]
options 的可选项 | 功能 |
---|---|
-a | 显示所有的容器,包括未运行的 |
-f | 根据条件过滤显示的内容 |
--format | 指定返回值的模板文件(如 json 或 table,默认为 table) |
-l | 显示 Latest 的容器 |
-n | 列出最近创建的 n 个容器 |
--no-trunc | 不截断输出 |
-q | 静默模式,只显示容器的编号 |
-s | 显示总的文件大小 |
2. 使用示例
- 显示所有的容器(包括未运行的)。
docker ps -a
- 显示容器名包含了 CoffeeCat 的所有容器。
docker ps -f name=CoffeeCat
⭐ 04. docker logs
- 该命令用于查看容器的日志信息。
1. 基础语法
docker logs [options] container
options 的可选项 | 功能 |
---|---|
-f 或 --follow | 持续跟踪日志输出 |
--since | 显示某个时间开始的所有日志 |
-t 或 --timestamps | 显示时间戳 |
-n 或 --tail | 仅列出最新的 n 条容器日志 |
2. 使用示例
- 持续跟踪查看容器 CoffeeCat 的日志输出
docker logs -f CoffeeCat
- 查看容器 CoffeeCat 从 2025 年 6 月 14 日后的最新 5 条日志。
docker logs --since="2025-06-14" --tail=5 CoffeeCat
⭐ 05. docker attach
- 该命令用于连接到某个正在运行的容器。
1. 基础语法
docker attach [options] container
options 的可选项 | 功能 |
---|---|
--sig-proxy | 是否将所有信号代理,默认为 true(退出时会导致容器退出),如果设置为 false,退出时不会影响容器。 |
2. 使用示例
- 连接到正在运行的 CoffeeCat 容器,当参数为默认的 true 时,按下 ctrl + c 会将容器 CoffeeCat 杀死。
docker attach CoffeeCat
- 如果将参数设置为 false 时,按下 ctrl + c 并不会将容器 CoffeeCat2 杀死。
docker attach --sig-proxy=false CoffeeCat2
⭐ 06. docker exec
- 用于在容器中执行命令。
1. 基础语法
docker exec [options] container command [arg...]
options 的可选项 | 功能 |
---|---|
-d | 分离模式,在后台运行 |
-i | 即使没有附加也保持 stdin 的开启 |
-t | 分配一个伪终端 |
-e | 设置环境变量 |
-u 或 user | 指定某个用户去运行 |
-w 或 --workdir | 指定工作目录 |
2. 使用示例
- 在容器 CoffeeCat 中,以交互模式执行 echo
docker exec -it CoffeeCat echo "hello world"
- 在容器 CoffeeCat 中,以交互模式打开 shell。如果想要退出的话,输入 exit 即可。
docker exec -it CoffeeCat bash
⭐ 07. docker start
- 用于启动 1 / n 个停止的容器
1. 基础语法
docker start [options] container [container...]
2. 使用示例
- 启动 CoffeeCat 和 CoffeeCat2 两个容器。
docker start CoffeeCat CoffeeCat2
⭐ 08. docker stop
- 用于停止 1 / n 个正在运行的容器。
1. 基础语法
docker stop [options] container [container...]
options 的可选项 | 功能 |
---|---|
-s | 发送 SIGTERM 信号 |
2. 使用示例
- 停止正在运行的 CoffeeCat 和 CoffeeCat2 容器。
docker stop CoffeeCat CoffeeCat2
⭐ 09. docker restart
- 用于重新启动 1 / n 个容器(将容器先停止,再启动)。
1. 基础语法
docker restart [options] container [container...]
options 的可选项 | 功能 |
---|---|
-s | 发送的信号 |
2. 使用示例
docker restart CoffeeCat
⭐ 10. docker kill
- 用于强制退出容器
1. 基础语法
docker kill [options] container [container...]
options 的可选项 | 功能 |
---|---|
-s | 发送 SIGKILL 信号 |
2. 使用示例
docker kill CoffeeCat
⭐ 11. docker top
- 用于查看容器中运行的进程信息,支持 ps 命令参数。
1. 基础语法
docker top container [ps options]
2. 使用示例
docker top CoffeeCat
⭐ 12. docker stats
- 用于显示容器资源的使用情况(CPU、内存、网络 I/O 等)。
1. 基础语法
docker stats [options] [container...]
options 的可选项 | 功能 |
---|---|
--all 或 -a | 显示所有容器的资源使用情况(包括未运行的) |
--format | 指定返回值的模板文件(如 table、json) |
--no-stream | 展示完当前状态就直接退出,不实时更新 |
--no-trunc | 不截断输出 |
2. 使用示例
- 列出所有正在运行的容器信息。
docker stats
返回报文 | 说明 |
---|---|
CONTAINER ID | 容器 ID |
NAME | 容器名称 |
CPU % | 容器使用的 CPU 的百分比 |
MEM USAGE / LIMIT | 容器正在使用的总内存,以及被允许使用的内存总量 |
MEM % | 容器使用的内存的百分比 |
NET I/O | 容器通过其网络接口发送和接收的数据量 |
BLOCK I/O | 容器从主机上的块设备读取和写入的数据量 |
PIDS | 容器创建的进程 / 线程数 |
⭐ 13. docker container inspect
- 用于查看容器的详细信息(如 IP、启动命令、使用的镜像等)。
1. 基础语法
docker container inspect [options] container [container...]
options 的可选项 | 功能 |
---|---|
-f | 指定返回值的模板文件(如 table、json) |
-s | 显示总的文件大小 |
2. 使用示例
docker container inspect CoffeeCat
⭐ 14. docker port
- 用于列出指定容器的端口映射,或者查找将 PRIVATE_PORT NAT 到面向公众的端口。
1. 基础语法
docker port container [private_port[/proto]]
2. 使用示例
docker port CoffeeCat
⭐ 15. docker cp
- 用于再容器和宿主机之间拷贝文件。
1. 基础语法
# 将容器内的文件拷贝到宿主机中
docker cp [options] container:src_path dest_path|-
# 将宿主机中的文件拷贝到容器内
docker cp [options] src_path|- container:dest_path
2. 使用示例
- 将主机的 /www/ 目录拷贝到 CoffeeCat 的 /www 目录下。
docker cp /www/ CoffeeCat:/www/
- 将 CoffeeCat 容器的 /www/ 目录拷贝到主机的 /wwwbak 目录下。
docker cp CoffeeCat:/www/ /wwwbak/
⭐ 16. docker diff
- 用于检查容器里文件结构的更改
1. 基础语法
docker diff container
2. 使用示例
docker diff CoffeeCat
说明 | |
---|---|
A | add:新增的内容 |
C | change:该文件被修改过 |
D | delete:被删除的文件 |
⭐ 17. docker commit
- 用于将运行中的容器提交为一个新的镜像
1. 基础语法
docker commit [options] container [repository[:tag]]
options 的可选项 | 功能 |
---|---|
-a | 提交的镜像作者 |
-c | 使用 Dockerfile 指令来创建镜像,可以修改启动指令 |
-m | 提交时的说明文件,用于描述提交的这个镜像 |
-p | 在 commit 时,将该容器暂停 |
2. 使用示例
- 将正在运行的 CoffeeCatForCommit 容器提交为一个名为 mywebsite:v1.0 的镜像。
docker commit CoffeeCatForCommit mywebsite:v1.0
⭐ 18. docker pause
- 用于暂停容器中所有的进程(剥夺容器内进程的 CPU 时间片)。
1. 基础语法
docker pause container [container...]
2. 使用示例
docker pause CoffeeCat
⭐ 19. docker unpause
- 用于恢复容器中所有被暂停的进程。
1. 基础语法
docker unpause container [container...]
2. 使用示例
docker unpause CoffeeCat
⭐ 20. docker rm
- 用于删除处于停止状态的容器
1. 基础语法
docker rm [options] container [container]
options 的可选项 | 功能 |
---|---|
-f | 通过 SIGKILL 信号强制删除运行中的容器 |
2. 使用示例
- 删除 1 / n 个容器(这里就删除 CoffeeCat2 容器)
docker stop CoffeeCat2
docker rm CoffeeCat2
- 删除所有停止的容器
docker rm $(docker ps -a -q)
⭐ 21. docker export
- 用于导出容器中的内容为 tar 文件
1. 基础语法
docker export [options] container
options 的可选项 | 功能 |
---|---|
-o | 将导出的内容写入到指定文件 |
2. 使用示例
- 将 CoffeeCat 容器中的内容导出到 CoffeeCat2025.tar 文件中。
⭐ 22. docker wait
- 用于阻塞容器的运行直到容器停止,然后打印出它的退出代码。
1. 基础语法
docker wait container [container]
2. 使用示例
docker wait CoffeeCat
- 再新开一个终端,将这个 CoffeeCat 容器 kill 掉,就可以在原来的终端那里看到 CoffeeCat 的退出码了。
⭐ 23. docker rename
- 用于重命名容器
1. 基础语法
docker rename container new_name
2. 使用示例
- 将 CoffeeCat 改名为 NewCoffeeCat
docker rename CoffeeCat NewCoffeeCat
⭐ 24. docker container prune
- 用于删除所有停止的容器。该操作非常有风险,除非明确的知道自己要干什么,否则不建议使用该命令。
1. 基础指令
docker container prune [options]
options 的可选项 | 功能 |
---|---|
-f 或 --force | 不提示是否确认,强制进行删除、 |
⭐ 25. docker update
- 该命令用于更新容器的配置
1. 基础指令
docker update [options] container [container...]
options 的可选项 | 功能 |
---|---|
--cpus | CPU 数量 |
--cpuset-cpus | 使用哪些 CPU |
--memory | 内存限制 |
--memory-swap | 交换内存 |
--cpu-period | 指定容器对 CPU 的使用要在多长时间内重新做一次分配 |
--cpu-quota | 指定在某个周期内,最多可以有多少时间来跑这个容器 |
2. 使用示例
- 将 CoffeeCat 容器可用的内存更新为 400M
docker update --memory 400m