我已阅读这两个问题及更多问题的所有答案:
我有一个 CLI,可以在主机系统上的各种端口上的
127.0.0.1
上本机运行一些服务。它还在容器中启动 Postgres 并将其暴露在主机上的 127.0.0.1:5432
处。
完成此操作后,CLI 会启动一个连接到 Postgres 的新容器。
我想要一次调用来运行这个可跨所有主机平台运行的最终容器。特别是:
基于上面的第一个问题,如果我像这样运行容器,似乎应该可以在所有平台上从容器内部连接到
host.docker.internal
。假设容器中的二进制文件根据此 ADDR
env var: 知道要连接到哪里
docker run --add-host host.docker.internal:host-gateway -e ADDR=host.docker.internal:5432 my_image
在 Docker Desktop 环境下不需要
--add-host
标志,但在 Linux 上,这是让容器访问主机所必需的。事实上,这只适用于带有 --network host
的 Linux。我可以从日志中看到名称解析工作成功(它尝试从容器内连接到 172.17.0.1
),但在没有 --network host
的情况下连接失败,可能是由于某些权限问题(我在 Linux 上以 root 身份运行)。问题是,如果我将 --network host
与 Docker for Desktop 一起使用,则无法连接。
假设我无法通过创建自定义网络、使用桥接网络来解决此问题,并且我必须将容器中和容器外的所有服务绑定到
127.0.0.1
。
目前我正在通过让 CLI 确定 Docker Desktop 是否正在使用并相应地更改命令来解决此问题:
--network host
并从容器内连接到 127.0.0.1
。--network host
并从容器内连接到 host.docker.internal
。问题是我发现主机是否是 Docker for Desktop 的检测还是不太可靠:How to see if Docker daemon is Docker Desktop.
在所有情况下,我都使用 Docker 版本 24.0.7,构建 afdd53b。
我想通了。我正在使用此配置运行:
解决方案是在主机上发布到 0.0.0.0。换句话说,在运行 Postgres 容器时,执行以下操作:
--publish 0.0.0.0:5432:5432
而不是这个:
--publish 127.0.0.1:5432:5432
为什么这是必要的,我不太确定,但它有效!