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 類地址榨乾』
從此處可以看到,docker0 用的是 172.17.0.1
其他的 br 開頭的都是 docker-compose 建立的虛擬網路卡,也是 172.xxx.0.1
但是因為我的這個機器是開發測試機器,所以我們會在上面執行 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 下面了
參考:
設定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.