主机网络驱动程序

如果您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 功能提供。

您还可以通过传递 给命令来将host网络用于 swarm 服务。在这种情况下,控制流量(与管理 swarm 和服务相关的流量)仍然通过覆盖网络发送,但各个 swarm 服务容器使用 Docker 守护程序的主机网络和端口发送数据。这会产生一些额外的限制。例如,如果服务容器绑定到端口 80,则在给定的 swarm 节点上只能运行一个服务容器。--network hostdocker service create

Docker 桌面

Mac、Windows 和 Linux 的 Docker Desktop 4.29 及更高版本也支持主机网络作为 测试功能。要启用此功能,请导航至“设置”中的“开发中的功能”选项卡,然后选择“启用主机网络”

此功能可双向发挥作用。这意味着您可以从主机访问在容器中运行的服务器,也可以从启用主机网络启动的任何容器访问在主机上运行的服务器。支持 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

局限性

  • Docker Desktop 的主机网络功能在第 4 层上工作。这意味着与 Linux 上的 Docker 不同,不支持在 TCP 或 UDP 下运行的网络协议。
  • 此功能不适用于启用增强型容器隔离,因为将容器与主机隔离并允许它们访问主机网络是相互矛盾的。
  • 尚不支持 IPv6。服务需要使用 IPv4 并绑定到 127.0.0.1容器中的地址才能在主机上可见。

下一步