方案一
使用 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'`