Docker 網絡詳解
- Bridge contauner 橋接式網絡模式
- Host(open) container 開放式網絡模式
- Container(join) container 聯合掛載式網絡模式,是host網絡模式的延伸
- None(Close) container 封閉式網絡模式
Bridge(橋接式網絡模式)
1. 介紹
當Docker進程啟動時,會在主機上創建一個名為docker0的虛擬網橋,此主機啟動的Docker容器會連接到這個虛擬網橋上,默認分配網段為172.17.0.0/16,實際上是 Linux 的一個 bridge,可以理解為一個軟件交換機,附加在其上的任何網卡之間都能自動轉發數據包。
從docker0子網中分配一個IP給容器使用,並設置docker0的IP地址為容器的默認網關。在主機創建一對虛擬網卡veth pair 設備,Docker將veth pair 設備的一端放在新創建的容器中,並命名為eth0(容器的網卡),另一端放在主句中,以vethxxx這樣的名字命名,並將這個網絡設備加入到docker0網橋中。
veth 是 Virtual ETHernet 的縮寫,是一種虛擬網絡設備。它的特點是:當它被創建以後,總是以兩張虛擬網卡(Veth peer)形式成對出現,並且在一個網卡上的數據包可直接轉發給另一個與之對應的網卡上,即使這兩個網卡不在同一個namespace中。
2. 容器與容器間的通信
容器1(172.17.0.2)ping 容器2(172.17.0.3);
根據路由規則,數據包從容器1(172.17.0.2)的eth0轉發至與之對應的veth上,該veth橋接在了docker0上,此時數據包到達了docker0,docker0扮演交換機的角色,並廣播ARP請求尋找容器2(172.17.0.3)的mac地址,而此時容器2的另一個veth 設備橋接在了docker0,並收到ARP請求,發現自己是172.17.0.3 ,故將其mac地址回覆給容器1,此時容器1和容器2就可以進行通信了,並且在容器1可以查看到緩存的容器2的mac地址。
3. 容器與外部網絡通訊
同理,如果容器ping另一個主機,它發出去的數據包經過docker0網橋流向宿主機的eth0網卡,eth0再將數據包轉發給與之相通的主機,於是,容器便可以跟其它主機通信了。(主要宿主機eth0能到達,容器都可以與之通信)
4. 宿主機與容器通訊
當宿主機訪問容器時,數據包從docker0流入到與容器的eth0對應的veth設備,veth與容器的eth0相通信。
5. 外部訪問容器
默認情況,其他外部網絡(宿主機以外)無法訪問到容器內的端口,通常的做法是使用-p或者-P選項,來暴露容器中的端口到宿主機上,外部網絡通過訪問宿主機的端口從而訪問到容器端口。本質上來說,該方式是通過iptables規則轉發實現的。
6. 自定義網橋
除了使用默認docker0作網橋以為還可以使用docker network 相關命令自定義網橋,以下將創建一個br1的網絡,子網是172.30.0.0/16,網關為172.30.0.1。
#創建br1網橋 docker network create -d bridge --subnet '172.30.0.0/16' --gateway '172.30.0.1' br1 #查看docker網絡 docker network ls NETWORK ID NAME DRIVER SCOPE b9c01f82c16b br1 bridge local #自定義網橋的使用 docker run -it --network br1 鏡像名稱 bash
Host(開放式網絡模式)
Host模式使用是在容器啟動時候指明--network host,此時容器共享宿主機的Network Namespace,容器內啟動的端口直接是宿主機的端口,並且容器不會創建網卡和IP,直接使用宿主機的網卡和IP,但是容器內的其他資源是隔離的,如文件系統、用戶和用戶組。這種模式的好處就是效率高,因為不需要額外的網絡開始,直接使用宿主機網絡。
docker run -d --name nginx --network host nginx:latest
Container(聯合掛載式網絡模式)
這個模式指定新創建的容器和已經存在的一個容器共享一個 Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的 IP,而是和一個指定的容器共享 IP、端口範圍等。同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過 lo迴環 通信。同樣,kubernetes中的pod的話,pod內的網絡也是靠這樣的共享方式來實現的。
None(封閉式網絡模式)
使用--network none選項指定其網絡模式,在該模式下雖然容器有著自己的Network Namespace,但是容器內沒有網卡、IP、路由信息,只有一個lo迴環接口。如果需要網絡配置則需要用戶手動進行配置網卡、ip以及路由信息,通常這樣的容器用於承擔某些無需網絡介入的工作,如離線任務、備份等。