主机网络驱动程序
如果您对容器使用 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 功能提供。
您还可以通过将 --network host
传递给 docker service create
命令,对 swarm 服务使用 host
网络。在这种情况下,控制流量(与管理 swarm 和服务的流量)仍然通过覆盖网络发送,但单个 swarm 服务容器使用 Docker 守护程序的主机网络和端口发送数据。这会带来一些额外的限制。例如,如果一个服务容器绑定到端口 80,则只有一个服务容器可以在给定 swarm 节点上运行。
Docker 桌面版
主机网络在 Docker Desktop 版本 4.29 及更高版本中也支持 Mac、Windows 和 Linux,作为Beta 功能。要启用此功能,请导航到“设置”中的“正在开发的功能”选项卡,然后选择“启用主机网络”。
此功能双向工作。这意味着您可以从主机访问运行在容器中的服务器,并且可以从启用主机网络的任何容器访问运行在主机上的服务器。TCP 和 UDP 均被支持作为通信协议。
示例
以下命令在监听端口 8000
的容器中启动 netcat
$ 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 下运行的网络协议不受支持。
- 此功能与启用增强型容器隔离不兼容,因为隔离容器与主机并允许它们访问主机网络彼此矛盾。
下一步
- 浏览主机网络教程
- 了解从容器的角度来看的网络
- 了解桥接网络
- 了解覆盖网络
- 了解Macvlan 网络