?Docker Network 是 Docker 平臺中的一項功能,允許容器相互通信以及與外界通信。它提供了一種在 Docker 環境中創建和管理虛擬網絡的方法。Docker 網絡使容器能夠連接到一個或多個網絡,從而使它們能夠安全地共享信息和資源。
預備知識
推薦先看視頻先有個大概的了解,再對比視頻或文章進行動手操作
【入門篇】Docker網絡模式Linux - Bridge | Host | None_嗶哩嗶哩_bilibili
什么是 Network Namespace?
網絡命名空間 (Network Namespace): 網絡命名空間是 Linux 內核提供的一種網絡隔離機制。它就像是為每個容器創建了一個獨立的網絡環境。
- 每個容器都有自己的網絡命名空間。主機也有一個默認的網絡命名空間。
- 隔離性: 每個網絡命名空間有自己的網絡設備、IP 地址、路由表、防火墻規則等。
- 獨立性: 在一個命名空間中的變更不會影響其他命名空間。
- 靈活性: 允許在同一臺主機上運行多個相互隔離的網絡環境。
什么是 veth-pair?
veth-pair?(Virtual Ethernet Device Pairs): veth 是 "虛擬以太網設備" 的縮寫。它總是成對出現,像是一根虛擬的網線,連接不同的網絡命名空間。
- 工作原理: veth 對的兩端分別位于不同的網絡命名空間。從一端發送的數據包會立即出現在另一端。
- 用途: 主要用于連接不同的網絡命名空間,使它們能夠通信。
- 在 Docker 中的應用:
- 一端連接到容器的網絡命名空間。
- 另一端連接到主機的默認命名空間(通常通過 docker0 網橋)。
namespace 和 veth 如何協同工作
將 VETH 想象成一根網線。一端連接到主機網絡,另一端連接到創建的網絡命名空間。讓我們連接電纜,并打開這些接口。通過接下來的步驟,我們將會理解容器都在自己的網絡環境中運行,為什么可以方便地與其他容器和外部網絡進行通信。
a. 容器創建: b. veth 對創建: c. 網絡連接: d. 通信過程:
- Docker 為新容器創建一個新的網絡命名空間。
- 在這個命名空間中創建一個虛擬網絡接口(如 eth0)。
- Docker 創建一對 veth 設備。
- 一端(如 veth1)被移動到容器的命名空間,并可能被重命名為 eth0。
- 另一端(如 veth0)保留在主機的默認命名空間,并連接到 docker0 網橋。
- 容器內的 eth0 通過 veth 對連接到主機上的 docker0 網橋。
- docker0 網橋充當虛擬交換機,連接所有容器。
- 容器間通信: 數據從一個容器的 eth0 經過 veth 對到達 docker0,再通過另一個 veth 對到達目標容器。
- 容器與外部通信: 數據經過 veth 對到達 docker0,然后通過主機的網絡接口(如 eth0)發送到外部網絡。
通過這種方式,Docker 能夠在提供強大網絡功能的同時,實現了容器網絡的隔離性和互聯性。這為微服務架構和復雜的分布式系統提供了堅實的網絡基礎。
demo:在容器啟動默認網絡驅動
圖中顯示了lo(回環接口)和eth0(是我ES2的主網卡)的信息,其中docker0接口是允許不同容器之間以及容器與宿主機之間的網絡通信,注意state?DOWN,
?
Docker 引擎的每次安裝都會自動包含三個默認網絡。bridge,host,none
?
此時檢查網絡驅動bridge信息
docker network inspect bridge
?
運行容器示例,觀察不同之處
docker run -itd --name=networktest ubuntu
?
?
Docker網絡驅動
?
讓我們把Docker網絡驅動想象成不同類型的道路系統,這樣可能更容易理解。
Bridge網絡(默認模式)
小方框代表不同的容器。底部的線代表Docker0網橋,連接所有容器。
?想象這是一個小區內部的道路系統。每個容器就像小區里的一棟房子,它們通過這個內部道路系統相互連接。對于大多數單機應用,Bridge網絡就足夠了。它提供了良好的隔離性和易用性。
Host網絡
大方框表示直接使用主機的網絡棧。?這就像直接把房子建在主干道上。容器直接使用宿主機的網絡,沒有任何隔離。這種模式性能最好,但安全性較低。
Overlay網絡
兩個橢圓形代表不同主機上的網絡。連接線表示跨主機通信。 這就像不同城市之間的高速公路,允許不同物理機器上的容器通信。
把這個想象成不同城市之間的高速公路網絡。它允許不同物理機器上的Docker容器進行通信,就像它們在同一個網絡中一樣。這對于構建跨多臺服務器的分布式系統非常有用。
Macvlan網絡
小方框代表擁有獨立MAC地址的容器。底部的線代表物理網絡。?
這就像給每個房間都分配了一個獨立的門牌號(MAC地址)。每個容器都可以直接連接到物理網絡,就像是網絡上的一個獨立設備。這在某些需要直接訪問物理網絡的特殊場景中很有用。
None網絡
這相當于一個沒有任何道路連接的孤島。容器完全與網絡隔離,不能進行任何網絡通信。這在一些特殊的安全要求下可能會用到。
使用場景
選擇合適的網絡驅動時,需要考慮以下因素:
- 應用的架構和通信需求
- 性能要求
- 安全性和隔離級別
- 部署環境(單主機vs多主機)
- 可擴展性需求
- 特定的網絡功能需求(如負載均衡、服務發現等)
- Bridge 網絡:
- 最常用的網絡驅動,適合大多數單主機部署場景。
- 理想用于開發和測試環境,因為它提供了良好的隔離性和易用性。
- 適合部署獨立的Web應用、數據庫服務或微服務組件。
- 當需要在同一主機上運行多個相互隔離的應用時,Bridge網絡是最佳選擇。
- Host 網絡:
- 當網絡性能是首要考慮因素時使用,如高性能計算或網絡密集型應用。
- 適用于需要訪問主機網絡棧的特權容器,如網絡監控工具或安全掃描器。
- 在需要直接訪問主機網絡接口的場景中非常有用,如某些網絡管理工具。
- 但要注意,由于缺乏網絡隔離,使用Host網絡時需要格外小心安全性。
- Overlay 網絡:
- 在構建跨多個Docker主機的分布式應用時是理想選擇。
- 非常適合微服務架構,允許服務在不同主機間無縫通信。
- 在Docker Swarm集群環境中廣泛使用,提供了內置的服務發現和負載均衡。
- 適用于需要高可用性和水平擴展的大規模應用部署。
- Macvlan 網絡:
- 當容器需要在物理網絡上表現為獨立設備時使用。
- 適用于網絡設備模擬或虛擬化網絡功能(NFV)場景。
- 在需要直接暴露容器到外部網絡的情況下很有用,如特定的網絡安全要求。
- 對于需要繞過Docker網絡棧以獲得最佳性能的場景也很適合。
- None 網絡:
- 用于需要完全網絡隔離的特殊安全場景。
- 適合需要自定義網絡棧的高級用戶。
- 在某些特定的沙箱環境或安全敏感的應用中可能會用到。
- 也可用于創建不需要網絡連接的數據處理或計算密集型容器。
Docker Bridge 工作原理
a. 網橋(Bridge): Docker在安裝時會創建一個名為docker0的網橋。這個網橋充當虛擬交換機,
所有容器都連接到這個交換機上,實現容器間的網絡通信。
b. veth-pair: 當創建容器時,Docker會創建一對虛擬接口(veth pair)。一端連接到容器內部,
另一端連接到docker0網橋。這就像用一根虛擬網線將容器和網橋連接起來。
c. IP地址分配: Docker會從預定義的網段中為每個容器分配一個IP地址。這相當于給每個
"房間"(容器)分配一個獨特的門牌號,便于識別和通信。
d. 端口映射: 如果需要從外部訪問容器內的服務,需要進行端口映射。這類似于在大樓的總機上
設置分機,讓外部可以直接與特定的"房間"(容器)通信。
e. NAT(網絡地址轉換): Docker使用NAT機制允許容器訪問外部網絡。當容器發起對外連接時,
Docker會將容器的私有IP地址轉換為主機的IP地址。
f. DNS服務: Docker提供內置的DNS服務,允許容器通過名稱相互發現和通信。這在使用自定義
網絡或部署多容器應用時特別有用。
g. iptables規則: Docker自動管理iptables規則,用于處理NAT、端口映射和網絡隔離。這些
規則確保了容器網絡的安全性和正確路由。
Overlay網絡的工作原理
- VXLAN封裝: Overlay網絡主要使用VXLAN(Virtual Extensible LAN)技術。VXLAN在原始的以太網幀外部添加一個VXLAN頭,然后封裝在UDP包中。
- 網絡標識: 每個Overlay網絡都有一個唯一的網絡ID(VXLAN Network Identifier, VNI),用于區分不同的虛擬網絡。
- VTEP(VXLAN Tunnel Endpoint): 每個Docker主機上運行一個VTEP。它負責封裝和解封裝VXLAN數據包。
- 分布式控制平面: Docker Swarm使用一個分布式數據庫(通常是etcd或Consul)來存儲網絡拓撲信息。
- 數據包傳輸流程: a. 源容器發送數據包 b. 本地VTEP封裝數據包(添加VXLAN頭) c. 封裝后的包通過物理網絡傳輸 d. 目標主機的VTEP接收并解封裝數據包 e. 數據包傳遞給目標容器
現在讓我詳細解釋Overlay網絡的跨主機通信原理:
- 網絡設置:
- 每個Docker主機上都運行一個Overlay網絡(圖中橙色區域)。
- 每個主機上都有一個VTEP(VXLAN Tunnel Endpoint,圖中紫色方框)。
- 容器通信過程: a. 源容器(容器1)發送數據包到目標容器(容器2)。 b. 數據包首先到達本地Overlay網絡。 c. VTEP接收到數據包,并進行VXLAN封裝:
- 添加VXLAN頭,包含VNI(VXLAN Network Identifier)。
- 將整個包封裝在UDP數據包中。 d. 封裝后的數據包通過物理網絡傳輸(圖中紅色底部區域)。 e. 目標主機的VTEP接收到數據包,進行解封裝。 f. 解封裝后的原始數據包通過目標主機的Overlay網絡傳遞給目標容器。
- VXLAN封裝:
- 圖中間的方框顯示了VXLAN封裝的結構。
- VXLAN頭包含VNI,用于標識特定的Overlay網絡。
- 原始以太網幀被封裝在VXLAN包內。
- 網絡發現和路由:
- Docker Swarm使用分布式數據存儲(如etcd)來維護網絡拓撲信息。
- 每個VTEP知道如何將數據包路由到其他主機上的容器。
- 優勢:
- 隔離性:不同Overlay網絡之間完全隔離。
- 可擴展性:可以支持大量的網絡和容器。
- 跨數據中心:可以在不同物理位置的主機之間創建Overlay網絡。
- 性能考慮:
- VXLAN封裝會帶來一些性能開銷。
- 在高性能要求的場景中,可能需要考慮網絡優化。
Overlay網絡的這種機制使得Docker容器能夠在不同的物理主機之間進行透明通信,就像它們在同一個本地網絡中一樣。這為構建大規模、分布式的容器應用提供了強大的基礎。
實際應用中,Overlay網絡常用于:
- 微服務架構中服務之間的通信
- 跨數據中心的應用部署
- 大規模容器編排(如使用Kubernetes或Docker Swarm)
Docker自定義網絡
注意:前面的內容是原理理解就行,這里可能是最常用的了。
Docker自定義網絡就像是在一個大型辦公樓里創建專屬的部門局域網。每個網絡就像一個獨立的樓層或區域,有自己的規則和特點。
網絡驅動類型: 想象不同類型的辦公區域布局
a) Bridge(橋接): 最常用,就像標準的辦公樓層。
b) Overlay(覆蓋): 類似于跨多個辦公樓的虛擬專用網絡。
c) Host(主機): 直接使用主機網絡,像是直接在大樓的主網絡上工作。
d) Macvlan: 給容器自己的MAC地址,就像給每個員工獨立的網絡設備。
e) None: 沒有網絡,類似于隔離的私密辦公室。
創建自定義網絡: 就像規劃和設置新的辦公區域。?
docker network create --driver bridge my_network
網絡隔離: 每個自定義網絡就像一個獨立的樓層,默認情況下彼此隔離。 不同網絡的容器就像在不同樓層工作的員工,需要特殊通道才能互相通信。
自動DNS解析: 在自定義網絡中,容器可以通過名稱相互訪問,就像在辦公室里直接叫同事名字。 例如:ping container_name
就能工作,不需要知道IP地址。
IP地址管理: Docker會為每個加入網絡的容器分配IP,就像給新員工分配工位。 可以指定IP范圍:--subnet 192.168.1.0/24
連接容器到網絡:
a) 創建時連接:docker run --network my_network ...
b) 已存在的容器連接: 這就像是把員工分配到特定的辦公區或讓他們進入新的項目組。
docker network connect my_network container_name
斷開網絡連接: 類似于臨時將員工調離某個項目組。
docker network disconnect my_network container_name
網絡別名: 可以給容器在特定網絡中指定別名,就像給員工在不同項目中使用不同的代號。
docker network connect --alias db my_network container_name
自定義網絡的優勢:
a) 更好的隔離性:不同項目組之間不互相干擾。
b) 自動服務發現:容器可以通過名字互相找到,不需要記憶復雜的IP。
c) 更安全:可以控制哪些容器可以相互通信。
d) 動態管理:可以隨時添加或移除容器,就像員工加入或離開項目組。
跨主機網絡: 使用Overlay網絡,可以讓不同物理機器上的容器通信,就像不同辦公樓之間建立專用通道。
網絡配置: 可以設置網絡的各種參數,例如MTU(最大傳輸單元)、網關等,就像調整辦公網絡的各種設置。
查看網絡信息: 這就像查看辦公區域的詳細平面圖和人員分布。
docker network inspect my_network
實際應用例子:
- 多層應用:前端容器在一個網絡,后端容器在另一個網絡,數據庫容器在第三個網絡。
- 微服務:每個微服務可以有自己的網絡,只有需要通信的服務之間建立連接。
- 開發環境:可以為不同的開發項目創建隔離的網絡環境
docker網絡聯通
思考:為了連接到網絡,計算機必須至少具有一個網絡接口。每個網絡接口必須有自己唯一的 IP 地址。提供給主機的 IP 地址將分配給其網絡接口。但是每個網絡接口都需要一個 IP 地址嗎?
當我們將一個容器連接到多個網絡時,它會獲得多個IP地址。為什么呢?
解釋:
- 默認網絡: 當一個容器被創建時,除非另有指定,它會自動連接到默認的"bridge"網絡,并獲得一個IP地址。
- 自定義網絡: 當我們將容器連接到一個自定義網絡時,它會在這個新網絡中獲得另一個IP地址。
- 多網絡連接: 一個容器可以同時連接到多個網絡,每個網絡中都會有一個唯一的IP地址。
- 網絡隔離: 每個網絡都是相互隔離的。容器在一個網絡中的IP地址對其他網絡是不可見的。
- 路由: 容器內部會有多個網絡接口,每個對應一個連接的網絡。
工作原理:
- 默認連接:容器創建時自動連接到默認bridge網絡,獲得172.17.0.2 IP地址。
- 自定義網絡連接:使用
docker network connect
命令將容器連接到自定義網絡。容器在新網絡中獲得另一個IP地址(172.18.0.2)。 - 多網絡接口:容器內部創建新的網絡接口(eth1)來處理新網絡連接。
- 路由:容器操作系統負責管理這些網絡接口和路由決策。
- 網絡隔離:每個網絡都是獨立的,容器在一個網絡中的通信不會影響其在另一個網絡中的通信。
- 靈活性:這種設計允許容器同時參與多個網絡環境,增加了網絡配置的靈活性。
優勢:
- 網絡隔離:可以將容器連接到多個隔離的網絡環境。
- 微服務架構:支持復雜的微服務部署,允許服務在不同網絡中扮演不同角色。
- 安全性:可以通過網絡分離來增強安全性,例如將數據庫容器連接到后端網絡,而不暴露給前端網絡。
- 靈活配置:允許在不中斷服務的情況下動態調整容器的網絡連接。
這種多網絡連接的能力使Docker容器能夠適應復雜的網絡拓撲需求,為現代分布式系統的部署提供了強大的支持。
參考
https://docs.docker.com/network/
https://docs.docker.com/engine/tutorials/networkingcontainers/
https://medium.com/techlog/diving-into-linux-networking-and-docker-bridge-veth-and-iptables-a05eb27b1e72
37、網絡連通_嗶哩嗶哩_bilibili
https://mostafizur99.medium.com/connecting-containers-with-vxlan-overlay-networks-mastering-multi-container-host-networking-a72cc561c098