9.2 網路型別
Docker 提供了多種網路驅動來滿足不同的使用場景。安裝 Docker 後,系統會自動建立三個預設網路:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
abc123... bridge bridge local
def456... host host local
ghi789... none null local
9.2.1 網路型別對比
各網路型別的特點和適用場景如下:
| 網路型別 | 說明 | 適用場景 |
|---|---|---|
| bridge | 預設類型,容器連線到虛擬網橋 | 大多數單機場景 |
| host | 容器直接使用宿主機網路棧 | 需要最高網路效能時 |
| none | 停用網路 | 完全隔離的容器 |
| overlay | 跨主機網路 | Docker Swarm 叢集 |
| macvlan | 容器擁有獨立 MAC 地址 | Linux 主機上需要直接接入物理網路 |
| ipvlan | 容器共享父介面 MAC,獨享 IP | 同網段大量容器、對 MAC 數量受限的網路 |
9.2.2 Bridge 網路:預設
Bridge 是 Docker 預設使用的網路模式。在原生 Linux Docker Engine 上,Docker 啟動時通常會建立 docker0 虛擬網橋,未指定網路的容器會連線到這個網橋上。Docker Desktop 執行在虛擬機內,宿主機上不會直接看到 docker0,也不能假設宿主機可直接訪問每個容器 IP。
核心元件如下:
| 元件 | 說明 |
|---|---|
| docker0 | 虛擬網橋,充當交換機角色 |
| veth pair | 虛擬網絡卡對,一端在容器內,一端連線網橋 |
| 容器 eth0 | 容器內的網絡卡 |
| IP 地址 | 自動從 172.17.0.0/16 網段分配 |
9.2.3 Host 網路
使用 --network host 引數啟動的容器會直接使用宿主機的網路棧,不再擁有獨立的網路命名空間。容器內的連接埠就是宿主機的連接埠,無需連接埠對映。
$ docker run -d --network host nginx
這種模式下網路效能最高,但容器之間和宿主機之間沒有網路隔離。
注意:host 網路優先用於明確需要高效能或大量連接埠的 Linux 主機場景。Docker Desktop 僅在較新版本中支援,且需要在設定中啟用;使用 host 網路時
-p/--publish連接埠對映不會生效。普通 Web 服務預設仍建議使用 bridge 網路並顯式發布連接埠。
9.2.4 None 網路
使用 --network none 引數啟動的容器只有 lo 回環網絡卡,完全沒有外部網路連線。適用於只需要執行計算任務、不需要網路的容器。
$ docker run -it --network none alpine ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> ...
inet 127.0.0.1/8 scope host lo
9.2.5 Macvlan 與平台限制
Macvlan 適合少數需要讓容器像物理主機一樣直接出現在二層網路中的場景。它只支援 Linux 主機,不支援 Docker Desktop for Mac / Windows,也不支援 rootless 模式;多數雲廠商網路會阻斷或限制 macvlan。預設情況下,macvlan 容器與宿主機直接通訊也需要額外路由或介面設定。
9.2.6 資料流向
容器網路中的資料流向可以分為以下幾種情況:
flowchart LR
subgraph Comm1 ["容器間通訊"]
direction LR
C1A["容器 A (172.17.0.2)"] --> D0A["docker0"] --> C1B["容器 B (172.17.0.3)"]
end
subgraph Comm2 ["訪問外網"]
direction LR
C2A["容器 A (172.17.0.2)"] --> D0B["docker0"] --> Eth0A["eth0"] --> InternetA["網際網路"]
end
subgraph Comm3 ["被外部訪問,需連接埠對映"]
direction LR
Req["外部請求"] --> Eth0B["eth0"] --> D0C["docker0"] --> C3A["容器 A"]
end