Docker 容器的生命周期包含哪些状态?
Docker 容器的生命周期是指容器从创建、运行、暂停、停止到最终被销毁的整个过程。
在 Docker 的底层技术(如 containerd 和 runc)中,容器的生命周期状态主要可以划分为以下 7 种状态。你可以通过 docker ps -a 命令查看容器当前处于哪种状态。
以下是这 7 种状态的详细解析:
1. Created(已创建)
- 状态说明:容器的对象已被创建,磁盘上的容器镜像已解压并准备好读写层,但容器内的主进程(PID 1)尚未启动。
- 触发命令:
docker create <image> - 后续操作:可以使用
docker start启动它。
2. Running(运行中)
- 状态说明:容器的主进程正在运行,容器正在消耗 CPU、内存等系统资源,并执行其预设的任务。
- 触发命令:
docker run(创建并直接运行)docker start(启动一个已存在的容器)docker restart(重启容器)
3. Paused(已暂停)
- 状态说明:容器中的所有进程都被挂起(暂停)。此时,容器不占用 CPU 资源,但其内存状态会被保留。这利用了 Linux 的
cgroups freezer机制。 - 触发命令:
docker pause - 恢复命令:
docker unpause(恢复到 Running 状态)
4. Exited(已停止 / 退出)
- 状态说明:容器的主进程已经停止运行。此时容器不再占用 CPU 和内存,但容器的镜像层、读写层数据以及容器的配置信息依然保存在宿主机磁盘上。
- 触发原因:
- 手动停止:执行
docker stop(发送 SIGTERM 信号,超时后发送 SIGKILL)或docker kill(直接发送 SIGKILL)。 - 自然退出:容器内部的主任务执行完毕(例如一个跑完测试的脚本)。
- 崩溃退出:容器内程序发生错误(通常伴随非 0 的退出码,如
Exited (1))。
- 手动停止:执行
5. Restarting(重启中)
- 状态说明:这是一个短暂的过渡状态。当容器因为配置了重启策略(如
--restart=always或--restart=on-failure)而在崩溃后尝试自动重启时,会显示此状态。 - 触发原因:容器异常退出,Docker 守护进程正在尝试重新拉起它。
6. Removing(删除中)
- 状态说明:这是一个非常短暂的中间状态。Docker 正在清理容器的读写层、网络配置和元数据。
- 触发命令:
docker rm或docker rm -f。 - 注意:如果容器很大或系统 I/O 极慢,可能会短暂看到这个状态。
7. Dead(已损坏 / 无法删除)
- 状态说明:这是一种异常状态。通常发生在尝试删除(
docker rm)一个正在运行的容器,或者在删除过程中由于系统 I/O 错误、文件锁占用等原因导致删除失败。 - 处理方法:通常需要强行删除(
docker rm -f)或重启 Docker 服务来清理。
状态转换图(生命周期流程)
你可以用以下简化的流向来理解它们之间的转换:
plaintext
[ 镜像 (Image) ]
│
│ docker create
▼
┌──────────┐
│ Created │◄────────────────┐
└────┬─────┘ │
│ docker start │
▼ │
┌──────────┐ docker stop │
┌─────►│ Running ├────────────────►┤
│ └────┬───▲─┘ │
│ │ │ │
│ docker│ │docker │
│ pause │ │unpause │
│ ▼ │ │
│ ┌──────────┐ │
│ │ Paused │ │
│ └──────────┘ │
│ │
│ docker restart │ docker rm
└───────────────────────────────────┼──────────► [ 销毁 (Destroyed) ]
│
┌──────┴───┐
│ Exited │
└──────────┘
实用命令小贴士:
- 查看所有状态的容器:
docker ps -a - 查看正在运行的容器:
docker ps - 过滤特定状态的容器:
docker ps -f status=paused(可选状态有:created,restarting,running,removing,paused,exited,dead)
右滑查看面试常问