Docker動手教程5.2:容器單機網絡2

內容摘要

容器網絡連接特性

Docker DNS

容器共享網絡棧

在本節開始前,請使用快照恢復容器環境,回到最初的環境。

在上一節初步講解了容器的三種自帶網絡,以及自定義bridge網絡,在容器中使用最多的是bridge網絡。

下面我們進一步學習bridge網絡。

容器網絡連接特性

測試前,先查詢容器網絡相關信息,命令為:

brctl show
ifconfig
Docker動手教程5.2:容器單機網絡2

Docker動手教程5.2:容器單機網絡2

請注意Subnet和Gateway信息。

創建兩個自定義bridge網絡,名為:net1,net2

docker network create --driver bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 net1
docker network create --driver bridge --subnet 172.19.0.0/16 --gateway 172.19.0.1 net2
Docker動手教程5.2:容器單機網絡2

net1和net2處於不同網段,網關也不一樣。

在net1中創建兩個tomcat:jdk8容器,名稱分別為:tomcat1_net1, tomcat2_net1:

docker run -d -p 8080 --name tomcat1_net1 --network=net1 tomcat:jdk8
docker run -d -p 8080 --name tomcat2_net1 --network=net1 tomcat:jdk8
Docker動手教程5.2:容器單機網絡2

容器運行成功後,查看兩個容器的網絡信息:

使用 docker inspect network net1:

Docker動手教程5.2:容器單機網絡2

可以看到,兩個容器的IP地址,以及網關。

下面分別進入兩個容器,使用Ping判斷是否網絡相通:

Docker動手教程5.2:容器單機網絡2

可以發現,兩個容器是可以互相ping通的。

兩個容器處於同一個網段,所以能夠互相ping通。

下面測試處於不同網段的容器,能否ping通。

在net2中創建tomcat:jdk8容器:

docker run -d -p 8080 --name tomcat1_net2 --network=net2 tomcat:jdk8
Docker動手教程5.2:容器單機網絡2

查看容器網絡信息:

Docker動手教程5.2:容器單機網絡2

進入tomcat1_net1容器,ping tomat1_net2容器IP地址:172.19.0.2:

Docker動手教程5.2:容器單機網絡2

無法ping通,可見處於不同網段的容器無法聯通的。

問題:那麼docker如何做到不同網段是不同聯通的呢?

查看網橋信息:

Docker動手教程5.2:容器單機網絡2

可以看到除了 docker0 以外,還有其他兩個網橋。

查看iptables信息,使用命令: iptables-save

Docker動手教程5.2:容器單機網絡2

可以看到上述3個網橋的配置信息:

DOCKER-ISOLATION 表示網絡隔離,後面的配置將3個網橋全部隔離開。

DROP 表示取消, -i 表示輸入, -o 表示輸出。

這就是為什麼處於兩個不同網段的容器無法ping通的原因。

問題:那麼如何才能讓兩個處於不同網段的容器網絡相通呢?

方法是為其中一容器增加一張網卡,使其IP地址位於另一個容器的網段中, 命令如下:

docker network connect net2 cffaf8166793
Docker動手教程5.2:容器單機網絡2

為容器tomcat1_net1增加網卡,該網卡使用net2網絡,進入容器中,可以看到新增網卡IP地址,和net2處於同一網段。

在該容器中ping tomcat1_net2容器IP地址:

Docker動手教程5.2:容器單機網絡2

可以ping通,說明網絡可以相通。

Docker DNS

下面我們做一個測試:

在容器tomcat1_net1中, 使用 ping tomcat2_net1 命令測試下能否聯通:

Docker動手教程5.2:容器單機網絡2

可以看到,能夠ping通,其原因在於docker 自帶一個DNS服務器,能夠解析容器名稱。

但是,請注意上面能夠ping通的條件是:不能使用docker默認初始化的容器網絡bridge,只能使用自己創建的bridge網絡。

測試如下:

運行兩個tomcat容器,使用bridge網絡:

docker run -d -p 8080 --name tomcat1_bridge --network=bridge tomcat:jdk8
docker run -d -p 8080 --name tomcat2_bridge --network=bridge tomcat:jdk8
Docker動手教程5.2:容器單機網絡2

進入tomcat1_bridge容器,ping tomcat2_bridge容器,結果是ping不通,報錯為: tomcat2_bridge: Name of service not known,識別不了該名稱,說明DNS沒有支持。

容器共享網絡棧

兩個容器可以擁有同樣的IP地址,具有相同的網絡棧。

測試如下:

創建busybox容器, 使用tomcat1_net1容器的網絡棧,命令如下:

docker run -it --network=container:tomcat1_net1 busybox
Docker動手教程5.2:容器單機網絡2

查看tomcat1_net1容器的網絡信息:

Docker動手教程5.2:容器單機網絡2

可以看到兩個容器具有同樣的網絡設備。

在busybox容器中可以使用127.0.0.1訪問tomcat容器:

Docker動手教程5.2:容器單機網絡2

可以看到,busybox可以像訪問本機一樣訪問tomcat容器。

這種通信方式性能非常好, 在一些特殊的場景下很適用。

兩個容器共享數據時就可以使用這種方式, 比如兩個容器A和B,B容器需要獲取A容器的日誌,那麼就可以使用這種網絡。

再比如web程序,可以將靜態網頁單獨放在一個容器,同時該容器具有和server同樣的網絡棧,server就可以直接使用網頁數據。

容器之間的網絡聯接就講到這裡。

實驗

處於同一網段的容器是否能夠聯通

處於不同網段的容器是否能夠相同

測試DockerDNS

創建共享網絡棧的容器,並測試容器之前是否相通

常用命令

sudo docker rm -f $(sudo docker ps -a | awk 'NR == 1 {next} {print $1}')

sudo docker rmi -f $(sudo docker images | awk 'NR == 1 {next} {print $3}')


分享到:


相關文章: