docker - 由於docker swarm子網與host機器網絡沖突導致的container通信問題的解決方案


背景

近期,公司網絡要遷移到新的網段,所以原來在服務器上面搭建的docker swarm需要重新構建。。。

拿到新的服務器地址看了一下,“10.xxx.xxx.xxx" 。。。 納尼,這IP趕腳是子網的地址段呀,居然用到了服務器上面!唉,算了吧,當時也沒多想,可能是自己少見多怪吧。。。於是就把幾台服務啟動swarm搭建好,配置好了manager和work節點,然后創建了Overlay網絡,在上面用2個busybox的container做了個小測試,container之間可以連接,於是把之前停止的container都啟動,完事后這樣高高興興的下班啦!!(不加班的生活真美好

 

第二天一到公司,還沒坐穩呢,旁邊的哥們就急急忙忙的過來找我,“我們的app無法連接到數據庫,報錯啦!!”(PS: 我們的app和數據庫分別跑在了不同宿主機的container上面,彼此通過docker的子網進行通信)。 奇怪吖,我昨天還試了試可以通信呀,怎么今天就不行了呢??

 

分析問題

我們總共有3台機器掛在swarm下,有一台機器是manager(我們簡單起見,命名為M),另外兩台作為worker(W1+W2)加入到swarm集群中。簡單的拓撲結構如下圖:

 

昨天,我做測試的時候是用的M與W1,當時沒出現問題;今天出現問題的是M與W2,containers 之間無法通信; 之后,我又嘗試在W1與W2上面運行containers,也無法通信。。。。

 

沒辦法,嘗試着重新創建swarm集群,然后再創建跨節點的overlay網絡,然而,得到了令人驚奇的結果,這次所有container都無法通信!!

 

於是,先從swarm集群入手排錯,swarm運行正常,沒有任何發現。。。再從overlay網絡層面進行分析,運行指令:

 

#docker network inspect myOverlayNet

 

 

 

發現docker默認創建的子網是 10.0.0.0

 

會不會是由於docker 子網與 host 機器的網絡 同在一個網段(10.xxx.xxx.xxx)而導致的沖突呢???

 

解決

重新建立子網, 這次指定好subnet的網段,為了和host機器區分開來,使用了192.~的網段,命令如下

#docker network create -d overlay --subnet=192.168.0.0/24 --attachable myOverlay

在不同的hosts(M, W1 與 W2)上面新建立containers,(busybox1, busybox2 和 busybox3)

## run busybox1 on manage node
# docker run -itd --name=busybox1 --network=myOverlay busybox /bin/sh

## run busybox2 on worker node 1
# docker run -itd --name=busybox2 --network=myOverlay busybox /bin/sh

## run busybox3 on worker node 2
# docker run -itd --name=busybox3 --network=myOverlay busybox /bin/sh

 

進入container,測試連接

##在 busybox1 里測試連接到 busybox2 and busybox3

# nslookup busybox2

--output-- Name: busybox2 Address: 192.168.0.2 busybox2.myOverlay 



# nslookup busybox3

--output-- Name: busybox3 Address: 192.168.0.3 busybox3.myOverlay

 

OK,這次通信沒有問題啦,看來真的是docker 的默認子網(10.0.0.0)與服務器(宿主機)上的IP段(10.xxx.xxx.xxx)沖突導致的問題。

所以我們的解決方案就是: 在創建 docker 子網的時候指定IP段

 

最后,感謝大家的關注,歡迎大家留言交流 :)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM