MacOS下Docker-in-Docker(dind)内部运行容器无网络连接问题咨询
Dind容器内部子容器默认桥接网络无法访问公网(Mac Docker Desktop环境解决方案)
问题判定
该故障不是SSL配置问题,你遇到的报错是DNS解析失败,SSL相关错误会明确提示证书校验异常,不会提示域名解析错误,且你验证过curl、wget预构建镜像SSL验证正常,可以完全排除SSL相关影响。
故障根因
故障和Docker Desktop for Mac没有docker0网桥的特性直接相关。Docker Desktop for Mac的网络栈运行在内置的Linux虚拟机中,dind容器内启动的子容器走默认桥接网络时,需要经过两层Docker网络NAT转发:dind内部Docker的NAT、宿主机Docker Desktop的NAT。Mac环境下两层网络栈默认没有配置对应路由规则转发dind内部桥接网段的流量,导致子容器的DNS请求和公网请求无法正常流出。你使用--net=host参数可以正常访问的原因是子容器直接复用了dind的网络栈,不需要走dind内部的NAT转发,所以流量可以正常流出。
可行解决方案
- 方案1:修改dind启动参数,强制开启iptables转发
修改你的docker-compose配置中orchestrator服务的command字段为:command: "--dns 8.8.8.8 --iptables=true --ip-forward=true",dind配置这两个参数后,内部Docker会自动生成正确的NAT转发规则,打通两层网络的流量转发路径。 - 方案2:配置dind内部Docker的默认网桥参数
进入dind容器后,创建/etc/docker/daemon.json文件,写入以下配置:
{ "dns": ["8.8.8.8", "114.114.114.114"], "bip": "172.20.0.1/16", "default-address-pools": [ {"base":"172.20.0.0/16","size":24} ] }
配置完成后重启dind内部的Docker服务,指定独立网段可以避免和宿主机Docker的网段冲突,同时子容器会自动继承配置的DNS地址,解决解析失败问题。
- 方案3:dind容器使用host网络启动
修改docker-compose配置中orchestrator服务的网络配置,删除自定义的main_network,新增network_mode: host,dind直接复用宿主机Docker的网络栈,内部子容器走默认桥接网络时的流量会直接通过宿主机网络转发,不需要经过额外的NAT转换,即可正常访问公网。
内容的提问来源于stack exchange,提问作者Brian M
相关产品推荐
相关产品推荐

