容器状态变化遵循明确的生命周期规则,包含created、running、paused、exited、dead五种核心状态,每种状态对应特定底层行为及触发命令,异常滞留可据此快速定位问题。

容器状态变化不是随机的,而是遵循一套明确的生命周期规则。理解这个流程,能帮你快速定位启动失败、卡在某个状态或无法删除等问题。
容器的5种核心状态及其含义
Docker容器在运行过程中主要经历以下五种状态,每种状态对应明确的底层行为:
-
created:容器已创建但尚未启动,镜像层已解压、网络和存储驱动已初始化,但 PID namespace 尚未启用,
ps不可见 -
running:主进程(即
ENTRYPOINT或CMD指定的进程)正在运行中,容器处于活跃执行状态 -
paused:通过
docker pause冻结所有进程的执行(使用 cgroups freezer),内存和文件系统保持原样,但 CPU 时间片被暂停分配 - exited:主进程已终止(无论成功或崩溃),容器停止运行,但文件系统和日志仍保留,可查看退出码
- dead:容器进程已不可恢复地终止,且 Docker daemon 在清理资源时遇到阻塞(如挂载点繁忙、内核状态异常),通常需手动干预
状态转换的关键触发动作
每个状态跃迁都由具体命令或系统事件驱动,而非自动发生:
-
docker create→ created:仅准备运行环境,不启动进程 -
docker start→ running:启动主进程;若为已退出容器,会复用原有文件系统并重新运行入口命令 -
docker stop→ exited:先发SIGTERM(默认等待10秒),超时后发SIGKILL强制终止 -
docker pause→ paused:冻结所有子进程;docker unpause可恢复,无需重启进程 -
docker rm→ 容器从文件系统移除:仅对 exited 或 created 状态有效;running/paused 需先停止或解冻
常见异常状态与排查线索
某些状态长期滞留,往往指向特定问题:
- 卡在 created:检查
docker create命令是否遗漏必要参数(如卷挂载路径不存在、设备节点权限不足) - 启动后立即变为 exited:运行
docker logs <container>查看首条错误;多数因入口命令不存在、配置文件缺失或权限拒绝导致 - 停在 dead:执行
docker inspect <container>查看Status.State和Status.Status.Error字段;常见于容器内进程持有 mount、network namespace 锁,或宿主机内核版本过低 -
paused 状态下无法 exec:因为进程被冻结,
docker exec依赖目标进程可调度,此时会报错Container is paused
生命周期图谱(文字简述)
虽无图形,但可按顺序梳理关键路径:
- 起点:
docker create→ created - 常规运行路径:created →
docker start→ running →docker stop→ exited - 中断调试路径:running ↔
docker pause/unpause↔ paused - 强制终止路径:running →
docker kill→ exited(退出码 137 表示 SIGKILL) - 终结路径:exited →
docker rm→ 彻底消失;created 同样支持直接rm
掌握这些状态边界和转换条件,比死记流程图更实用。实际操作中,多结合 docker ps -a、docker inspect 和日志输出,就能快速还原容器“发生了什么”。










