Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Docker container for Postgres 9.1 not exposing port 5432 to host

I'm trying to use a Docker container to run a PostgreSQL server, and connect with it from my host machine.

My configuration is:

  • Host machine: Mac OS X 10.10.5
  • Docker 1.10.1

I've done this:

Step 1: create a volume for permanent postgres data

docker volume create --name postgres_data 

Step 2: Start the postgres instance

UPDATE: As suggested in comments, I specified port mapping when running the container

docker run --name my_postgres_container -e POSTGRES_PASSWORD=my_password -v postgres_data:/var/lib/postgresql/data -p 5432:5432 -d postgres:9.1 

Step 3: connect to Docker instance by doing this:

docker run -it --link my_postgres_container:postgres --rm postgres:9.1 sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres' 

But I want to connect to that instance just by:

psql -h localhost -p 5432 -U postgres 

Like if I had installed Postgres locally in my host machine.

The problem is port 5432 is not exposed. So, I can't connect with it:

sudo lsof -i -P | grep -i "listen" --> no port 5432 open

UPDATE 2: Even stranger. I've also done this:

Stop Docker. Then, run a normal PostgreSQL 9.4.4 instance in my host machine (no docker involved here, just postgres running in my Mac OS X host, listening on port 5432). Everything is normal:

sudo lsof -i -P | grep -i "postgres"  postgres  14100          jorge    6u  IPv4 0x780274158cebef01      0t0  TCP localhost:5432 (LISTEN) 

I can connect with my local postgres instance without any problem (look the output of the command: is the postgres compiled for Mac OS X, my host):

psql -h localhost -U postgres -c "select version()"                                                                 version ---------------------------------------------------------------------------------------------------------------------------------------  PostgreSQL 9.4.4 on x86_64-apple-darwin14.3.0, compiled by Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn), 64-bit (1 row) 

Now the fun part. I start my Docker instance again, while the host PostgreSQL instance is running.

It starts! (and it shouldn't). I can even connect using docker run...

docker run -it --link my_postgres_instance:postgres --rm postgres:9.1 sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres' 

If I run select version() now, it shows postgres running inside my docker instance at the same time postgres is running in my host, out of docker, using the same 5432 port. (Look at the ouput, is postgres compiled for Debian, the OS inside the postgres:9.1 container)

postgres=# select version();                                             version ------------------------------------------------------------------------------------------------  PostgreSQL 9.1.20 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit (1 row) 

Why?

Does it make sense? My final goal is to run a Django app in another Docker container and connect with my Postgres instance. How could I do that?

like image 387
Jorge Arévalo Avatar asked Mar 10 '16 22:03

Jorge Arévalo


People also ask

What port does Postgres Docker use?

Docker automatically maps the default PostgreSQL server port 5432 in the container to a host port within the ephemeral port range (typically from 32768 to 61000).

Is Postgres running on port 5432?

Usually Postgres is the only app interested in using port 5432, but if after issuing the first command to see what is running on port 5432, you find out that there is an application other than PostgreSQL running on port 5432, try to check the activity monitor and see what app might be interfering with your PostgreSQL ...

How do I connect Docker expose port?

You can expose a port through your Dockerfile or use --expose and then publish it with the -P flag. This will bind the exposed port to your Docker host on a random port (verified by running docker container ls ). You can expose a port through your Dockerfile or use --expose and then publish it with the -p 80:80 flag.


2 Answers

It's 2018 and I just had a similar problem. The solution for me seemed to be with the order of props to docker. e.g. this resulted in no port being exposed;

docker run -d --name posttest postgres:alpine -e POSTGRES_PASSWORD=fred -p 5432:5432

while this worked fine (image exposed port 5432 as expected);

docker run --name posttest -d -p 5432:5432 -e POSTGRES_PASSWORD=fred postgres:alpine

like image 114
MrGreg Avatar answered Nov 11 '22 10:11

MrGreg


Your docker host is a virtual machine, which has it's own IP adddres. You can detect this IP address by entering the following command:

docker-machine ip 

The answer will be something like 192.168.99.100

When you have mapped the ports using the -p 5432:5432 switch, you will be able to connect to postgres with any tool from your dev machine using the IP address mentioned.

like image 42
Marcel Posdijk Avatar answered Nov 11 '22 12:11

Marcel Posdijk