docker容器核心状态为created、running、paused、exited、dead和restarting,分别对应主进程未启动、运行中、被cgroups冻结、已退出、清理失败及重启中间态,转换由docker run/start/pause/stop/unpause等命令或进程事件驱动。
掌握 docker 容器状态转换,关键不是死记硬背,而是理解每个状态背后的资源行为和信号机制。只要清楚“谁在控制进程、哪些资源被释放或冻结”,转换逻辑自然就清晰了。
从进程生命周期看状态本质
容器状态本质上是其主进程(PID 1)所处的运行阶段,加上 Docker 守护进程对资源的管理动作:
- created:镜像已解压、文件系统就位、网络/存储未初始化,主进程还没启动
- running:主进程正在执行,CPU 可调度,内存已分配,网络栈激活
- paused:主进程被 cgroups 冻结(SIGSTOP 级别),不占 CPU,但内存、网络配置全保留
- exited:主进程已退出(无论正常 return 还是被 kill),Docker 停止监控,但文件系统和日志仍存在
- dead:退出后清理失败(如挂载点卡住、存储驱动异常),无法被 rm 或 restart
核心转换路径要盯住三个触发点
所有合法状态跳转都由明确命令或进程事件驱动,记住这三类动作就能推导出大部分关系:
- 启动类操作:docker run / docker start → created → running
- 中断类操作:docker pause → running → paused;docker stop → running/exited → exited(发送 SIGTERM,等待 10 秒后 SIGKILL)
- 恢复类操作:docker unpause → paused → running;docker restart → running/exited → restarting → running
容易混淆的两个细节
实际排查时,这两个点常导致误判:
- exited 不等于失败:STATUS 显示 Exited (0) 2 hours ago 表示主进程主动退出且返回码为 0(如单次脚本执行完毕),属于预期行为
- restarting 是临时中间态:它只在 restart 策略生效时短暂出现(比如 --restart=on-failure),不会出现在 docker ps -a 的长期列表中,用 docker inspect 查看 State.Status 才能确认
快速验证状态链的实操方法
不用翻文档,一条命令链就能跑通典型路径:
- 创建但不启动:
docker create --name demo hello-world→ 状态为 created - 启动并确认:
docker start demo && docker ps -f name=demo→ 状态变 running,随即退出(hello-world 是单次命令)→ 变为 exited - 再试暂停(需运行中容器):
docker run -d --name loop alpine sleep 3600,稍等后执行docker pause loop→ STATUS 显示 “Paused”











