主机网络驱动程序

如果您对容器使用 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 下运行的网络协议不受支持。
  • 此功能与启用增强型容器隔离不兼容,因为隔离容器与主机并允许它们访问主机网络彼此矛盾。

下一步