1. Linux網絡基礎
Linux內核具有非常成熟和高性能的TCP / IP堆棧實現。Docker網絡使用linux內核的網絡堆棧作爲低級原語來創建高級網絡驅動程序。簡而言之,Docker網絡就是 Linux網絡。
1.1 Linux bridge
Linux的橋是Linux內核模擬的二層網橋。功能是根據MAC地址學習並轉發流量。
Linux bridge已在許多Docker網絡驅動程序中廣泛使用。Docker bridge網絡驅動 是Linux bridge的更高級別的實現。
1.2 Linux network namespace
Linux 網絡名稱空間是內核中的隔離網絡堆棧,具有自己的接口,路由和防火牆規則。被用於容器和Linux的安全性方面,用於隔離容器。
linux network namespace可確保同一主機上的兩個容器無法相互通信,甚至不能與主機本身進行通信,除非配置爲通過Docker網絡進行通信。
通常,CNM網絡驅動程序爲每個容器實現單獨的名稱空間。但是,容器可以共享相同的網絡名稱空間,甚至可以是主機的網絡名稱空間的一部分。
主機網絡名稱空間包含主機接口和主機路由表。
1.3 veth(虛擬以太網設備)
Linux VETH(虛擬以太網設備)是充當兩個網絡命名空間之間的連接線。veth是全雙工鏈接,在每個名稱空間中都有一個接口。一個接口中的流量被引向另一接口。
創建Docker網絡時,Docker網絡驅動程序利用veth在名稱空間之間提供顯式連接。
1.4 iptables
iptables是 Linux 本機數據包過濾系統,自2.4版以來已成爲Linux內核的一部分。它是功能豐富的L3 / L4防火牆,可爲包標記,僞裝和丟棄提供規則鏈。
在Docker網絡驅動程序中,iptables廣泛地用於分割網絡流量,提供主機端口映射以及標記流量以進行負載平衡決策。
2. docker網絡模式
網絡驅動 | 描述 |
---|---|
host模式 | 通過host驅動程序,容器可以使用主機的網絡堆棧。沒有名稱空間分隔,並且容器上的主機可以直接使用主機上的所有接口。 |
bridge模式 | bridge驅動程序使用Linux bridge。默認情況下,網橋上的容器可以相互通信。也可以通過bridge驅動程序配置對容器的外部訪問。 |
overlay模式 | overlay驅動程序創建一個支持多主機網絡開箱即用的overlay網絡。它結合使用了本地Linux brodge和VXLAN,以覆蓋物理網絡基礎結構上的容器到容器通信。 |
MACVLAN模式 | 該macvlan驅動程序使用Linux MACVLAN橋接模式在容器接口和父主機接口(或子接口)之間建立連接。它可用於向可在物理網絡上路由的容器提供IP地址。另外,VLAN可以中繼到macvlan驅動程序以強制執行第2層容器分段。 |
none模式 | none驅動程序提供了一個容器,擁有自己的網絡堆棧和網絡命名空間。如果沒有其他配置,容器將與主機網絡堆棧完全隔離。 |
2.1 Host 模式
Host 模式並沒有爲容器創建一個隔離的網絡環境。而之所以稱之爲host模式,是因爲該模式下的 Docker 容器會和 host 宿主機共享同一個網絡 namespace,故 Docker Container可以和宿主機一樣,使用宿主機的eth0,實現和外界的通信。換言之,Docker Container的 IP 地址即爲宿主機 eth0 的 IP 地址。其特點包括:
這種模式下的容器沒有隔離的 network namespace
容器的 IP 地址同 Docker host 的 IP 地址
需要注意容器中服務的端口號不能與 Docker host 上已經使用的端口號相沖突
host 模式能夠和其它模式共存
2.2 Bridge模式
Docker 容器默認使用 bridge 模式的網絡。其特點如下:
- 使用一個 linux bridge,默認爲 docker0
- 使用 veth 對,一頭在容器的網絡 namespace 中,一頭在 docker0 上
- 該模式下Docker Container不具有一個公有IP,因爲宿主機的IP地址與veth pair的 IP地址不在同一個網段內
- Docker採用 NAT 方式,將容器內部的服務監聽的端口與宿主機的某一個端口port 進行“綁定”,使得宿主機以外的世界可以主動將網絡報文發送至容器內部
- 外界訪問容器內的服務時,需要訪問宿主機的 IP 以及宿主機的端口 port
- NAT 模式由於是在三層網絡上的實現手段,故肯定會影響網絡的傳輸效率。
- 容器擁有獨立、隔離的網絡棧;讓容器和宿主機以外的世界通過NAT建立通信
2.3 overlay模式
VXLAN 是一個新興的SDN 標準,它定義了一種新的 overlay 網絡,它主要的創造者是 VMware, Cisco 和 Arista。它被設計來消除虛擬化網絡世界中的 VLAN 數目的限制。
VXLAN定義爲MAC-in-UDP封裝,它將容器第2層幀放在底層IP / UDP標頭中。
它可以由專有硬件來實現,也可以使用純軟件實現。目前比較成熟的軟件實現的 VTEP 包括:
- 3.9 版本及以後的帶 vxlan 內核模塊的 Linux
- Open vSwitch
- VMware vSphere
而Docker使用linux內核的vxlan模塊創建overlay網絡。Docker overlay的datapath完全在內核空間中,這導致更少的上下文切換,更少的CPU開銷以及應用程序和物理NIC之間的低延遲。
2.4 macvlan模式
macvlan 這種技術能將 一塊物理網卡虛擬成多塊虛擬網卡。
macvlan 是 Linux kernel 支持的新特性,支持的版本有 v3.9-3.19 和 4.0+,比較穩定的版本推薦 4.0+。它一般是以內核模塊的形式存在。
macvlan 這種技術聽起來有點像 VLAN,但它們的實現機制是完全不一樣的。macvlan 子接口和原來的主接口是完全獨立的,可以單獨配置 MAC 地址和 IP 地址,而 VLAN 子接口和主接口共用相同的 MAC 地址。VLAN 用來劃分廣播域,而 macvlan 共享同一個廣播域。
通過不同的子接口,macvlan 也能做到流量的隔離。macvlan 會根據收到包的目的 MAC 地址判斷這個包需要交給哪個虛擬網卡,虛擬網卡再把包交給上層的協議棧處理
MACVLAN用例可能包括:
- 低延遲應用
- 網絡設計要求容器與外部主機網絡位於同一子網中,並且使用IP作爲外部主機網絡
參考:
https://success.docker.com/article/networking#linuxnetworkfundamentals
https://www.cnblogs.com/sammyliu/p/5894191.html