主机网络驱动程序

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

注意

鉴于容器在使用模式网络时没有自己的 IP 地址,因此端口映射不会 take effect 和 、 、 和 选项 是 ignored,而是生成警告:host-p--publish-P--publish-all

WARNING: Published ports are discarded when using host network mode

主机模式联网可用于以下使用案例:

  • 优化性能
  • 在集装箱需要处理大量港口的情况下

这是因为它不需要网络地址转换 (NAT),并且没有为每个端口创建 “userland-proxy”。

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

您还可以将网络用于 swarm 服务,方法是将 command 传递给 swarm 服务。在这种情况下,请控制流量(流量 与管理 Swarm 和服务相关)仍通过叠加层发送 网络,但各个 Swarm 服务容器使用 Docker 发送数据 daemon 的主机网络和端口。这会产生一些额外的限制。例如 如果服务容器绑定到端口 80,则只有一个服务容器可以在 给定的 Swarm 节点。host--network hostdocker service create

Docker 桌面

Docker Desktop 版本 4.34 及更高版本支持主机联网。 要启用此功能,请执行以下操作:

  1. 在 Docker Desktop 中登录到 Docker 帐户。
  2. 导航到 设置
  3. Resources (资源) 选项卡下,选择 Network (网络)。
  4. 选中 Enable host networking 选项。
  5. 选择 Apply and restart(应用并重启)。

此功能在两个方向上都有效。这意味着您可以 从您的主机访问容器中运行的服务器,您可以访问 从使用 Host 启动的任何容器在主机上运行的服务器 已启用联网。支持 TCP 和 UDP 作为通信协议。

例子

以下命令在侦听 port 的容器中启动 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

如果随后您希望从容器(在此 示例:在 port 上运行的 Web 服务器),您可以这样做:80

$ nc localhost 80

局限性

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

后续步骤