主機網路驅動程式
如果您為一個容器使用 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 及更高版本支援主機網路。要啟用此功能:
- 在 Docker Desktop 中登入您的 Docker 賬戶。
- 導航到 Settings。
- 在 Resources 選項卡下,選擇 Network。
- 勾選 Enable host networking 選項。
- 選擇 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 容器。
後續步驟
- 請參閱主機網路教程
- 瞭解從容器角度看網路
- 瞭解橋接網路
- 瞭解覆蓋網路
- 瞭解Macvlan 網路