Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Docker to launch web app, can't connect to Postgresql DB?

I received the following error when trying to write session data using Tomcat's PersistentManager to a Postgres DB running on my local machine:

SEVERE: A SQL exception occurred org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

The application itself runs in a docker container. For completeness sake, my current context.xml file is:

<?xml version='1.0' encoding='utf-8'?>
<Context>
<Manager className="org.apache.catalina.session.PersistentManager"
    distributable="true"  processExpiresFrequency="6" maxIdleBackup="0" debug="99" >
    <Store className="org.apache.catalina.session.JDBCStore"
        driverName="org.postgresql.Driver"
        connectionURL="jdbc:postgresql://localhost/admin?stringtype=unspecified"
        connectionName="admin" connectionPassword="admin"
        sessionAppCol="app_name" sessionDataCol="session_data" sessionIdCol="session_id"
        sessionLastAccessedCol="last_access" sessionMaxInactiveCol="max_inactive"
        sessionTable="tomcat_sessions_tb" sessionValidCol="valid_session" />
</Manager>
</Context>

Pursuant to the suggestions here: Postgresql : Connection refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections

I confirmed via a netstat -aln | grep LISTEN that Postgresql is running and listening on the correct ports:

tcp4       0      0  127.0.0.1.5432         *.*                    LISTEN     
tcp6       0      0  ::1.5432                                      *.*                                           LISTEN     

and that my postgresql.conf (located in usr/local/var/postgres) has listen_addresses = localhost and port = 5432, which mirrors the host and port of my running server in Pgadmin3.

I suspect that the problem is that Docker runs in a VM, and thus the local information I have obtained may not be the whole story. Reading up on the available information online, it seems that I may require some sort of bridged networking.
However, I admit I am a novice in this area, and I'm unsure of how to set it up.

like image 377
Rome_Leader Avatar asked May 27 '16 11:05

Rome_Leader


People also ask

Can I run Postgres in docker?

Installing the PostgreSQL Docker imageYou can pull images from the Docker hub and can also publish your images to the Docker hub. The official PostgreSQL Docker image can be found on the Docker Hub. To pull the image to your local, you can run the following command on the terminal.


1 Answers

Why I can NOT connect to localhost:5432?

Cat your container's /etc/hosts

$ sudo docker exec -it [container] cat /etc/hosts

For docker networks is bridge by default, the localhost inside points to container itself(Docker default bridge network). Then you don't have 5432 listening in your container:

$ sudo docker exec [container] nc -v -z localhost 5432

Solution 1. If you wanna hardcode the "localhost:5432" inside your config xml, the easiest way is creating your container with the option "--net=host":

$ sudo docker run --net=host -it ...

Solution 2. Change the localhost of your docker host ip inside the container
  • Get your docker host ip
    $ sudo docker inspect -f '{{ .NetworkSettings.Gateway }}' 
    192.168.5.1
  • Enter your container:
    $ sudo docker exec -it [container] /bin/bash
  • Edit the file /etc/hosts to point the localhost to docker host ip:
    $ sudo vim /etc/hosts
    192.168.5.1 localhost

Solution 3. Modify your db config file to use an alias instead of localhost:

connectionURL="jdbc:postgresql://DB_ALIAS/admin?stringtype=unspecified"
Then add the DB_ALIAS to the container's hosts :
$ sudo docker run --add-host DB_ALIAS:192.168.5.1 -it [image] ...
like image 106
LittleQ Avatar answered Sep 22 '22 08:09

LittleQ