主机网络驱动程序

如果您对容器使用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 及更高版本支持主机网络。要启用此功能:

  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上的Web服务器),您可以这样做:

$ nc localhost 80

局限性

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

后续步骤