Docker容器访问宿主机网络

629 阅读3分钟

方案一

使用 host 模式启动服务。

在 Docker 中,Host 模式桥接模式是两种常见的网络模式,它们决定了 Docker 容器如何与主机系统以及其他容器进行通信。

1. Host 模式启动

Host 模式使容器直接使用宿主机的网络栈,而不是通过虚拟网络接口。这意味着容器将与宿主机共享网络环境,包括 IP 地址和端口号。

工作原理

  • 容器使用宿主机的网络接口,不再通过虚拟网桥(bridge)进行通信。
  • 容器内的服务和应用会绑定到宿主机的网络接口上,直接暴露主机的 IP 地址,而不需要通过 NAT 或端口映射。
  • 容器之间的通信就像宿主机本地的进程一样直接,可以使用宿主机的 IP 地址进行访问。

优点

  • 容器的网络性能较高,因为不需要额外的网络虚拟化。
  • 容器可以直接访问宿主机的端口和服务。

缺点

  • 容器与宿主机共享网络栈,可能会造成安全隐患,因为容器内部的应用可以直接访问宿主机的网络服务。
  • 容器内的端口号无法与宿主机上的其他进程区分开,可能会导致端口冲突。

启动命令

docker run --network host <image>

2. 桥接模式启动

桥接模式(Bridge Mode)是 Docker 默认的网络模式,在这种模式下,Docker 会为每个容器创建一个虚拟的网络接口,并将它们连接到 Docker 的虚拟网桥(通常是 docker0)上。

工作原理

  • 容器的网络通过一个虚拟网桥连接,容器获得一个虚拟的 IP 地址(通常是私有的 IP 地址),该 IP 地址位于 Docker 网络内部。
  • 容器内的应用通过虚拟网桥与宿主机及其他容器进行通信。
  • 如果需要让容器暴露到外部网络,可以通过端口映射(p-publish)将容器的端口映射到宿主机的端口上。

优点

  • 默认模式,适用于大多数场景。
  • 容器与宿主机相互隔离,容器的网络地址不会直接暴露给宿主机,增强了安全性。
  • 支持容器之间的通信以及通过端口映射访问宿主机外部。

缺点

  • 由于容器通过虚拟网桥通信,可能会有轻微的性能损失,特别是在需要高网络吞吐量的场景下。
  • 需要通过端口映射来实现外部访问,这可能会带来一定的配置复杂性。

启动命令

docker run --network bridge <image>

总结

特性Host 模式桥接模式
网络共享直接共享宿主机的网络栈容器通过虚拟网桥与宿主机和其他容器进行通信
性能更高性能,因为没有虚拟化的网络层性能可能略低,因为需要通过虚拟网桥进行网络通信
安全性较低,因为容器和宿主机共享网络,可能存在安全隐患较高,容器之间和宿主机隔离,只有通过端口映射才能访问
端口管理容器直接暴露宿主机 IP 地址,端口冲突可能性较大通过端口映射暴露容器端口给宿主机,避免冲突
典型应用场景性能要求较高的场景,或者容器需要访问宿主机的服务默认网络模式,适用于大多数应用,需要良好的隔离性

方案二

docker 官方提供了一种支持方案,可通过指向 host.docker.internal 来指向宿主机的 IP。参见文档:从容器连接到主机上的服务

通用方法

Support host.docker.internal DNS name to host (opens new window)

在命令行后面添加参数 --add-host="host.docker.internal:host-gateway"

如果使用的是 docker-compose,则通过添加如下内容进行配置:

`extra_hosts:

  • 'host.docker.internal:host-gateway'`