主機網路驅動程式
如果您對容器使用 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 下執行的網路協議不受支援。
- 此功能與啟用增強型容器隔離不相容,因為隔離容器與主機並允許它們訪問主機網路彼此矛盾。
下一步
- 瀏覽主機網路教程
- 瞭解從容器的角度來看的網路
- 瞭解橋接網路
- 瞭解覆蓋網路
- 瞭解Macvlan 網路