docker0仅首次运行有可访问IP Docker容器重启后无法加载服务求助
问题根因定位
对比两次networkctl的输出差异可以确定核心问题:容器首次启动时,Docker创建的对应网桥(本次为br-39aac8ad8ef3)状态为routable,容器停止后systemd-networkd检测到网桥下没有活跃的容器网卡连接,就将网桥标记为no-carrier,自动清除了该网桥对应的iptables转发规则和路由表项,导致后续重启容器后流量无法正常转发到容器内。
Strato托管服务器默认启用了systemd-networkd的全网卡接管策略,和你本地虚拟机的默认网络配置不一致,这就是虚拟机运行正常、服务器出问题的原因。
排查验证步骤
- 重启容器无法访问时,先执行
iptables -t nat -L DOCKER,对比重启Docker前后的规则,确认是否缺少对应端口的转发规则 - 执行
ip route show,确认网桥对应的网段路由是否存在,异常状态下应该看不到br-39aac8ad8ef3对应的路由条目 - 执行
networkctl status br-39aac8ad8ef3,可以看到systemd-networkd标记该网卡为无连接状态
永久解决方案
方案1:禁用systemd-networkd对Docker网桥的管理
创建/etc/systemd/network/10-docker-bridge.network文件,写入如下配置:
[Match] Name=br-* docker0 veth* [Link] Unmanaged=yes
配置完成后执行以下命令生效:
systemctl daemon-reload systemctl restart systemd-networkd systemctl restart docker
这个方案让systemd-networkd不对Docker相关的虚拟网卡做状态管理,完全交给Docker自己处理,是最稳定的解决方案。
方案2:升级Docker版本
你当前使用的Docker 20.10.6是2021年的旧版本,该版本存在和systemd-networkd联动的已知bug,升级到20.10.21以上的稳定版即可修复该问题:
# 卸载旧版本 apt remove docker.io docker-ce docker-ce-cli -y # 安装官方最新稳定版 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list apt update && apt install docker-ce docker-ce-cli containerd.io -y
临时替代方案(不需要重启Docker)
如果暂时不想改配置,每次容器重启后执行以下命令也可以恢复访问:
ip link set br-39aac8ad8ef3 up
手动把对应的网桥设置为up状态,systemd-networkd会重新给它分配路由规则。
内容的提问来源于stack exchange,提问作者K1LLUM1N471
相关产品推荐
相关产品推荐

