主机网络驱动程序
如果您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 host
docker 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
容器中的地址才能在主机上可见。
下一步
- 完成 主机网络教程
- 从容器的角度了解网络
- 了解 桥接网络
- 了解 覆盖网络
- 了解 Macvlan 网络