I have a server with installed PostgreSQL. All my services work in containers (docker-compose). I want to use my Host PostgreSQL from containers. Buy I have the error:
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)
My docker-compose is using host network_mode, like this:
version: '3'
services:
shop:
container_name: shop
build: ./shop
hostname: shop
restart: always
ports:
- 8084:8084
network_mode: "host"
My database connection URL is: jdbc:postgresql://localhost:5432/shop-bd
This would have worked if you were on linux OS. But this won't work on Mac or Windows. The thing is that when you use
--net=host
, you still are not on host network. That is the limitation of how docker for windows workInstead of localhost you need to use
docker.for.win.localhost
as the host. This is a special DNS name which is available on Docker for Windows when you want to refer to the host localhostCautionary note: using the --net=host, or network_mode: "host" will prevent your container from registering with Eureka and will break any kind of API gateway you've got unless they all run on the same network.
1) ensure that your postgresql instance is listening to all addresses and not only localhost.
In postgresql.conf set
listen_addresses
as follows:2) you are trying to connect from your container to
localhost:5432
. That is NOT your host's IP address, but the address of your container'sloopback device
. You need to use your docker bridge IP address instead.Updated Apri, 2018
According to the document, from version 18.03 onwards, using
host.docker.internal
as DNS works for me, without specifying neither--net=host
ornetwork_mode: "host"