主机网络驱动程序
如果对容器使用网络模式,则该容器的网络
堆栈未与 Docker 主机隔离(容器共享主机的
networking 命名空间),并且容器不会分配自己的 IP 地址。
例如,如果您运行一个绑定到端口 80 的容器,并且您使用网络,则容器的应用程序在主机 IP 上的端口 80 上可用
地址。host
host
注意
鉴于容器在使用模式网络时没有自己的 IP 地址,因此端口映射不会 take effect 和 、 、 和 选项 是 ignored,而是生成警告:
host
-p
--publish
-P
--publish-all
WARNING: Published ports are discarded when using host network mode
主机模式联网可用于以下使用案例:
- 优化性能
- 在集装箱需要处理大量港口的情况下
这是因为它不需要网络地址转换 (NAT),并且没有为每个端口创建 “userland-proxy”。
Docker Engine(仅限 Linux)和 Docker Desktop 版本 4.34 及更高版本支持主机网络驱动程序。
您还可以将网络用于 swarm 服务,方法是将 command 传递给 swarm 服务。在这种情况下,请控制流量(流量
与管理 Swarm 和服务相关)仍通过叠加层发送
网络,但各个 Swarm 服务容器使用 Docker 发送数据
daemon 的主机网络和端口。这会产生一些额外的限制。例如
如果服务容器绑定到端口 80,则只有一个服务容器可以在
给定的 Swarm 节点。host
--network host
docker service create
Docker 桌面
Docker Desktop 版本 4.34 及更高版本支持主机联网。 要启用此功能,请执行以下操作:
- 在 Docker Desktop 中登录到 Docker 帐户。
- 导航到 设置。
- 在 Resources (资源) 选项卡下,选择 Network (网络)。
- 选中 Enable host networking 选项。
- 选择 Apply and restart(应用并重启)。
此功能在两个方向上都有效。这意味着您可以 从您的主机访问容器中运行的服务器,您可以访问 从使用 Host 启动的任何容器在主机上运行的服务器 已启用联网。支持 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
局限性
- 容器内的进程无法绑定到主机的 IP 地址 因为容器无法直接访问主机的接口。
- Docker Desktop 的主机网络功能在第 4 层工作。这意味着 与 Linux 上的 Docker 不同,在 TCP 或 UDP 下运行的网络协议是 不支持。
- 此功能在启用增强型容器隔离后不起作用,因为 将容器与主机隔离并允许它们访问主机 网络相互矛盾。
- 仅支持 Linux 容器。主机联网不起作用 Windows 容器。
后续步骤
- 完成主机联网教程
- 从容器的角度了解网络
- 了解桥接网络
- 了解叠加网络
- 了解 Macvlan 网络