Docker 服务热重载与容器持久化运行指南
概述
本文提供两种在 Docker 服务维护时保障业务连续性的方案,适用于生产环境关键服务的高可用性场景:
- 配置热重载:无需重启 Docker 服务即可应用配置变更
- 容器持久化:服务重启时自动保留运行中容器状态
方案一:配置热重载(零停机时间配置更新)
操作步骤
- 执行配置重载(任选其一)
# 方法1:发送SIGHUP信号
sudo kill -SIGHUP $(pidof dockerd)
# 方法2:通过systemd重载
sudo systemctl reload docker
- 验证配置生效
# 检查`daemon.json`语法
sudo dockerd --config-file /etc/docker/daemon.json --validate
docker info | grep -i "<配置项>"
⚠️ 重要提示:
根据生产环境验证,当修改daemon.json
配置时:
- 修改已有配置项的值 →
docker info
可立即反映新值 - 删除原有配置项 →
docker info
仍保留删除前的旧值
建议通过docker info
或docker system info
严格验证配置变更效果。
适用场景
- 调整镜像加速器配置
- 修改日志驱动参数
- 动态更新存储驱动选项
- 其他非破坏性配置变更
方案二:容器持久化运行(服务重启无感维护)
配置步骤
- 启用live-restore功能
sudo tee /etc/docker/daemon.json <<EOF
{
"live-restore": true # 启用容器持久化功能
}
EOF
- 应用配置变更
# 检查`daemon.json`语法
sudo dockerd --config-file /etc/docker/daemon.json --validate
# 应用配置变更,重启Docker服务或发送SIGHUP信号
sudo systemctl reload docker
# 或发送SIGHUP信号
sudo kill -SIGHUP $(pidof dockerd)
- 功能验证
docker info | grep -i "live restore enabled"
# 应输出:Live Restore Enabled: true
验证流程
# 1. 启动测试容器
docker run -d --name web nginx
# 2. 模拟服务重启
sudo systemctl restart docker
# 3. 检查容器状态
docker ps -f "name=web"
# 预期输出:CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES
注意事项
权限要求
- 所有操作需
root
权限或使用sudo
执行 - 配置文件修改后必须执行
systemctl reload docker
或发送SIGHUP
信号
配置文件规范
/etc/docker/daemon.json
必须为有效JSON格式- 推荐使用JSON验证工具:
sudo dockerd --config-file /etc/docker/daemon.json --validate
功能限制
- 版本要求:live-restore 仅支持 Docker 1.12+
- 网络限制:容器网络配置变更仍需重启服务
- 新容器保护:服务重启后新建的容器不受live-restore保护
故障排查指南
常见问题处理
-
配置不生效
- 验证JSON格式:
sudo dockerd --config-file /etc/docker/daemon.json --validate
- 检查文件权限:
ls -l /etc/docker/daemon.json
(建议权限:644)
- 验证JSON格式:
-
信号发送失败
- 确认dockerd进程状态:
ps aux | grep dockerd
- 备用重启方案:
systemctl restart docker
(会短暂中断容器)
- 确认dockerd进程状态:
-
容器意外终止
- 查看内核日志:
journalctl -u docker --since "5 minutes ago" -o cat
- 检查存储驱动兼容性:
docker info | grep "Storage Driver"
- 查看内核日志:
版本兼容性矩阵
Docker版本 | live-restore支持 | 热重载支持 | 推荐场景 |
---|---|---|---|
1.12+ | ✅ | ✅ | 生产环境维护 |
1.11- | ❌ | ⚠️ 部分支持 | 测试环境验证 |
评论区