如何从 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=host
或 network_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 文件连接到 Postgres docker 容器 [重复]
从不同的docker-compose从一个容器连接到另一个容器[重复]
无法从 docker-compose 文件中定义的另一个服务连接到 nsqd