Docker 的網(wǎng)絡(luò)模式


Bridge 模式

當 Docker 進程啟動時,會在主機上創(chuàng)建一個名為 docker0 的虛擬網(wǎng)橋,此主機上啟動的 Docker 容器會鏈接到這個虛擬網(wǎng)橋上。虛擬網(wǎng)橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網(wǎng)絡(luò)中。從 docker0 子網(wǎng)中分配一個 IP 給容器使用,并設(shè)置 docker0 的 IP 地址為容器的默認網(wǎng)關(guān)。在主機上創(chuàng)建一對虛擬網(wǎng)卡 veth pair 設(shè)備,Docker 將 veth pair 設(shè)備的一端放在新創(chuàng)建的容器中,并命名為 eth0 (容器的網(wǎng)卡),另一端放在主機中,以 vethxxx 這樣類似的名字命名,并將這個網(wǎng)絡(luò)設(shè)備加入到網(wǎng)橋中。可通過 brctl show 命令查看。
bridge 模式是 Docker 的默認網(wǎng)絡(luò)模式,不寫 -net 參數(shù),就是 bridge 模式。使用 docker run -p 時,Docker 實際是在 iptables 做了 DNAT 規(guī)則,實現(xiàn)端口轉(zhuǎn)發(fā)功能??墒褂?iptables -t nat --vnL 查看,bridge 模式如下圖所示

Bridge 模式.png

$ docker run -tid --net=bridge --name docker_bri1 ubuntu-base:v3 
$ docker run -tid --net=bridge --name docker_bri2 ubuntu-base:v3

$ brctl show
$ docker exec -it docker_bri1 /bin/bash
$ ficonfig -a
$ route -n

隨著 Docker 網(wǎng)絡(luò)的完善,建議將容器加入自定義的 Docker 網(wǎng)絡(luò)來連接多個容器,而不是使用 --link 參數(shù)
下面先創(chuàng)建一個新的 Docker 網(wǎng)絡(luò)

$ docker network create -d bridge my-net

-d 參數(shù)指定 Docker 網(wǎng)絡(luò)類型,有 bridge overlay。其中 overlay 網(wǎng)絡(luò)類型用于 Swarm mode
運行一個容器并連接到新建的 my-net 網(wǎng)絡(luò)

$ docker run -it --rm --name busybox1 --network my-net busybox sh

打開新的終端,再運行一個容器并加入到 my-net 網(wǎng)絡(luò)

$ docker run -it --rm --name busybox2 --network my-net busybox sh

再打開一個新的終端查看容器信息

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0776372cc5ad        busybox             "sh"                13 seconds ago      Up 12 seconds                           busybox2
8f4015b6747c        busybox             "sh"                50 seconds ago      Up 49 seconds                           busybox1

下面通過 ping 來證明 busybox1busybox2 建立了互聯(lián)關(guān)系,在 busybox1 輸入如下命令

/ # ping busybox2
PING busybox2 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.110 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.118 ms

ping 來測試連接 busybox2 容器,它會解析成 172.18.0.3

/ # ping busybox1
PING busybox1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.153 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.094 ms

如果有多個容器之間需相互連接,推薦使用 Docker Compose

Host 模式

如果啟動容器的時候使用 host 模式,那么這個容器將不會獲得一個獨立的 Network Namespace,而是和宿主機共用一個 Network Namespace。容器將不會虛擬處自己的網(wǎng)卡,配置自己的 IP 等。而是用宿主機 IP 和端口。容器其他方面,如文件系統(tǒng)、進程列表等還是和宿主機隔離的

Host 模式.png

$ docker run -tid --net=host --name docker_host1 ubuntu-base:v3
$ docker run -tid --net=host --name docker_host2 ubuntu-base:v3

$ docker exec -it docker_host1 /bin/bash
$ docker exec -it docker_host2 /bin/bash

$ ifconfig -a
$ route -n

Container 模式

這個模式指定新創(chuàng)建的容器和已經(jīng)存在的一個容器共享一個 Network Namespace,而不是和宿主機共享。新創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡,配置自己的 IP,而是和一個指定的容器共享 IP、端口范圍等。同樣,兩個容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng)、進程列表等還是隔離的。兩個容器的進程可以通過 lo 網(wǎng)卡設(shè)備通信

Container 模式.png

$ docker run -tid --net=container:docker_bri1 --name docker_con1 ubuntu-base:v3

$ docker exec -it docker_con1 /bin/bash
$ docker exec -it docker_bri1 /bin/bash

$ ifconfig -a
$ route -n

None 模式

使用 none 模式,Docker 容器擁有自己的 Network Namespace,并不為 Docker 容器進行任何網(wǎng)絡(luò)配置。即這個 Docker 容器沒有網(wǎng)卡、IP、路由器信息。需要自己為 Docker 容器添加網(wǎng)卡、配置 IP 等

None 模式.png

$ docker run -tid --net=none --name docker_non1 ubuntu-base:v3

$ docker exec -it docker_non1 /bin/bash

$ ifconfig -a
$ route -n
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容