容器生命周期状态转换是确定性流程:Created(镜像解压、命名空间初始化但无PID)、Running(PID 1启动、可写层启用)、Exited(主进程终止,文件系统与日志保留),三者为核心断点,分别对应资源准备、进程执行与终结。

容器生命周期的状态转换不是随意跳转的,而是由明确命令触发、受底层运行时(runc)控制的确定性流程。Created、Running、Exited 这三个状态是核心断点,每一步都对应资源分配、进程调度和命名空间的实际变化。
Created → Running:启动即分配运行时上下文
Created 状态表示容器已初始化文件系统、网络命名空间和存储驱动,但 PID namespace 未激活,主进程尚未启动,ps 命令完全不可见。只有执行 docker start 或初始使用 docker run(等价于 create + start)时,Docker Daemon 才会:
- 为容器分配 CPU、内存配额,并挂载可写层
- 在 PID namespace 中启动 ENTRYPOINT/CMD 指定的进程,该进程成为 PID 1
- 启用 cgroups 限制与网络栈绑定
此时容器进入 Running 状态——不是“开了个壳”,而是真实进程已在隔离环境中持续执行。
Running → Exited:主进程终止即状态终结
Exited 不等于“崩溃”或“失败”,它只是表明 PID 1 进程已退出(无论 exit code 是 0、137 还是 143)。触发方式包括:
-
docker stop:发送 SIGTERM,等待默认 10 秒后发 SIGKILL -
docker kill:直接发送指定信号(如 -s KILL) - 应用自身调用 exit()、panic、OOM 被内核杀死(exit 137)
注意:Exited 状态下容器的文件系统、日志、元数据全部保留,docker inspect 仍可查 ExitCode 和 StartedAt/FinishedAt 时间戳。
Exited 不可直接回到 Running,必须经由 stopped 或 created 中间态
Docker CLI 将 Exited 和 stopped 视为同义(docker ps -a 中统一显示为 Exited),但底层逻辑上,Exited 是进程终止后的瞬时终态,而 stopped 是容器对象仍被守护进程管理的“待重启”状态。因此:
- 从 Exited 状态恢复运行,必须用
docker start—— 它不是“唤醒”,而是重新初始化 runtime 上下文并再次启动 PID 1 - 不能对 Exited 容器执行
docker unpause(仅对 paused 状态有效) - 若需彻底重置,应先
docker rm删除,再docker run全新创建
状态转换本质是资源生命周期的映射:Created 是声明式准备,Running 是进程级执行,Exited 是进程终结但容器实体尚存。理解这点,才能避免把容器当成虚拟机来“开机/关机”操作。


















