轉載請註明出處:

一、 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

分析:

  1. Docker 會創建一對 veth 設備。

  2. 一端放入 my-nginx 容器的網絡命名空間(容器內 ip addr 可以看到 eth0)。

  3. 另一端連接到名為 docker0 的宿主機虛擬網橋上。

  4. 容器獲得一個IP(如 172.17.0.2)。

  5. 當你在宿主機外訪問 http://<宿主機IP>:8080 時,流量流向為:外部 -> 宿主機 8080 端口 -> iptables DNAT規則 -> docker0 網橋 -> 容器 my-nginx 的 80 端口。

2. Host 網絡(主機網絡)

使用 --network=host 參數,容器會共享宿主機的網絡命名空間。

  • 特點:
  • 無隔離:容器直接使用宿主機的IP和端口。
  • 高性能:因為沒有NAT和網橋開銷,網絡性能最好。
  • 端口衝突:容器使用的端口不能與宿主機上其他進程衝突。
  • 使用場景:
  • 對網絡性能要求極高的場景(如高頻交易系統、負載均衡器)。
  • 需要直接使用宿主機網絡棧的特定應用。
  • 示例與分析:
# 使用host網絡運行Nginx
docker run -d --name my-nginx-host --network=host nginx

分析:

  1. 容器內 ip addr 看到的結果與在宿主機上執行完全一樣。

  2. Nginx 服務直接監聽在宿主機的 80 端口上。

  3. 你直接訪問 http://<宿主機IP>:80 即可,無需也不可以使用 -p 參數進行端口映射。

    docker網絡總結_IP

3. None 網絡(無網絡)

使用 --network=none 參數,容器將獲得自己的網絡命名空間,但不進行任何網絡配置。

  • 特點:
  • 極致隔離:容器內只有 lo(loopback)迴環接口,無法與任何網絡(包括其他容器和外部網絡)通信。
  • 使用場景:
  • 需要完全離線、保證絕對安全的計算任務。
  • 由自定義腳本完全控制其網絡配置的極端場景。
  • 示例與分析:
# 運行一個無網絡的容器
docker run -it --network=none --name isolated-container alpine sh

# 進入容器後執行 `ip addr`,你將只看到 `lo` 設備。

docker網絡總結_Docker_02

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服務。

分析:

  1. debugger 容器沒有自己獨立的 eth0,它和 web-app 共用同一個。
  2. 它們在網絡層面就像同一個“進程”,可以通過本地迴環地址 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

分析:

  1. my-overlay-net 網絡會被同步到Swarm集羣的所有節點上。

  2. 無論 web 服務的副本被調度到哪個節點,它們都能通過 my-overlay-net 相互通信。

  3. 集羣內部可以通過服務名 web 進行DNS解析,獲得VIP(虛擬IP),實現負載均衡。

                

docker網絡總結_docker_03

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

分析:

  1. 容器 macvlan-container 會獲得IP 192.168.1.99,並擁有一個唯一的MAC地址。

  2. 在同一個局域網內的其他機器,可以直接 ping 192.168.1.99,就像ping一台真實的物理機一樣。

三、 總結與對比

網絡類型

驅動名

隔離性

性能

適用場景

關鍵特點

Bridge

bridge

命名空間隔離

較好(有NAT開銷)

單機容器、需端口映射

默認驅動,需 -p 端口映射

Host

host

無網絡隔離

最佳(無額外開銷)

高性能需求、網絡工具

直接使用宿主機網絡,端口易衝突

None

null

完全隔離

-

安全計算、離線任務

只有loopback接口

Container

container

與指定容器共享


Sidecar、調試

共享網絡命名空間,通過localhost通信

Overlay

overlay

跨主機虛擬網絡

較好(有封裝開銷)

Docker Swarm集羣、微服務

解決跨主機通信,內置服務發現

Macvlan

macvlan

物理網絡直接暴露

好(無NAT)

遺留應用、網絡監控

容器像物理設備,需管理IP

四、 最佳實踐

  1. 生產環境:對於單機部署,可以創建自定義的Bridge網絡以獲得更好的隔離性和內置的DNS解析(容器間可以通過容器名通信)。對於集羣部署,使用 Overlay 網絡。
  2. 網絡規劃:提前規劃好子網,避免IP衝突。
  3. 服務發現:在自定義Bridge和Overlay網絡中,優先使用容器名或服務名進行通信,而不是IP地址。
  4. 安全性:根據最小權限原則,只為容器配置其必需的網絡訪問權限。例如,不相關的容器組應使用不同的網絡。