bigywater.tech
Docker · 84

live-restore:守护进程重启时容器还活着吗

重启 Docker 守护进程会不会把所有容器带走?live-restore 能不能让容器活下来?为了不动真实的 Docker Desktop,这篇在一个嵌套的 dockerd 里反复停止和重启,对比默认与 live-restore 的表现。

exited 137 对 running
重启 dockerd 之后,默认与 --live-restore 下容器的状态
10.3 秒 对 0.1 秒
给 dockerd 发 SIGTERM 到它退出,默认与 --live-restore 的用时
同一个 PID
live-restore 重启后,容器主进程的 PID 和 StartedAt 都没变

默认

实测 · 本机执行输出
  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。

live-restore

实测 · 本机执行输出
  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 上我没有重启守护进程,因为会中断其它正在运行的容器。

分步演示

live-restore
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Docker Desktop(Engine 29.8.2,容器跑在 Docker Desktop 自带的 Linux 虚拟机里,内核与宿主机的 macOS 不同);镜像为 linux/arm64;需要看虚拟机内部时用特权容器 + nsenter;计时用 time / date +%s%N,数字每次运行会有小幅抖动。实验在 docker:dind 镜像(Docker 29.9.0)的特权容器里单独起的 dockerd 上完成,存储驱动 vfs,里面只有一个 alpine:3.20 镜像和一个 sleep 600 容器;没有重启 Docker Desktop 的守护进程;停止是否完成用 ps 判断 dockerd 进程是否消失;实验后已删除嵌套环境
    • 没有验证:Docker Desktop 的守护进程开启 live-restore(需要改配置并重启,会中断其它容器)、live-restore 与网络(端口映射、userland-proxy)的关系、重启期间容器输出日志的去向、dockerd 版本升级时的 live-restore、kill -9 后不清理 pid 文件会怎样
    京ICP备2026067502号-1京公网安备11010502063487号