关键是要启用live-restore:在/etc/docker/daemon.json中配置{"live-restore":true},执行systemctl reload docker生效,仅支持同主版本补丁升级,且禁止变更存储驱动、bridge网络等关键配置。
要让 docker 容器在守护进程(dockerd)重启时不中断,关键就是正确配置 live-restore。它不是“热升级”开关,而是让容器进程脱离 dockerd 生命周期、由内核直接托管的保活机制——启用后,即使 dockerd 停了,容器还在跑;新 dockerd 启动后会自动重新接管。
确认 daemon.json 存在并添加 live-restore
编辑或创建配置文件:
sudo vim /etc/docker/daemon.json
写入标准 JSON 格式内容(已有其他配置的,只补上 "live-restore": true):
{ "live-restore": true }
注意:JSON 语法必须严格,末尾不能多逗号,键名用英文双引号,布尔值小写 true。
使配置生效且不中断服务
live-restore 是 daemon 级特性,首次启用必须让 dockerd 读取新配置。推荐用 reload(不终止进程):
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- sudo systemctl daemon-reload
- sudo systemctl reload docker(比 restart 更安全)
验证是否生效:
docker info | grep -i "live restore"
输出应为:Live Restore Enabled: true
升级或重启时真正不中断的关键条件
live-restore 起作用,需同时满足以下几点:
- 仅支持同一主版本内的补丁升级(如 26.1.3 → 26.1.4),跨次版本(25.x → 26.x)会因运行时不兼容导致接管失败
- 不能变更存储驱动(如 overlay2 → btrfs)、默认 bridge 网络参数(如 --bip)、data-root 路径或权限
- systemd 服务配置中需避免 KillMode=control-group(默认值),否则重启时 systemd 会杀掉整个 cgroup,包括容器进程
- Swarm 模式下禁用 live-restore,二者不兼容
验证容器是否真没断
执行 sudo systemctl restart docker 后,立刻检查:
- 容器进程仍在系统中:ps aux | grep -v grep | grep your-app
- docker 命令可恢复管理:docker ps 应显示原容器,状态为
Up X hours(非Up 1 second) - 业务端口持续响应,无连接拒绝或超时
日志可能有短暂缓冲丢失(尤其用 journald 驱动时),建议生产环境搭配 fluentd 或 logrotate 做外部日志采集。

















