如何跨平台在Docker容器内访问主机服务(无需网桥)
跨平台Docker容器连接主机Postgres的问题
已查阅的相关问题
- 《从Docker容器内部如何连接到主机的localhost?》
- 《如何从Docker容器访问主机端口?》
场景描述
我有一个CLI工具,在主机系统的127.0.0.1多个端口上原生运行部分服务,同时会启动一个Postgres容器,并将该服务暴露在主机的127.0.0.1:5432。完成这些操作后,CLI工具需要启动一个新容器来连接这个Postgres服务。
需要支持的平台包括:
- MacOS(Docker Desktop)
- Windows(WSL)(Docker Desktop)
- Windows(原生NT内核)(Docker Desktop)
- Linux(Docker Desktop)
尝试过的解决方案
根据查阅的问题,尝试过以下容器启动命令,期望在所有平台下容器内都能通过host.docker.internal连接主机:
docker run --add-host host.docker.internal:host-gateway -e ADDR=host.docker.internal:5432 my_image
实际测试发现:
- Docker Desktop环境下无需
--add-host参数即可正常工作 - Linux系统中,必须添加
--add-host才能让容器解析到主机地址,但即使解析成功(容器内尝试连接172.17.0.1),不使用--network host时连接仍然失败(已以root身份运行) - 若在Docker Desktop环境中使用
--network host,则连接会直接失败
当前方案的局限性
由于无法通过自定义网络、网桥网络解决问题,且必须将容器内外所有服务绑定到127.0.0.1,我当前的解决方案是让CLI工具检测主机是否使用Docker Desktop,然后调整启动命令:
- 未使用Docker Desktop时,使用
--network host,容器内连接127.0.0.1 - 使用Docker Desktop时,不使用
--network host,容器内连接host.docker.internal
但问题在于,检测主机是否使用Docker Desktop的机制并不稳定。
注:所有场景使用的Docker版本均为24.0.7,build afdd53b。
内容的提问来源于stack exchange,提问作者Daniel Porteous
相关产品推荐
相关产品推荐

