主机网络驱动

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

注意

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

警告:在使用主机网络模式时,已发布的端口将被丢弃

主机模式网络对于以下用例非常有用:

  • 优化性能
  • 在容器需要处理大量端口的情况下

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

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

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

Docker Desktop

Docker Desktop 版本 4.34 及更高版本支持主机网络。 要启用此功能:

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

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

示例

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

如果你想从容器访问主机上的服务(在这个例子中是一个运行在端口80上的网络服务器),你可以这样做:

$ nc localhost 80

限制

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

下一步