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 服务启动后默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。

Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信,它还给出了 MTU(接口允许接收的最大传输单元),通常是 1500 Bytes,或宿主主机网络路由上支持的默认值。这些值都可以在服务启动的时候进行配置。

可以用编辑/etc/docker/daemon.json文件,添加内容 “bip”: “ip/netmask” [ 切勿与宿主机同网段 ]

  1. [root@localhost /]# vi /etc/docker/daemon.json
  2. {“bip”:“192.168.100.1/24”}