主機網路驅動程式

如果您對容器使用 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),並且沒有為每個埠建立“使用者空間代理”。

主機網路驅動程式僅適用於 Linux 主機,但在 Docker Desktop 版本 4.29 及更高版本中作為 Beta 功能提供。

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

Docker 桌面版

主機網路在 Docker Desktop 版本 4.29 及更高版本中也支援 Mac、Windows 和 Linux,作為Beta 功能。要啟用此功能,請導航到“設定”中的“正在開發的功能”選項卡,然後選擇“啟用主機網路”。

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

示例

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

$ 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 下執行的網路協議不受支援。
  • 此功能與啟用增強型容器隔離不相容,因為隔離容器與主機並允許它們訪問主機網路彼此矛盾。

下一步