重启 Docker 守护进程会不会把所有容器带走?live-restore 能不能让容器活下来?为了不动真实的 Docker Desktop,这篇在一个嵌套的 dockerd 里反复停止和重启,对比默认与 live-restore 的表现。
dockerd 启动参数:(无);docker info 的 LiveRestoreEnabled = false;容器 tc 启动,容器主进程在嵌套环境里的 PID = 695 给 dockerd 发 SIGTERM 并等它退出,用时 10.3 秒;容器的主进程 695:已不在 重新启动 dockerd 后:容器 Status=exited Pid=0 ExitCode=137;StartedAt 与重启前相同 docker ps 里的容器:(没有运行的容器)
停止 dockerd 会先把所有容器停掉(SIGTERM,等宽限期后再 SIGKILL);这个嵌套的 dockerd 没有 Docker Desktop 的 3 秒默认值,所以等了 10 秒。重启后容器是 exited,退出码 137。
dockerd 启动参数:--live-restore;docker info 的 LiveRestoreEnabled = true;容器 tc 启动,容器主进程在嵌套环境里的 PID = 1824 给 dockerd 发 SIGTERM 并等它退出,用时 0.1 秒;容器的主进程 1824:还活着 重新启动 dockerd 后:容器 Status=running Pid=1824 ExitCode=0;StartedAt 与重启前相同 docker ps 里的容器:tc Up Less than a second
开启 --live-restore(或 daemon.json 里的 "live-restore": true)后,停 dockerd 不再停容器;dockerd 重新启动时重新接管它们,PID 和 StartedAt 都没变。
dockerd 启动参数:--live-restore;docker info 的 LiveRestoreEnabled = true;容器 tc 启动,容器主进程在嵌套环境里的 PID = 2621 给 dockerd 发 SIGKILL 并等它退出,用时 0.1 秒;容器的主进程 2621:还活着 重新启动 dockerd 后:容器 Status=running Pid=2621 ExitCode=0;StartedAt 与重启前相同 docker ps 里的容器:tc Up Less than a second
kill -9 dockerd 也一样。我清除了遗留的 pid 文件才重启(没有清理时会不会失败,我没有测)。
dockerd 停着时:容器的 sleep 进程仍在运行(pgrep 得到 PID 3356);docker ps → 退出码 1;failed to connect to the docker API at unix:///var/run/docker.sock; check if the path is c 重启后 docker logs tc:tick Docker Desktop 本身的 daemon.json 里有 live-restore 吗?0 处(0 表示没有配置,即默认关闭)
dockerd 停着的时候容器还在跑,但你什么 docker 命令都用不了,也无法修改容器的配置。据我所知 live-restore 与 Swarm 模式不兼容,但这一点我没有查文档也没有验证。在真正的 Docker Desktop 上我没有重启守护进程,因为会中断其它正在运行的容器。