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> 命令,可以查看到容器的網絡配置