Docker 容器与宿主机网段冲突导致网络无法 ping 通的解决方案
docker 容器网络默认使用 bridge 桥接模式,正常情况下,容器会使用 daemon.json 中定义的虚拟网桥来与宿主机进行通讯。
最近更新 Docker for mac 之后,发现以前容器中可以访问的局域网内服务(使用宿主机所在的局域网 IP 访问),变得不可访问了。一开始以为是新版本改了默认网络配置,查了半天 release log 并没有找到相关条目。
后来在同事的帮助下发现问题所在:
由于换了新的工位,宿主机的局域网 IP 网段由 172.16.*.* 切换到了 172.17.*.* ,刚好和 docker 虚拟网桥 IP 段 172.17.*.* 冲突。
解决问题的办法也很简单:
1、如果是 Docker for mac,打开 Preferences -> Daemon -> Advanced ,修改(或增加)配置 {"bip" : "172.16.10.1/24"} ,从而避免网段冲突的问题;
2、Linux 版本的 docker 配置,请参看这里:《Docker 修改默认的网段》
另外在问题解决的过程当中,发现了一些知识点:
1、docker-compose 的网络配置字段为 network_mode: "host" 而非 net: "host"
2、docker for mac 的容器里可以通过 docker.for.mac.host.internal 域名直接访问宿主机服务
3、docker inspect <container_id> 命令,可以查看到容器的网络配置