主机网络驱动
如果您为容器使用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 及更高版本支持主机网络。 要启用此功能:
- 在 Docker Desktop 中登录您的 Docker 账户。
- 导航到设置。
- 在资源选项卡下,选择网络。
- 勾选启用主机网络选项。
- 选择应用并重启。
此功能在两个方向上都有效。这意味着您可以从主机访问在容器中运行的服务器,并且可以从启用了主机网络的任何容器访问在主机上运行的服务器。支持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容器。
下一步
- 浏览 主机网络教程
- 了解 从容器的角度看网络
- 了解 桥接网络
- 了解 overlay networks
- 了解 Macvlan 网络