為什麼docker 網段衝突會和宿主機衝突?原因分析和解決方案

ponponon發表於2023-02-05

seo 最佳化:

  • 為什麼docker-compose 網段衝突會和宿主機衝突?但是直接使用 docker 不會衝突?
  • docker網段衝突了怎麼辦?
  • docker預設網段和主機網段衝突解決
  • 本來好好的,新開了一個容器之後,突然無法登入虛擬機器(宿主機),好像是 docker 網段衝突怎麼辦?

回答這個問題前,建議先看下面兩篇文章:
docker0 和 br-xxxxxx 有什麼區別?
為什麼 docker-compose 建立的網路模式為什麼不在 docker 四大型別中?

私網地址是: A類地址:10.0.0.0~10.255.255.255. B類地址:172.16.0.0 ~172.31.255.255. C類地址:192.168.0.0~192.168.255.255

原因分析:

docker 的虛擬網路卡網段使用的是『B類地址』

如果是個人電腦,我們宿主機一般都是 192.168.xxx.xxx

所以,預設情況下,一切相安無事。

所以,如果你遇到衝突,一般是這樣:一切都好好的,但是突然,無法登入主機了,連 ping 都 ping 不通

為什麼呢?很簡單,172 開頭的網段被用完了,docker 就去侵犯 192.168 了

但是我們的宿主機用的網段就是 192.168,所以網段衝突,我們無法登入宿主機

你可能有疑問,172 可以分配超級多的 ip,怎麼就用完了?因為每跑一個 docker-compose.yaml 都是要建立一個 br 開頭的虛擬網路卡的,分走一個 172.xxx。因為 B類地址範圍是 172.16.0.0 ~172.31.255.255, 所以 172 開頭的最多隻能跑 15 個 docker-compose.yaml
當你需求太旺盛,一下子跑了 n 個 docker-compose.yaml,就可能導致 B 類地址被用完
最噁心的是,你執行 docker-compose down 之後,有些虛擬網路卡不會被解除安裝,導致一直佔用,所以並不是『同時15個把 B 類地址榨乾』,而是『日積月累,把 B 類地址榨乾』

圖片.png

從此處可以看到,docker0 用的是 172.17.0.1

其他的 br 開頭的都是 docker-compose 建立的虛擬網路卡,也是 172.xxx.0.1

圖片.png

但是因為我的這個機器是開發測試機器,所以我們會在上面執行 n 個 docker-compose.yaml

這久導致 172 的網段用完了,172 用完了,docker-compose 就去使用 192.168 開頭的了,使用 192.168.16.1 的時候,就和我宿主機的 192.168.38.1 衝突了。

為什麼這兩個 192.168 開頭的會衝突,和子網掩碼長度有關係,一個是 192.168.16.1/20,另一個是 192.168.38.191/24

解決方案:

修改 /etc/docker/daemon.json 中的 default-address-pools

貼一下我的 /etc/docker/daemon.json

{
  "registry-mirrors": [
    "https://hz4anb2p.mirror.aliyuncs.com",
    "https://mirror.ccs.tencentyun.com"
  ],
  "default-address-pools": [
    {
      "base": "172.17.0.0/16",
      "size": 16
    },
    {
      "base": "172.21.0.0/16",
      "size": 24
    },
    {
      "base": "172.22.0.0/16",
      "size": 24
    }
  ]
}

這個時候需要重啟 docker 服務

sudo service docker restart  

然後使用 docker-compose up -d 建立的新的服務組,就會在 172.21 下面了

已有的要使用 docker-compose down 先把原來的網路移除掉,不然會複用老的網路

然後我 docker-compose up -d 了兩個容器組,然後使用 ip --color a 命令檢視,可以看到,新的容器組的 ip 是 172.21 下面了

圖片.png

參考:

設定bip無效
在daemon配置檔案中單純配置bip只對docker啟動的容器有效,但是對docker-compose啟動的容器無效。

Docker engine is started with --bip argument, but it is ignored by docker-compose, which set up an additional bridge interface in addition to the docker0 interface. It is named br-f4a912f7750b and has the typical Docker 172.17.x.x format, which happens to conflict with the network I’m currently using.

相關文章