內容摘要
容器網絡連接特性
Docker DNS
容器共享網絡棧
在本節開始前,請使用快照恢復容器環境,回到最初的環境。
在上一節初步講解了容器的三種自帶網絡,以及自定義bridge網絡,在容器中使用最多的是bridge網絡。
下面我們進一步學習bridge網絡。
容器網絡連接特性
測試前,先查詢容器網絡相關信息,命令為:
brctl show ifconfig
請注意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
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 inspect network net1:
可以看到,兩個容器的IP地址,以及網關。
下面分別進入兩個容器,使用Ping判斷是否網絡相通:
可以發現,兩個容器是可以互相ping通的。
兩個容器處於同一個網段,所以能夠互相ping通。
下面測試處於不同網段的容器,能否ping通。
在net2中創建tomcat:jdk8容器:
docker run -d -p 8080 --name tomcat1_net2 --network=net2 tomcat:jdk8
查看容器網絡信息:
進入tomcat1_net1容器,ping tomat1_net2容器IP地址:172.19.0.2:
無法ping通,可見處於不同網段的容器無法聯通的。
問題:那麼docker如何做到不同網段是不同聯通的呢?
查看網橋信息:
可以看到除了 docker0 以外,還有其他兩個網橋。
查看iptables信息,使用命令: iptables-save
可以看到上述3個網橋的配置信息:
DOCKER-ISOLATION 表示網絡隔離,後面的配置將3個網橋全部隔離開。
DROP 表示取消, -i 表示輸入, -o 表示輸出。
這就是為什麼處於兩個不同網段的容器無法ping通的原因。
問題:那麼如何才能讓兩個處於不同網段的容器網絡相通呢?
方法是為其中一容器增加一張網卡,使其IP地址位於另一個容器的網段中, 命令如下:
docker network connect net2 cffaf8166793
為容器tomcat1_net1增加網卡,該網卡使用net2網絡,進入容器中,可以看到新增網卡IP地址,和net2處於同一網段。
在該容器中ping tomcat1_net2容器IP地址:
可以ping通,說明網絡可以相通。
Docker DNS
下面我們做一個測試:
在容器tomcat1_net1中, 使用 ping tomcat2_net1 命令測試下能否聯通:
可以看到,能夠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
進入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
查看tomcat1_net1容器的網絡信息:
可以看到兩個容器具有同樣的網絡設備。
在busybox容器中可以使用127.0.0.1訪問tomcat容器:
可以看到,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}')