主机网络驱动程序
如果您为一个容器使用 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),并且不会为每个端口创建“用户态代理”。
主机网络驱动程序在 Docker Engine(仅限 Linux)和 Docker Desktop 4.34 及更高版本上受支持。
您也可以通过将 --network host 传递给 docker service create 命令,为 Swarm 服务使用 host 网络。在这种情况下,控制流量(与管理 Swarm 和服务相关的流量)仍然通过覆盖网络发送,但各个 Swarm 服务容器使用 Docker 守护程序的主机网络和端口发送数据。这会带来一些额外的限制。例如,如果一个服务容器绑定到端口 80,那么在给定的 Swarm 节点上只能运行一个服务容器。
Docker Desktop
Docker Desktop 4.34 及更高版本支持主机网络。要启用此功能:
- 在 Docker Desktop 中登录您的 Docker 账户。
- 导航到 Settings。
- 在 Resources 选项卡下,选择 Network。
- 勾选 Enable host networking 选项。
- 选择 Apply and restart。
此功能是双向工作的。这意味着您可以从主机访问在容器中运行的服务器,也可以从任何以主机网络启用的容器中访问在主机上运行的服务器。支持 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 上的 Web 服务器),您可以这样做:
$ nc localhost 80
限制
- 容器内的进程无法绑定到主机的 IP 地址,因为容器没有直接访问主机接口的权限。
- Docker Desktop 的主机网络功能工作在第 4 层。这意味着,与 Linux 上的 Docker 不同,不支持在 TCP 或 UDP 以下运行的网络协议。
- 此功能在启用增强型容器隔离的情况下无法工作,因为将容器与主机隔离和允许它们访问主机网络是相互矛盾的。
- 仅支持 Linux 容器。主机网络不适用于 Windows 容器。
后续步骤
- 请参阅主机网络教程
- 了解从容器角度看网络
- 了解桥接网络
- 了解覆盖网络
- 了解Macvlan 网络