主機網路驅動程式

如果您為容器使用 host 網路模式,該容器的網路堆疊將不會與 Docker 主機隔離(容器會與主機共用網路命名空間),且容器不會被分配專屬的 IP 位址。例如,如果您執行的容器繫結至連接埠 80,而您使用了 host 網路模式,則該容器的應用程式將可以直接透過主機的 IP 位址存取連接埠 80。

注意

由於使用 host 模式網路時,容器沒有自己的 IP 位址,因此連接埠映射 (port-mapping) 不會生效,且 -p--publish-P--publish-all 選項會被忽略,並產生警告。

WARNING: Published ports are discarded when using host network mode

Host 模式網路在以下情境中非常實用:

  • 為了優化效能
  • 容器需要處理大量連接埠範圍的情況

這是因為它不需要網路位址轉譯 (NAT),也不會為每個連接埠建立「使用者空間代理」(userland-proxy)。

Host 網路驅動程式在 Docker Engine(僅限 Linux)以及 Docker Desktop 4.34 或更高版本中皆受支援。

您也可以透過在 docker service create 指令中加入 --network host,為 swarm 服務使用 host 網路。在這種情況下,控制流量(與管理 swarm 和服務相關的流量)仍會透過 overlay 網路傳送,但各個 swarm 服務容器會使用 Docker 常駐程式的 host 網路和連接埠來傳送資料。這會帶來一些額外的限制。例如,如果服務容器繫結至連接埠 80,則在該 swarm 節點上只能執行一個此類服務容器。

Docker Desktop

Docker Desktop 4.34 或更高版本支援 Host 網路。若要啟用此功能:

  1. 登入您的 Docker Desktop 帳號。
  2. 導航至設定 (Settings)
  3. 資源 (Resources) 分頁下,選擇網路 (Network)
  4. 勾選啟用 host 網路 (Enable host networking) 選項。
  5. 選擇套用並重新啟動 (Apply and restart)

此功能支援雙向存取。這表示您可以從主機存取執行於容器中的伺服器,也可以從任何已啟用 host 網路的容器存取主機上執行的伺服器。TCP 與 UDP 皆為支援的通訊協定。

範例

以下指令會在一個監聽連接埠 8000 的容器中啟動 netcat:

$ docker run --rm -it --net=host nicolaka/netshoot nc -lkv 0.0.0.0 8000

隨後,連接埠 8000 將可在主機上使用,您可以透過另一個終端機使用以下指令連接到它:

$ nc localhost 8000

您在此輸入的內容將會出現在容器執行所在的終端機上。

若要從容器存取主機上執行的服務,您可以使用以下指令啟動一個已啟用 host 網路的容器:

$ docker run --rm -it --net=host nicolaka/netshoot

如果您隨後想從容器存取主機上的服務(在此範例中為執行於連接埠 80 的網頁伺服器),您可以這樣做:

$ nc localhost 80

限制

  • 容器內的行程無法繫結至主機的 IP 位址,因為容器無法直接存取主機的介面。
  • Docker Desktop 的 Host 網路功能運作在第四層 (layer 4)。這意味著與 Linux 上的 Docker 不同,不支援運作在 TCP 或 UDP 以下的網路協定。
  • 當啟用「增強容器隔離」(Enhanced Container Isolation) 時,此功能無法運作,因為將容器與主機隔離與允許它們存取主機網路兩者是相互衝突的。
  • 僅支援 Linux 容器。Host 網路不適用於 Windows 容器。

下一步

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.