要让 docker 容器在 dockerd 重启时不中断,核心是启用 live-restore:在 /etc/docker/daemon.json 中配置 "live-restore": true,执行 systemctl reload docker 生效,并满足同主版本升级、不变更存储驱动与网络参数、避免 killmode=control-group 等前提条件。
要让 docker 容器在 dockerd 重启时不中断,核心就是正确配置 live-restore。它不是让升级变“热”,而是把容器进程交给内核直接托管——dockerd 停了,容器照常运行;新 dockerd 启动后自动重新接管。
1. 编辑或创建 daemon.json 文件
该文件默认不存在,需手动创建,路径固定为 /etc/docker/daemon.json:
- 用 root 权限编辑:
sudo vim /etc/docker/daemon.json - 写入标准 JSON 格式,确保语法严格:键名必须双引号、布尔值小写、末尾不加多余逗号
- 如果已有其他配置(如 registry-mirrors、log-driver),只需在对象内补上
"live-restore": true,并注意添加英文逗号分隔
✅ 正确示例(含其他常用配置):
{"registry-mirrors": ["https://jnh8ca4k.mirror.aliyuncs.com"],
"log-driver": "json-file",
"log-opts": {"max-size": "500m", "max-file": "3"},
"live-restore": true
}
2. 使配置生效(不中断服务)
live-restore 是 daemon 级特性,首次启用必须让 dockerd 加载新配置。推荐使用 reload 而非 restart:
-
sudo systemctl daemon-reload(刷新 systemd 配置) -
sudo systemctl reload docker(平滑重载 dockerd,不终止进程)
⚠️ 注意:若执行 systemctl restart docker 报错(如 “Job for docker.service failed”),大概率是 JSON 语法错误,重点检查逗号、引号和括号是否匹配。
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
3. 验证是否启用成功
运行命令确认:
docker info | grep -i "live restore"输出应为:Live Restore Enabled: true
若显示 false 或无输出,说明配置未生效,需检查文件路径、权限(root 所有、644 权限)、JSON 格式及 reload 是否执行成功。
4. 真正不中断的前提条件
live-restore 生效有硬性限制,违反任一条件都可能导致容器意外退出:
- 仅支持同一主版本内的补丁升级(例如 26.1.3 → 26.1.4),跨次版本(25.x → 26.x)会因运行时不兼容而接管失败
- 不能变更存储驱动(如 overlay2 → btrfs)、默认 bridge 网络参数(如
--bip)、data-root路径或其目录权限 - systemd 服务中避免设置
KillMode=control-group(默认值),否则重启时会连带杀死整个 cgroup 下的容器进程 - Swarm 模式下必须禁用 live-restore,二者互斥










