一 Docker網路 1.1 Docker網路類型 標準的Docker支持以下4類網路模式: host模式:使用--net=host指定。 container模式:使用--net=container:NAME_or_ID指定。 none模式:使用--net=none指定。 bridge模式:使用-- ...
一 Docker網路
1.1 Docker網路類型
標準的Docker支持以下4類網路模式:- host模式:使用--net=host指定。
- container模式:使用--net=container:NAME_or_ID指定。
- none模式:使用--net=none指定。
- bridge模式:使用--net=bridge指定,為預設設置。
二 bridge模式
2.1 bridge模型
在bridge模式下,Docker Daemon第1次啟動時會創建一個虛擬的網橋,預設的名稱是docker0,然後在私有網路空間中給這個網橋分配一個子網。針對由Docker創建的每一個容器,都會創建一個虛擬的乙太網設備(Veth設備對),其中一端關聯到網橋上,另一端使用Linux的網路命名空間技術,映射到容器內的eth0設備,然後從網橋的地址段內給eth0介面分配一個IP地址。 如圖所示為Docker的預設橋接網路模型: 其中ip1是網橋的IP地址,Docker Daemon會在幾個備選地址段里給它選一個地址,通常是以172開頭的一個地址。這個地址和主機的IP地址是不重疊的。ip2是Docker在啟動容器時,在這個地址段選擇的一個沒有使用的IP地址分配給容器。相應的MAC地址也根據這個IP地址,在02:42:ac:11:00:00和02:42:ac:11:ff:ff的範圍內生成,這樣做可以確保不會有ARP衝突。 啟動後,Docker還將Veth對的名稱映射到eth0網路介面。ip3就是主機的網卡地址。 通常,ip1、ip2和ip3是不同的IP段,所以在預設不做任何特殊配置的情況下,在外部是看不到ip1和ip2的。 這樣做的結果就是,在同一臺機器內的容器之間可以相互通信,不同主機上的容器不能相互通信,實際上它們甚至有可能在相同的網路地址範圍內(不同主機上的docker0的地址段可能是一樣的)。 為了讓它們跨節點互相通信,就必須在主機的地址上分配埠,然後通過這個埠路由或代理到容器上。這種做法顯然意味著一定要在容器之間小心謹慎地協調好埠的分配,或者使用動態埠的分配技術。 在不同應用之間協調好埠分配是十分困難的事情,特別是集群水平擴展時。而動態的埠分配也會帶來高度複雜性,例如:每個應用程式都只能將埠看作一個符號(因為是動態分配的,所以無法提前設置)。 而且API Server要在分配完後,將動態埠插入配置的合適位置,服務也必須能互相找到對方等。這些都是Docker的網路模型在跨主機訪問時面臨的問題。 註意:更多跨主機的Docker通信方案,可參考《006.Docker網路管理》。2.2 網路規則
- 查看Docker啟動後的系統情況
- 在NAT表中有3條記錄,前兩條匹配生效後,都會繼續執行DOCKER鏈,而此時DOCKER鏈為空,所以前兩條只是做了一個框架,並沒有實際效果。
- NAT表第3條的含義是,若本地發出的數據包不是發往docker0的,即是發往主機之外的設備的,則都需要進行動態地址修改(MASQUERADE),將源地址從容器的地址(172段)修改為宿主機網卡的IP地址,之後就可以發送給外面的網路了。
- 在FILTER表中,第1條也是一個框架,因為後繼的DOCKER鏈是空的。
- 在FILTER表中,第3條是說,docker0發出的包,如果需要Forward到非docker0的本地IP地址的設備,則是允許的。這樣,docker0設備的包就可以根據路由規則中轉到宿主機的網卡設備,從而訪問外面的網路。
- FILTER表中,第4條是說,docker0的包還可以被中轉給docker0本身,即連接在docker0網橋上的不同容器之間的通信也是允許的。
- FILTER表中,第2條是說,如果接收到的數據包屬於以前已經建立好的連接,那麼允許直接通過。這樣接收到的數據包自然又走回docker0,並中轉到相應的容器。
- 查看容器啟動後的情況(容器無埠映射)
- 宿主機器上的Netfilter和路由表都沒有變化,說明在不進行埠映射時,Docker的預設網路是沒有特殊處理的。相關的NAT和FILTER這兩個Netfilter鏈還是空的。
- 宿主機上的Veth對已經建立,並連接到容器內。