如何从 docker-compose 连接到 Host PostgreSQL?

Posted

技术标签:

【中文标题】如何从 docker-compose 连接到 Host PostgreSQL?【英文标题】:How to connect from docker-compose to Host PostgreSQL? 【发布时间】:2018-06-29 06:28:27 【问题描述】:

我有一台安装了 PostgreSQL 的服务器。我所有的服务都在容器中工作(docker-compose)。我想从容器中使用我的 Host PostgreSQL。购买我有错误:

  Unable to obtain Jdbc connection from DataSource (jdbc:postgresql://localhost:5432/shop-bd) for user 'shop-bd-user': Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  SQL State  : 08001
  Error Code : 0
  Message    : Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

  Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
  Connection refused (Connection refused)

我的 docker-compose 正在使用 host network_mode,如下所示:

version: '3'
services:
  shop:  
    container_name: shop
    build: ./shop
    hostname: shop
    restart: always   
    ports:
      - 8084:8084
    network_mode: "host"

我的数据库连接URL是:jdbc:postgresql://localhost:5432/shop-bd

【问题讨论】:

你要求 docker 端口 8084:8084 而你没有说任何关于端口 5432 @Krishna 8084 是此服务的端口。其他服务可以通过http://localhost:8084 与该服务进行通信。但它不适用于主机数据库。 显示您的db 服务配置的样子。它应该在端口下有5432:5432 你在哪个操作系统上使用 docker? @TarunLalwani 我在 Windows 上开发 【参考方案1】:

1) 确保您的 postgresql 实例正在侦听所有地址,而不仅仅是 localhost。

在 postgresql.conf 中设置listen_addresses 如下:

listen_addresses='*'

2) 您正在尝试从您的容器连接到 localhost:5432 。这不是您主机的 IP 地址,而是您的容器 loopback device 的地址。您需要改用您的 docker 网桥 IP 地址。

【讨论】:

我使用--net=host,所以我可以使用localhost。我认为,问题的出现是因为 Windows。 是的,你是对的,我错过了你正在使用主机网络。【参考方案2】:

如果您使用的是 linux 操作系统,这将是可行的。但这不适用于 Mac 或 Windows。问题是当您使用--net=host 时,您仍然不在主机网络上。这就是 docker for windows 工作方式的局限

您需要使用 docker.for.win.localhost 作为主机,而不是 localhost。这是一个特殊的 DNS 名称,当您想要引用主机 localhost 时,它在 Docker for Windows 上可用

【讨论】:

【参考方案3】:

2018 年 4 月更新

根据document,从版本 18.03 开始​​,使用host.docker.internal 作为 DNS 对我有效,而无需指定 --net=hostnetwork_mode: "host"

【讨论】:

非常有帮助。请投票并接受这个答案! @BrendanGoggin 当然 This is for development purpose and will not work in a production environment outside of Docker Desktop for Mac【参考方案4】:

注意事项:使用 --net=host 或 network_mode: "host" 会阻止您的容器向 Eureka 注册,并且会破坏您拥有的任何类型的 API 网关,除非它们都在同一个网络上运行。

【讨论】:

【参考方案5】:

如果您是 mac 用户,请使用“host.docker.internal:5432”连接到 localhost Postgres,docs。

【讨论】:

以上是关于如何从 docker-compose 连接到 Host PostgreSQL?的主要内容,如果未能解决你的问题,请参考以下文章

无法从 docker-compose 连接到 docker

从 docker-compose 文件连接到 Postgres docker 容器 [重复]

从不同的docker-compose从一个容器连接到另一个容器[重复]

无法从 docker-compose 文件中定义的另一个服务连接到 nsqd

为啥我无法从本地主机上的 Gitlab CI 连接到我的 docker-compose 服务

Traefik无法通过docker-compose连接到服务器。