主机网络驱动程序
如果您对容器使用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 帐户。
- 导航到**设置**。
- 在**资源**选项卡下,选择**网络**。
- 选中**启用主机网络**选项。
- 选择**应用并重启**。
此功能双向有效。这意味着您可以从主机访问在容器中运行的服务器,也可以从启用主机网络的任何容器访问主机上运行的服务器。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 下方运行的网络协议不受支持。
- 启用增强型容器隔离后,此功能将不起作用,因为隔离容器与主机并允许它们访问主机网络是相互矛盾的。
- 仅支持 Linux 容器。主机网络不适用于 Windows 容器。
后续步骤
- 浏览主机网络教程
- 了解从容器的角度来看网络
- 了解桥接网络
- 了解覆盖网络
- 了解Macvlan 网络