Let’s assume we have a web service running inside a Docker container. We also have a Postgres database running on a host system (i.e., outside of Docker as you probably don’t want to run a database in Docker in production). This means we need to allow a Docker container to connect to a local Postgres database.
Assuming you don’t want the container to share the network with the host (using
--network host parameter when running it), the database and the container need to be configured in order to communicate. Here’s how to do it.
Postgres configuration changes
The database needs configuration changes to allow connections from Docker containers.
First, find Postgres configuration files. They’re usually available in
Change the following line:
listen_addresses = 'localhost'
listen_addresses = '*'
This will allow Postgres to listen to all addresses, not just to localhost.
In this file, add the following line
host all all 172.17.0.1/16 md5
This line will allow connections to Postgres from
172.17.0.1/16 range of addresses. They belong to Docker and when running a container Docker will assign an IP to a container from this range.
When running your Docker container you need to configure it use the host system.
Tell the container about the host’s IP address
Pass the host’s IP using
--add-host option, e.g.:
In this case
host is a name of the host machine, and it will be added to container’s
Inside the Docker container, you will be able to use the name
host to connect to the host system.
Remember to publish container’s ports
For instance, if your dockerized app is running a server on port 8000, you can pass:
docker run command to make your app available on the host on port
docker run command can look similar to this:
docker run -dt --rm --add-host=host:<ip> --name container_name -p 8000:8000 image_name
Those changes should be enough to make a Postgres database running on a host system work with a containerized app.