docker run 一条命令背后是 create 加 start,容器还有 created、paused、exited 这些状态。这篇逐个状态读 docker inspect,再用 docker events 看完整事件序列,并量一下各步骤的用时。
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 进程启动的开销。