【问题标题】:Connect to Windows Postgres from Debian Docker container从 Debian Docker 容器连接到 Windows Postgres
【发布时间】:2019-03-16 19:33:21
【问题描述】:

我在 Windows 10 计算机上运行 Postgres,我想从 Docker 容器连接到它。我遵循了许多来源的说明,并且事情应该正常工作,但它们没有。

用于创建 Docker 容器的命令行:

docker run --rm -d --network=host --name mycontainer myimage

postgresql.conf:

listen_addresses = '*'  

pg_hba.conf:

host    all             all             172.17.0.0/16           trust

在容器的 bash shell 中,我运行:

psql -h 127.0.0.1

我得到了错误:

psql:无法连接到服务器:连接被拒绝

服务器是否在主机“127.0.0.1”上运行并接受端口 5432 上的 TCP/IP 连接?

不用说,Postgres 肯定在我的计算机上运行,​​我可以从本地应用程序中查询它。我错过了什么?

【问题讨论】:

    标签: postgresql docker docker-for-windows


    【解决方案1】:

    这不适用于 Docker v18.03 及更高版本
    答案已经有了——From inside of a Docker container, how do I connect to the localhost of the machine?

    这个问题与 mysql 设置有关,但它也应该适用于您的情况。

    适用于 DOCKER v18.03 以后

    使用host.docker.internal 指代主机。

    https://docs.docker.com/docker-for-windows/networking/#i-cannot-ping-my-containers

    【讨论】:

    【解决方案2】:

    正如您所发现的,--network-host 不适用于 Docker for Windows 或 Docker for Mac。 It only works on Linux hosts.

    这种情况的一个选项可能是在容器中托管 PostgreSql。如果您使用docker-compose 文件部署它们,您应该能够拥有两个独立的 Docker 容器(一个用于数据库,一个用于您的服务),它们联网在一起。默认情况下,docker-compose will expose containers 使用容器名称作为其 DNS 名称在同一个撰写文件中的其他人。

    您也可以考虑将数据库包含在与您的服务相同的容器中,但我认为 docker-compose 解决方案更好,原因如下:

    1. 它坚持每个容器只有一个进程和单一职责的最佳实践。
    2. 这意味着您可以轻松更改和重新部署您的服务,而无需重新创建数据库容器。

    【讨论】:

      【解决方案3】:

      使用主机的真实 IP 地址或使用 dns 名称的解决方法配置 docker 容器内的连接

      【讨论】:

      • 你是对的,这行得通。但是我不能让我的 appsettings 引用我的实际 IP 地址或 DNS 名称,因为它在源代码控制中与其他希望在他们的计算机上运行的开发人员共享。我需要它指向“localhost”或 127.0.0.1 或其他一些这样的通用地址。
      • localhost 和 127.0.0.1 总是很复杂......因为从容器 pov 中有在容器内
      • 好的,如果失败了,有没有办法将其他通用地址映射到主机?
      • 我什么都不知道......我还将 postgres 放在一个容器中,让它们在一个组合或堆栈方案中运行。因为你更灵活,你可以通过容器名称访问 postgresql
      猜你喜欢
      • 2016-07-20
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 2020-04-27
      • 2020-06-06
      • 2018-11-28
      相关资源
      最近更新 更多