devops基礎--- 圖解Docker的4種網絡模式

當你開始大規模使用Docker時,你會發現需要了解很多關於網絡的知識。我們在使用docker run創建Docker容器時,可以用--net選項指定容器的網絡模式,Docker有以下4種網絡模式:

· host模式,使用--net=host指定。

· container模式,使用--net=container:NAME_or_ID指定。

· none模式,使用--net=none指定。

· bridge模式,使用--net=bridge指定,默認設置。

devops基礎--- 圖解Docker的4種網絡模式

下面分別介紹一下Docker的各個網絡模式。

1 host模式

眾所周知,Docker使用了Linux的Namespaces技術來進行資源隔離,如PID Namespace隔離進程,Mount Namespace隔離文件系統,Network Namespace隔離網絡等。一個Network Namespace提供了一份獨立的網絡環境,包括網卡、路由、Iptable規則等都與其他的Network Namespace隔離。一個Docker容器一般會分配一個獨立的Network Namespace。但如果啟動容器的時候使用host模式,那麼這個容器將不會獲得一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace。容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和端口。

例如,我們在10.10.101.105/24的機器上用host模式啟動一個含有web應用的Docker容器,監聽tcp80端口。當我們在容器中執行任何類似ifconfig命令查看網絡環境時,看到的都是宿主機上的信息。而外界訪問容器中的應用,則直接使用10.10.101.105:80即可,不用任何NAT轉換,就如直接跑在宿主機中一樣。但是,容器的其他方面,如文件系統、進程列表等還是和宿主機隔離的。Host模式如下圖所示:

devops基礎--- 圖解Docker的4種網絡模式

Host模式

示例:
$ docker run -tid --net=host --name docker_host1 ubuntu-base:v3
$ docker run -tid --net=host --name docker_host2 ubuntu-base:v3
$ docker exec -ti docker_host1 /bin/bash
$ docker exec -ti docker_host1 /bin/bash
$ ifconfig –a
$ route –n

2 container模式

在理解了host模式後,這個模式也就好理解了。這個模式指定新創建的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、端口範圍等。同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過lo網卡設備通信。

Container模式示意圖:

devops基礎--- 圖解Docker的4種網絡模式

Container模式

示例:
$ docker run -tid --net=container:docker_bri1 --name docker_con1 ubuntu-base:v3
$ docker exec -ti docker_con1 /bin/bash
$ docker exec -ti docker_bri1 /bin/bash
$ ifconfig –a
$ route -n

3 none模式

這個模式和前兩個不同。在這種模式下,Docker容器擁有自己的Network Namespace,但是,並不為Docker容器進行任何網絡配置。也就是說,這個Docker容器沒有網卡、IP、路由等信息。需要我們自己為Docker容器添加網卡、配置IP等。None模式示意圖:

devops基礎--- 圖解Docker的4種網絡模式

None模式

示例:
$ docker run -tid --net=none --name docker_non1 ubuntu-base:v3
$ docker exec -ti docker_non1 /bin/bash
$ ifconfig –a
$ route -n

4 bridge模式

bridge模式是Docker默認的網絡設置,此模式會為每一個容器分配Network Namespace、設置IP等,並將一個主機上的Docker容器連接到一個虛擬網橋上。

當Docker進程啟動時,會在主機上創建一個名為docker0的虛擬網橋,此主機上啟動的Docker容器會連接到這個虛擬網橋上。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網絡中。從docker0子網中分配一個 IP 給容器使用,並設置 docker0 的 IP 地址為容器的默認網關。在主機上創建一對虛擬網卡veth pair設備,Docker 將 veth pair 設備的一端放在新創建的容器中,並命名為eth0(容器的網卡),另一端放在主機中,以vethxxx這樣類似的名字命名,並將這個網絡設備加入到 docker0 網橋中。可以通過brctl show命令查看。

bridge模式是 docker 的默認網絡模式,不寫–net參數,就是bridge模式。使用docker run -p時,docker 實際是在iptables做了DNAT規則,實現端口轉發功能。可以使用iptables -t nat -vnL查看。bridge模式如下圖所示: ​​

devops基礎--- 圖解Docker的4種網絡模式

bridge模式

示例:
$ 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 -ti docker_bri1 /bin/bash
$ ifconfig –a
$ route –n


分享到:


相關文章: