主機網路驅動程式

如果您為一個容器使用 host 網路模式,該容器的網路堆疊不會與 Docker 主機隔離(容器共享主機的網路名稱空間),並且容器不會獲得自己分配的 IP 地址。例如,如果您執行一個繫結到埠 80 的容器並使用 host 網路,那麼該容器的應用程式將在主機的 IP 地址的 80 埠上可用。

注意

鑑於在使用 host 模式網路時容器沒有自己的 IP 地址,埠對映不會生效,並且 -p--publish-P--publish-all 選項會被忽略,同時會產生一個警告。

WARNING: Published ports are discarded when using host network mode

主機模式網路對於以下用例可能很有用:

  • 最佳化效能
  • 在容器需要處理大量埠的情況下

這是因為它不需要網路地址轉換 (NAT),並且不會為每個埠建立“使用者態代理”。

主機網路驅動程式在 Docker Engine(僅限 Linux)和 Docker Desktop 4.34 及更高版本上受支援。

您也可以透過將 --network host 傳遞給 docker service create 命令,為 Swarm 服務使用 host 網路。在這種情況下,控制流量(與管理 Swarm 和服務相關的流量)仍然透過覆蓋網路傳送,但各個 Swarm 服務容器使用 Docker 守護程式的主機網路和埠傳送資料。這會帶來一些額外的限制。例如,如果一個服務容器繫結到埠 80,那麼在給定的 Swarm 節點上只能執行一個服務容器。

Docker Desktop

Docker Desktop 4.34 及更高版本支援主機網路。要啟用此功能:

  1. 在 Docker Desktop 中登入您的 Docker 賬戶。
  2. 導航到 Settings
  3. Resources 選項卡下,選擇 Network
  4. 勾選 Enable host networking 選項。
  5. 選擇 Apply and restart

此功能是雙向工作的。這意味著您可以從主機訪問在容器中執行的伺服器,也可以從任何以主機網路啟用的容器中訪問在主機上執行的伺服器。支援 TCP 和 UDP 作為通訊協議。

示例

以下命令在容器中啟動 netcat,監聽埠 8000

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

然後,埠 8000 將在主機上可用,您可以從另一個終端使用以下命令連線到它:

$ nc localhost 8000

您在此處輸入的內容將顯示在執行容器的終端上。

要從容器訪問主機上執行的服務,您可以使用此命令啟動一個啟用了主機網路的容器:

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

如果您想從容器訪問主機上的服務(在此示例中是執行在埠 80 上的 Web 伺服器),您可以這樣做:

$ nc localhost 80

限制

  • 容器內的程序無法繫結到主機的 IP 地址,因為容器沒有直接訪問主機介面的許可權。
  • Docker Desktop 的主機網路功能工作在第 4 層。這意味著,與 Linux 上的 Docker 不同,不支援在 TCP 或 UDP 以下執行的網路協議。
  • 此功能在啟用增強型容器隔離的情況下無法工作,因為將容器與主機隔離和允許它們訪問主機網路是相互矛盾的。
  • 僅支援 Linux 容器。主機網路不適用於 Windows 容器。

後續步驟