宿主机重启后Docker自定义网络与容器连接自动恢复方案

📅 2026/7/13 12:33:43
宿主机重启后Docker自定义网络与容器连接自动恢复方案
1. 为什么需要自动恢复Docker自定义网络每次宿主机重启后最让人头疼的就是Docker自定义网络会丢失。我刚开始用Docker时也踩过这个坑——早上来公司发现服务器重启了所有容器虽然还在但自定义网络全没了容器之间互相ping不通服务完全瘫痪。这时候就得手动重建网络、重新连接容器特别麻烦。Docker默认的三种网络bridge、host、none在宿主机重启后不会丢失但自定义网络会消失。这是因为Docker的网络配置默认存储在内存中重启后自然就没了。对于生产环境来说这种手动恢复的方式显然不可靠。核心痛点在于自定义网络配置需要重新创建容器需要重新连接到新创建的网络依赖网络的服务需要重新启动整个过程耗时且容易出错2. 关键配置参数解析2.1 --live-restore机制这个参数是我解决这个问题的关键发现。在/etc/docker/daemon.json中添加{ live-restore: true }或者在启动参数中加入--live-restore它的作用是保持容器在Docker守护进程重启时继续运行避免容器被意外停止为网络恢复提供基础环境实测发现单独使用--live-restore虽然能保持容器运行但自定义网络还是会丢失。所以需要配合其他配置。2.2 禁用崩溃文件删除在/etc/sysconfig/docker中添加DISABLE_CRASH_FILES_DELETEtrue这个配置阻止Docker在崩溃时删除网络配置等关键文件。我曾在测试环境反复验证不加这个参数的话即使有备份文件也无法完整恢复网络状态。3. 完整解决方案实施步骤3.1 修改Docker守护进程配置首先备份原始配置cp /etc/docker/daemon.json /etc/docker/daemon.json.bak然后编辑配置文件vim /etc/docker/daemon.json加入以下内容{ live-restore: true, iptables: true, ip-forward: true, data-root: /var/lib/docker }3.2 配置系统服务对于使用systemd的系统如CentOS 7、Ubuntu 16.04需要修改docker服务配置sudo mkdir -p /etc/systemd/system/docker.service.d sudo vim /etc/systemd/system/docker.service.d/override.conf加入[Service] Restartalways StartLimitInterval03.3 网络恢复脚本创建网络恢复脚本/usr/local/bin/restore_docker_network.sh#!/bin/bash # 定义需要恢复的网络 NETWORKS( mybridge 172.18.0.0/16 mybridge2 172.19.0.0/16 ) # 恢复网络 for net in ${NETWORKS[]}; do name$(echo $net | awk {print $1}) subnet$(echo $net | awk {print $2}) if ! docker network inspect $name /dev/null; then docker network create --driver bridge --subnet $subnet $name echo 已创建网络: $name else echo 网络已存在: $name fi done # 重新连接容器 docker network connect mybridge ganglia-s-gmond-11 docker network connect mybridge ganglia-s-gmond-12 docker network connect mybridge2 ganglia-s-gmond-21 docker network connect mybridge2 ganglia-s-gmond-22 # 重启可能受影响的容器 docker restart ganglia-s-gmond-11 ganglia-s-gmond-12 ganglia-s-gmond-21 ganglia-s-gmond-22给脚本执行权限chmod x /usr/local/bin/restore_docker_network.sh3.4 设置开机自启将脚本添加到rc.local没有的话需要先创建echo /usr/local/bin/restore_docker_network.sh /etc/rc.local chmod x /etc/rc.local对于使用systemd的系统cat /etc/systemd/system/restore-docker-network.service EOF [Unit] DescriptionRestore Docker Networks Afterdocker.service [Service] ExecStart/usr/local/bin/restore_docker_network.sh [Install] WantedBymulti-user.target EOF systemctl enable restore-docker-network.service4. 验证与故障排查4.1 手动测试恢复流程主动重启Docker服务systemctl restart docker检查网络是否自动恢复docker network ls检查容器连接状态docker inspect ganglia-s-gmond-11 | grep IPAddress4.2 常见问题解决问题1网络恢复但容器IP变化原因没有指定固定IP解决创建网络时指定--ip-range连接容器时指定--ip问题2部分容器无法连接网络原因容器状态异常解决先停止再启动容器docker stop ganglia-s-gmond-11 docker start ganglia-s-gmond-11问题3脚本执行权限问题现象开机后网络未恢复解决chmod x /etc/rc.local chmod x /usr/local/bin/restore_docker_network.sh5. 进阶配置建议5.1 使用docker-compose如果是使用docker-compose管理服务可以在docker-compose.yml中定义网络version: 3 networks: mynet: driver: bridge ipam: config: - subnet: 172.20.0.0/16 services: service1: networks: mynet: ipv4_address: 172.20.0.25.2 网络配置备份定期备份网络配置docker network inspect mybridge /backup/mybridge.json恢复时可以使用docker network create --config /backup/mybridge.json5.3 监控网络状态设置定时任务检查网络健康状态crontab -e添加*/5 * * * * /usr/local/bin/check_docker_network.sh检查脚本内容#!/bin/bash if ! docker network inspect mybridge /dev/null; then /usr/local/bin/restore_docker_network.sh echo $(date): 检测到网络丢失已自动恢复 /var/log/docker_network.log fi6. 生产环境注意事项网络规划提前规划好子网划分避免IP冲突变更管理任何网络配置变更都要同步更新恢复脚本日志记录确保恢复脚本有完善的日志记录测试验证定期模拟重启测试恢复流程权限控制恢复脚本应使用最小必要权限我在实际生产环境中实施这套方案后宿主机重启后的恢复时间从原来的30分钟缩短到2分钟以内最重要的是再也不需要人工干预了。特别是对于分布式系统网络自动恢复保证了服务的高可用性。