bigywater.tech
Docker · 31

docker run 的生命周期:create、start 与状态机

docker run 一条命令背后是 create 加 start,容器还有 created、paused、exited 这些状态。这篇逐个状态读 docker inspect,再用 docker events 看完整事件序列,并量一下各步骤的用时。

created / Pid=0
docker create 之后:没有进程、没有 IP,docker ps 不带 -a 看不见
信号 15 → 9
docker stop 在 docker events 里依次出现的两个 kill 事件
243 ms
docker run --rm alpine true 整套的中位数(create 76 + start 168 左右)

create 之后

实测 · 本机执行输出
  docker create 之后:Status=created Running=False Paused=False Pid=0 ExitCode=0 StartedAt=(零值) FinishedAt=(零值)
  docker ps(不带 -a)里有它吗?False;docker ps -a 的 STATUS 列:Created
  网络里有 IP 吗?False(False 说明 create 时还没连网)
  docker start 之后:Status=running Running=True Paused=False Pid=>0 ExitCode=0 StartedAt=有 FinishedAt=(零值)
  docker ps -a 的 STATUS 列:Up Less than a second;有 IP 了吗?True

docker create 之后容器处于 created:没有进程(Pid=0),StartedAt 是零值,没有 IP,docker ps 不加 -a 看不到它。docker start 之后才有进程和网络。

暂停与停止

实测 · 本机执行输出
  docker pause 之后:Status=paused Running=True Paused=True Pid=>0 ExitCode=0 StartedAt=有 FinishedAt=(零值)
  docker unpause 之后:Status=running
  docker stop -t 1 之后:Status=exited Running=False Paused=False Pid=0 ExitCode=137 StartedAt=有 FinishedAt=有(耗时 1135 ms,sh 是 PID 1 不处理 SIGTERM,所以等满了 1 秒后被 SIGKILL)
  对已停止的容器 docker exec → 退出码 1;Error response from daemon: container 3ed60b1aa0607b461bf66eb4f2be0c9a19b9d9d488cb6ae7ba43
  再 docker start:Status=running Running=True Paused=False Pid=>0 ExitCode=0 StartedAt=有 FinishedAt=有;之前写的 /f 还在吗?hi;RestartCount=0(手动 start 不计入)

pause 的容器 Running 仍是 True,Paused 是 True;stop 之后 exited,可写层的文件在,再 start 同一个容器可以继续用(RestartCount 仍是 0,只有重启策略触发的才计数,这一点我只验证了手动 start 的情形)。本文里 sh 是 PID 1、不处理 SIGTERM,所以 -t 1 等满 1 秒才被杀(ExitCode 137,见后面的退出码一篇)。

删除

实测 · 本机执行输出
  对运行中的容器 docker rm → 退出码 1;Error response from daemon: cannot remove container "3ed60b1aa0607b461bf66eb4f2be0c9a19b9d9d488cb6ae
  docker rm -f → 退出码 0

运行中的容器必须 docker rm -f 才能删。

事件序列

实测 · 本机执行输出
  create → attach → start → die → destroy
  对比分步做:docker create / start / stop / rm 的事件
  create → start → kill(信号 15) → kill(信号 9) → stop → die → destroy

docker events 里,run --rm 是 create → attach → start → die → destroy;stop 会产生两个 kill 事件,信号分别是 15 和 9,然后是 stop、die。

耗时

实测 · 本机执行输出
  create:[90, 76, 96, 44, 46] ms,中位数 76 ms
  start:[168, 213, 172, 143, 144] ms,中位数 168 ms
  run --rm true(整套):[243, 318, 224, 292, 177] ms,中位数 243 ms
  rm:[51, 57, 52, 52, 46] ms,中位数 52 ms

create 约 76 ms,start 约 168 ms,rm 约 52 ms,run --rm 整套约 243 ms(5 次中位数,波动明显)。这些数字包含 docker CLI 进程启动的开销。

分步演示

容器生命周期
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Docker Desktop(Engine 29.8.2,容器跑在 Docker Desktop 自带的 Linux 虚拟机里,内核与宿主机的 macOS 不同);镜像为 linux/arm64;需要看虚拟机内部时用特权容器 + nsenter;计时用 time / date +%s%N,数字每次运行会有小幅抖动。状态取自 docker inspect 的 State;事件取自 docker events --since/--until 并按容器名过滤(过滤后没有网络事件);耗时用 Python time.time 测 docker CLI 调用,5 次取中位数;实验后已删除容器
    • 没有验证:restarting 与 dead 状态、重启策略下的 RestartCount(见后面的重启策略一篇)、docker kill 与 stop 的差别、容器内进程树(见 containerd shim 一篇)、docker events 里的网络事件
    京ICP备2026067502号-1京公网安备11010502063487号