主機網路驅動程式

如果您對容器使用 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 命令,將 host 網路用於叢集服務。在此情況下,控制流量(與管理叢集和服務相關的流量)仍會透過覆蓋網路傳送,但個別叢集服務容器會使用 Docker 惡魔的主機網路和埠傳送資料。這會產生一些額外的限制。例如,如果服務容器繫結到埠 80,則在指定的叢集節點上只能執行一個服務容器。

Docker Desktop

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

  1. 在 Docker Desktop 中登入您的 Docker 帳戶。
  2. 瀏覽至 **設定**。
  3. 在 **資源** 索引標籤下,選取 **網路**。
  4. 勾選 **啟用主機網路** 選項。
  5. 選取 **套用並重新啟動**。

此功能雙向運作。這表示您可以從主機存取在容器中執行的伺服器,並且可以從任何以啟用主機網路的狀態啟動的容器存取在主機上執行的伺服器。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 上執行的網頁伺服器),您可以這樣做

$ nc localhost 80

限制

  • 容器內的處理程序無法繫結到主機的 IP 位址,因為容器無法直接存取主機的介面。
  • Docker Desktop 的主機網路功能在第 4 層運作。這表示與 Linux 上的 Docker 不同,不支援在 TCP 或 UDP 之下運作的網路協定。
  • 此功能在啟用「增強容器隔離」時無法運作,因為將容器與主機隔離並允許它們存取主機網路彼此矛盾。
  • 僅支援 Linux 容器。主機網路不適用於 Windows 容器。

後續步驟