轉載請註明出處:
一、 Docker 網絡核心概念
在 Docker 中,網絡的核心目標是讓容器之間、容器與外部世界(包括宿主機和其他機器)能夠進行通信。
Docker 採用了一種可插拔的驅動架構,默認提供了幾種網絡驅動程序(Driver),每種驅動對應一種網絡模式,以適應不同的使用場景。
關鍵概念:
- 網絡命名空間(Network Namespace):Linux 內核提供的功能,為容器提供獨立的網絡棧(包括網卡、路由表、iptables規則等),實現網絡隔離。
- 虛擬以太網設備對(veth pair):總是成對出現,像一根虛擬的網線,一端放在容器的網絡命名空間中(通常命名為
eth0),另一端連接到宿主機上的一個虛擬網橋(如docker0)。 - 網橋(Bridge):一個虛擬的網絡交換機,容器通過
veth pair連接到它上面,從而實現同網段內的通信。
二、 常用的 Docker 網絡類型(驅動)
當安裝 Docker 後,執行 docker network ls,會看到幾個默認創建的網絡。
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
a123b456c789 bridge bridge local
d789e012f345 host host local
f345g678h901 none null local
詳細講解這幾種以及其它常用網絡類型。
1. Bridge 網絡(橋接網絡)
這是 Docker 的默認網絡驅動。如果你不指定網絡,容器就會運行在默認的 bridge 網絡上。
- 特點:
- 隔離性:每個容器分配獨立的網絡命名空間。
- 私有網絡:容器被分配一個私有子網的IP地址(通常是
172.17.0.0/16)。 - NAT:容器默認可以通過宿主的IP地址訪問外部網絡(通過
iptables的 MASQUERADE 規則)。外部網絡無法直接通過IP訪問容器內的服務。 - 端口映射:為了讓外部能訪問容器服務,必須使用
-p或-P參數將容器端口映射到宿主機端口。
- 使用場景:
- 運行單個容器或不需要特殊網絡需求的多個容器。
- 需要將容器端口暴露給外部網絡訪問的場景(如運行一個Web服務器)。
- 示例與分析:
# 運行一個Nginx容器,並將其80端口映射到宿主機的8080端口
docker run -d --name my-nginx -p 8080:80 nginx
# 查看默認的bridge網絡詳情
docker network inspect bridge
分析:
-
Docker 會創建一對
veth設備。 -
一端放入
my-nginx容器的網絡命名空間(容器內ip addr可以看到eth0)。 -
另一端連接到名為
docker0的宿主機虛擬網橋上。 -
容器獲得一個IP(如
172.17.0.2)。 -
當你在宿主機外訪問
http://<宿主機IP>:8080時,流量流向為:外部 -> 宿主機8080端口 ->iptablesDNAT規則 ->docker0網橋 -> 容器my-nginx的80端口。
2. Host 網絡(主機網絡)
使用 --network=host 參數,容器會共享宿主機的網絡命名空間。
- 特點:
- 無隔離:容器直接使用宿主機的IP和端口。
- 高性能:因為沒有NAT和網橋開銷,網絡性能最好。
- 端口衝突:容器使用的端口不能與宿主機上其他進程衝突。
- 使用場景:
- 對網絡性能要求極高的場景(如高頻交易系統、負載均衡器)。
- 需要直接使用宿主機網絡棧的特定應用。
- 示例與分析:
# 使用host網絡運行Nginx
docker run -d --name my-nginx-host --network=host nginx
分析:
-
容器內
ip addr看到的結果與在宿主機上執行完全一樣。 -
Nginx 服務直接監聽在宿主機的
80端口上。 -
你直接訪問
http://<宿主機IP>:80即可,無需也不可以使用-p參數進行端口映射。
3. None 網絡(無網絡)
使用 --network=none 參數,容器將獲得自己的網絡命名空間,但不進行任何網絡配置。
- 特點:
- 極致隔離:容器內只有
lo(loopback)迴環接口,無法與任何網絡(包括其他容器和外部網絡)通信。
- 使用場景:
- 需要完全離線、保證絕對安全的計算任務。
- 由自定義腳本完全控制其網絡配置的極端場景。
- 示例與分析:
# 運行一個無網絡的容器
docker run -it --network=none --name isolated-container alpine sh
# 進入容器後執行 `ip addr`,你將只看到 `lo` 設備。
4. Container 網絡(容器網絡)
使用 --network=container:<容器名|容器ID> 參數,新創建的容器會與一個已存在的容器共享同一個網絡命名空間。
- 特點:
- 網絡共享:兩個容器使用相同的IP地址、端口空間等,可以通過
localhost直接通信。 - 生命週期綁定:被共享網絡的容器停止後,依賴它的容器也會失去網絡連接。
- 使用場景:
- Sidecar 模式:例如,一個主應用容器和一個負責日誌收集或服務發現的輔助容器。
- 需要對現有容器的網絡流量進行監控或操縱的調試工具容器。
- 示例與分析:
# 先運行一個主容器
docker run -d --name web-app nginx
# 運行一個調試工具容器,共享web-app的網絡
docker run -it --network=container:web-app --name debugger nicolaka/netshoot
# 在debugger容器中,你可以直接 `curl http://localhost:80` 來訪問web-app的Nginx服務。
分析:
debugger容器沒有自己獨立的eth0,它和web-app共用同一個。- 它們在網絡層面就像同一個“進程”,可以通過本地迴環地址
127.0.0.1直接通信。
5. Overlay 網絡(覆蓋網絡)
這是用於 Docker Swarm 集羣 的網絡驅動,它能讓多個 Docker 宿主機(節點)上的容器都連接在同一個虛擬網絡中,彷彿它們都在同一台機器上。
- 特點:
- 跨主機通信:解決不同宿主機上容器間的直接通信問題。
- 服務發現:內置DNS服務,可以通過服務名解析到容器的IP。
- 負載均衡:Swarm 可以對發佈的服務提供內部的負載均衡。
- 使用場景:
- 在 Docker Swarm 集羣中部署多服務的分佈式應用(微服務架構)。
- 需要容器跨物理機/虛擬機進行透明通信的場景。
- 示例與分析:
# 初始化Swarm集羣(在Manager節點上)
docker swarm init
# 創建一個Overlay網絡
docker network create -d overlay my-overlay-net
# 在Swarm中創建一個服務,使用該Overlay網絡
docker service create --name web --network my-overlay-net -p 80:80 nginx
分析:
-
my-overlay-net網絡會被同步到Swarm集羣的所有節點上。 -
無論
web服務的副本被調度到哪個節點,它們都能通過my-overlay-net相互通信。 -
集羣內部可以通過服務名
web進行DNS解析,獲得VIP(虛擬IP),實現負載均衡。
6. Macvlan 網絡
它允許你為容器分配一個物理網絡中的MAC地址,使得容器看起來像是物理網絡中的一個真實的物理設備。
- 特點:
- 直接暴露:容器直接使用物理網絡的IP段,無需端口映射和NAT。
- 需要支持:要求宿主機網絡接口支持“混雜模式”。
- IP管理:需要精細管理IP地址,防止IP衝突。
- 使用場景:
- 遺留應用需要直接使用物理網絡IP的場景。
- 網絡監控工具需要直接監聽網絡流量。
- 需要容器IP被網絡中原有系統直接識別的場景。
- 示例與分析:
# 創建一個Macvlan網絡,連接到宿主機的eth0網卡,使用192.168.1.0/24網段
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
my-macvlan-net
# 運行一個容器並指定IP
docker run -it --network=my-macvlan-net --ip=192.168.1.99 --name macvlan-container alpine sh
分析:
-
容器
macvlan-container會獲得IP192.168.1.99,並擁有一個唯一的MAC地址。 -
在同一個局域網內的其他機器,可以直接
ping 192.168.1.99,就像ping一台真實的物理機一樣。
三、 總結與對比
|
網絡類型
|
驅動名
|
隔離性
|
性能
|
適用場景
|
關鍵特點
|
|
Bridge
|
|
命名空間隔離
|
較好(有NAT開銷)
|
單機容器、需端口映射
|
默認驅動,需 |
|
Host
|
|
無網絡隔離
|
最佳(無額外開銷)
|
高性能需求、網絡工具
|
直接使用宿主機網絡,端口易衝突
|
|
None
|
|
完全隔離
|
-
|
安全計算、離線任務
|
只有loopback接口
|
|
Container
|
|
與指定容器共享
|
好
|
Sidecar、調試
|
共享網絡命名空間,通過 |
|
Overlay
|
|
跨主機虛擬網絡
|
較好(有封裝開銷)
|
Docker Swarm集羣、微服務
|
解決跨主機通信,內置服務發現
|
|
Macvlan
|
|
物理網絡直接暴露
|
好(無NAT)
|
遺留應用、網絡監控
|
容器像物理設備,需管理IP
|
四、 最佳實踐
- 生產環境:對於單機部署,可以創建自定義的Bridge網絡以獲得更好的隔離性和內置的DNS解析(容器間可以通過容器名通信)。對於集羣部署,使用 Overlay 網絡。
- 網絡規劃:提前規劃好子網,避免IP衝突。
- 服務發現:在自定義Bridge和Overlay網絡中,優先使用容器名或服務名進行通信,而不是IP地址。
- 安全性:根據最小權限原則,只為容器配置其必需的網絡訪問權限。例如,不相關的容器組應使用不同的網絡。