Host 网络驱动程序

如果您为容器使用 host 网络模式,该容器的网络栈将不与 Docker 主机隔离(容器共享主机的网络命名空间),并且该容器不会分配到自己的 IP 地址。例如,如果您运行一个绑定到端口 80 的容器并使用 host 网络,则该容器的应用程序可以通过主机 IP 地址上的端口 80 访问。

注意

鉴于容器在使用 host 模式网络时没有自己的 IP 地址,端口映射不起作用,并且 -p--publish-P--publish-all 选项会被忽略,取而代之的是产生一个警告。

WARNING: Published ports are discarded when using host network mode

Host 模式网络适用于以下用例

  • 优化性能
  • 容器需要处理大范围端口的情况

这是因为它不需要网络地址转换 (NAT),并且不会为每个端口创建“用户态代理”。

Host 网络驱动程序在 Docker Engine(仅限 Linux)和 Docker Desktop 4.34 及更高版本中受支持。

您还可以通过将 --network host 参数传递给 docker service create 命令,为 Swarm 服务使用 host 网络。在这种情况下,控制流量(与管理 Swarm 和服务相关的流量)仍然通过 overlay 网络发送,但单个 Swarm 服务容器使用 Docker 守护进程的 host 网络和端口发送数据。这会带来一些额外的限制。例如,如果一个服务容器绑定到端口 80,那么在给定的 Swarm 节点上只能运行一个服务容器。

Docker Desktop

Host 网络在 Docker Desktop 4.34 及更高版本中受支持。要启用此特性:

  1. 登录 Docker Desktop 中的 Docker 账户。
  2. 导航到 设置
  3. 资源 选项卡下,选择 网络
  4. 勾选 启用 host 网络 选项。
  5. 选择 应用并重启

此特性是双向工作的。这意味着您可以从主机访问在容器中运行的服务器,也可以从任何启用了 host 网络的容器访问在主机上运行的服务器。TCP 和 UDP 都受支持作为通信协议。

示例

以下命令在一个监听端口 8000 的容器中启动 netcat

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

端口 8000 将在主机上可用,您可以从另一个终端使用以下命令连接到它

$ nc localhost 8000

您在此处输入的内容将显示在运行容器的终端上。

要从容器访问在主机上运行的服务,您可以使用此命令启动一个启用了 host 网络的容器

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

如果您然后想从容器访问主机上的服务(在此示例中是在端口 80 上运行的 Web 服务器),您可以这样做

$ nc localhost 80

限制

  • 容器内的进程无法绑定到主机的 IP 地址,因为容器无法直接访问主机的接口。
  • Docker Desktop 的 host 网络特性在第 4 层工作。这意味着与 Linux 上的 Docker 不同,不支持低于 TCP 或 UDP 的网络协议。
  • 此特性在启用了增强容器隔离时不起作用,因为将容器与主机隔离和允许它们访问主机网络是相互矛盾的。
  • 仅支持 Linux 容器。Host 网络不适用于 Windows 容器。

下一步

页面选项