如何在不使用网桥的情况下以跨平台方式从 Docker 容器内部访问主机上运行的服务?

问题描述 投票:0回答:1

我已阅读这两个问题及更多问题的所有答案:

我有一个 CLI,可以在主机系统上的各种端口上的

127.0.0.1
上本机运行一些服务。它还在容器中启动 Postgres 并将其暴露在主机上的
127.0.0.1:5432
处。

完成此操作后,CLI 会启动一个连接到 Postgres 的新容器。

我想要一次调用来运行这个可跨所有主机平台运行的最终容器。特别是:

  • MacOS(Docker 桌面)
  • Windows (WSL)(Docker 桌面)
  • Windows(本机又名 NT 内核)(Docker 桌面)
  • Linux(Docker 桌面)

基于上面的第一个问题,如果我像这样运行容器,似乎应该可以在所有平台上从容器内部连接到

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 是否正在使用并相应地更改命令来解决此问题:

  • 无需 Docker for Desktop 使用
    --network host
    并从容器内连接到
    127.0.0.1
  • 使用 Docker for Desktop,请勿使用
    --network host
    并从容器内连接到
    host.docker.internal

问题是我发现主机是否是 Docker for Desktop 的检测还是不太可靠:How to see if Docker daemon is Docker Desktop.

在所有情况下,我都使用 Docker 版本 24.0.7,构建 afdd53b。

docker docker-networking docker-for-mac
1个回答
0
投票

我想通了。我正在使用此配置运行:

  • Postgres 绑定到容器内的 0.0.0.0。
  • 我将其发布到主机上的 127.0.0.1。

解决方案是在主机上发布到 0.0.0.0。换句话说,在运行 Postgres 容器时,执行以下操作:

--publish 0.0.0.0:5432:5432

而不是这个:

--publish 127.0.0.1:5432:5432

为什么这是必要的,我不太确定,但它有效!

© www.soinside.com 2019 - 2024. All rights reserved.