1.docker0的基本理解
安裝完docker服務后,我們首先查看一下宿主機的網絡配置
ifconfig
我們可以看到,docker服務會默認在宿主機上創建一個虛擬網橋docker0,該網橋網絡的名字稱為docker0。它在內核層連通了其他物理或者虛擬網卡,這就可以將所有容器和宿主機都放在了同一個物理網絡。Docker默認指定了docker0接口的IP和子網掩碼,讓宿主機和容器之間可以通過網橋相互通信。
2.使用默認的bridge演示容器網路的相互連通
這里我們使用之前構建的一個tomcat鏡像來演示,可以參考之前的文章
8.使用Dockerfile構建centos7+jdk8+tomcat8鏡像
2.1 測試容器與宿主機的網絡互通
2.1.1 啟動一個tomcat容器
先啟動一個tomcat容器t1,對映射的端口為8901
docker run -d -p 8901:8080 --name t1 donkey/tomcat8:1.0.0
2.1.2 查看容器的網絡
docker exec -it t1 ip addr
可以看到,容器的ip為172.17.0.2
2.1.3 查看宿主機的ip
可以看到,宿主機的ip 10.0.16.9
2.1.4 測試宿主機能夠連通容器
ping 172.17.0.2
2.1.5 測試宿主機能夠連通容器
# 先進入容器內部
docker exec -it t1 /bin/bash
# ping 宿主機
ping 10.0.16.9
2.2 測試容器與容器的網絡互通
2.2.1 再啟動一個tomcat容器
docker run -d -p 8902:8080 --name t2 donkey/tomcat8:1.0.0
2.2.2 查看當前容器t2的ip地址
docker exec -it t2 ip addr
t2的ip地址為172.17.0.3
2.1.3 測試容器之間能夠連通
2.1.3.1 容器t1來ping容器t2
docker exec -it t1 ping 172.17.0.3
2.1.3.2 容器t2來ping容器t1
docker exec -it t2 ping 172.17.0.2
2.1.3.3 小結
通過上面t1和t2兩個容器的實例我們可以看到,使用默認的網絡bridge,容器之間是可以網絡互通的
3.bridge模式容器網路的相互連通的原理
前面我們提到,只要服務器上安裝了docker,那么宿主機上就會安裝一個虛擬的docker0網卡。我們每啟動一個docker容器,docker就會給容器分配一個ip。如我們啟動的t1、t2兩個容器
他們都有自己的分配的一個ip。
然后使用evth-pair技術,利用橋接模式,內部容器與外部宿主機進行連通。那什么是evth-pair技術呢?
evth-pair:就是一對虛擬設備接口,他們都是成對出現的,一段連著協議,一段彼此相連。正因為有有了這個特性,充當一個橋梁,連接各種虛擬網絡設備。
以容器t1為例,我們查看他的ip地址:
t1容器有個72號ip地址,eth0@if73
再看宿主機:
有個73號ip,vethd926bf2@if72,這樣容器t1的72綁定了宿主機上的73,宿主機上的73綁定了容器上的72,這樣容器和宿主機組成了一對。也就是說,啟動一個容器,會生成一對一對的網卡,也就是虛擬技術接口。
我們再看下容器t2是不是也是這樣呢?
容器t2的ip地址,有個74號eth0@if75
再看宿主機,有個有個75號vethe12ed59@if74
也是成對出現的。我們以一張圖來更加直觀的說明一下。
4.使用默認的bridge模式的弊端
通過上面的實例我們看到,使用默認的bridge網絡模式很容易的解決了我們網絡互通的問題,看著已經很完美了,但其實不然。
容器一旦刪除,網卡也就消失了,容器再次重啟,ip會變化;同時,每次docker容器啟動,我都要查看這個容器的ip,然后才能進行連接,這樣就導致連接非常不好用,如果能夠像微服務那樣,能夠屏蔽掉IP地址,在這里直接使用服務名連接就好了。那我們使用容器名試一下行不行。
很不幸,ping不通,那怎么解決這個問題呢?之前可以使用–link來實現,但已經作廢了,現在一般是采用自定義網絡來實現。這個我們后續的博客再來單獨分享吧。