特权模式运行Docker容器网络异常重启后dbus不可用如何解决
问题根因
- 你使用的Ubuntu 20.04镜像默认启用systemd-networkd服务,
--privileged特权模式下容器内的systemd有权限修改网卡配置,会覆盖Docker daemon预先分配的IPv4地址,最终导致eth0只剩IPv6链路地址,网络不可用。 - 直接重启容器后dbus无法访问,是因为容器重启时systemd运行依赖的/run目录下残留了旧的进程通信资源,特权模式下systemd对宿主机部分资源的访问上下文在重启后不匹配,导致dbus套接字失效。
解决方案
方案一:调整容器启动参数(无需修改镜像,推荐)
使用如下启动命令创建容器,可同时解决网络异常和重启后dbus不可用的问题:
docker run -d --name $MYNAME --privileged \ --tmpfs /run \ --tmpfs /run/lock \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ --sysctl net.ipv4.conf.eth0.dad_transmits=0 \ $IMAGE /usr/sbin/init
参数说明:
--tmpfs /run、--tmpfs /run/lock:给systemd运行所需的/run目录挂载临时文件系统,容器销毁/重启时会自动清理目录内的残留文件,避免旧套接字导致dbus启动失败。-v /sys/fs/cgroup:/sys/fs/cgroup:ro:只读挂载宿主机cgroup目录,满足特权模式下systemd的资源管理需求,同时避免systemd修改宿主机cgroup配置。--sysctl net.ipv4.conf.eth0.dad_transmits=0:关闭eth0的IPv4重复地址检测,避免systemd-networkd误以为IP冲突,丢弃Docker分配的IPv4地址。
方案二:镜像内固化网络配置(适合批量部署场景)
如果需要固化配置避免每次启动加参数,可以在制作Ubuntu 20.04镜像时新增配置文件/etc/systemd/network/10-eth0.network,内容如下:
[Match] Name=eth0 [Link] Unmanaged=yes
该配置会通知systemd-networkd不接管eth0网卡,保留Docker预先分配的IP配置,启动容器时只需保留方案一中的--tmpfs和cgroup挂载参数即可。
验证方法
- 容器启动后执行
ip addr,确认eth0已经分配到172.17段的IPv4地址 - 执行
apt update验证外部网络访问正常 - 执行
systemctl status dbus确认dbus服务处于运行状态,重启容器后再次执行上述检查,确认问题无复现。
内容的提问来源于stack exchange,提问作者Julio Feng
相关产品推荐
相关产品推荐

