117
votes

I have created an ubuntu image with nginx, php and postgres.

I want to connect the postgres database in my current image with pgadmin located on my local machine.

I have tried using docker inspector to try to use the image ip to make a connection with my local pgadmin but without much success. I've also tried configuring some ports on local to make connection work.

19
You don't say whether PostgreSQL is listening for external connections (check your config files) or if that port appears open from the local machine.Richard Huxton
It doesn't seem possible to answer that question with so little info providedcthulhu

19 Answers

110
votes

It's a valid question don't know why people feel "doesn't seem possible to answer that question".

So, here's how I do what you are trying to do:

  1. Pull postgres image from Docker Hub

    docker pull postgres:latest
    
  2. Run the container using the below command

    docker run -p 5432:5432 postgres
    
  3. Using docker's inspect command find the IP

  4. Use that IP, PORT, Username, and Password to connect in PGADMIN

  5. You can also do a simple telnet like below to confirm if you can access docker postgres container:

    telnet IP_ADDRESS 5432
    
57
votes

What I have done success on windows 10 running docker for windows 1.12.6(9655), the step is like below:

  1. Pull the latest postgres

    docker pull postgres:latest

  2. run the postgres containner:

    docker run -d -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password123 --name db-my -p 5432:5432 --restart=always postgres

  3. Then installed the latest version of pgAdmin4 from pgadmin website

  4. Run pgAdmin 4 create new server, and input as following Host: 127.0.0.1 Port: 5432 User name: user password: password123

  5. Then everything is ok, connect to docker postgres instance success.
52
votes

Alternatively, you could combine Postgres and Pgadmin in one docker-compose file, and login as user [email protected], pwd: admin. To add the Posgres server, use hostname postgres, port 5432.

version: '3'
services:
  postgres:
    image: postgres
    hostname: postgres
    ports:
      - "6543:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: TEST_SM
    volumes:
      - postgres-data:/var/lib/postgresql/data
    restart: unless-stopped

  pgadmin:
    image: dpage/pgadmin4
    depends_on:
      - postgres
    ports:
      - "5555:80"
    environment:
      PGADMIN_DEFAULT_EMAIL: [email protected]
      PGADMIN_DEFAULT_PASSWORD: admin
    restart: unless-stopped

volumes:
  postgres-data:
48
votes

This is what i did

for postgres

docker run -p 5432:5432  --name container-postgresdb -e POSTGRES_PASSWORD=admin -d postgres

for pgadmin

docker run -p 5050:80  -e "[email protected]" -e "PGADMIN_DEFAULT_PASSWORD=admin"  -d dpage/pgadmin4

Connection string for pgadmin

host: host.docker.internal
database: postgres
user: postgres
password: admin

It works fine!!!!!

25
votes

In my case I could solve the problem inspecting my postgre image through command

docker inspect CONTAINER_ID  | grep IPAddress.

So, I used the docker ip address to config my pgadmin 4 connection and everything was fine. Thanks to @Afshin Ghazi

20
votes

If you verified that PostgreSQL is running and you can connect there with local copy of PgAdmin...

The answer is simple: use host.docker.internal istead of localhost for the PgAdmin running inside the Docker

use <code>host.docker.internal</code> istead of <code>localhost</code>

17
votes

If pgAdmin is intended to be run wihtin same Ubuntu host/guest, then you need to link postgres container, so it could be resolved by a name.

1. Run a postgres container:

docker run --name some-postgres -e POSTGRES_PASSWORD=postgres -d postgres

2. Run pgAdmin container:

docker run -p 80:80 --link some-postgres -e "[email protected]" -e "PGADMIN_DEFAULT_PASSWORD=postgres" -d dpage/pgadmin4

3. Now when adding new server in phAdmin web app, use some-postgres as server name

Note the --link some-postgres when we were bringing up the pgAdmin. This command makes postgres container visible to pgAdmin container.

16
votes

I included this in the docker yaml file to get the database and pgAdmin:

database:
    image: postgres:10.4-alpine
    container_name: kafka-nodejs-example-database
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    expose:
      - "5432"
    ports:
      - 8000:5432
    volumes:
      - ./services/database/schema.sql:/docker-entrypoint-initdb.d/1-schema.sql
      - ./services/database/seed.sql:/docker-entrypoint-initdb.d/2-seed.sql
  pgadmin:
    image: dpage/pgadmin4
    ports:
      - 5454:5454/tcp
    environment:
      - [email protected]
      - PGADMIN_DEFAULT_PASSWORD=postgres
      - PGADMIN_LISTEN_PORT=5454

The postgres username is alphaone and the password is xxxxxxxxxxx.

Do a docker ps to get the container id and then docker inspect <dockerContainerId> | grep IPAddress

eg: docker inspect 2f50fabe8a87 | grep IPAddress

Insert the Ip address into pgAdmin and the database credentials used in docker:

pgAdmin

8
votes

After facing this issue for two days i was able to resolve that issue.

solution of this problem is already answered by peoples like do inspect

docker inspect CONTAINER_ID

but while running this command i got a-lot of logs like Host Config Config Network Settings etc. so i got confused which IPAddress to add in the pgAdmin connection because i tried 0.0.0.0 and config, host, networkSettings different -2 IPAddress in the logs but finally it works after trying a-lot.

it works with which IP, we have to add that network ip address (which we created to connect the postgres and pgAdmin.)

like in my case when i run :-

docker inspect postgres_container

 "NetworkSettings": {
        "Bridge": "",
        "SandboxID": "sdffsffsfsfsfsf123232e2r3pru3ouoyoyuosyvo8769696796",
        "HairpinMode": false,
        "LinkLocalIPv6Address": "",
        "LinkLocalIPv6PrefixLen": 0,
        "Ports": {
            "5432/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "5432"
                }
            ]
        },
        "SandboxKey": "/var/run/docker/231231Ad132",
        "SecondaryIPAddresses": null,
        "SecondaryIPv6Addresses": null,
        "EndpointID": "",
        "Gateway": "",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "IPAddress": "",
        "IPPrefixLen": 0,
        "IPv6Gateway": "",
        "MacAddress": "",
        "Networks": {
            "postgres": {
                "IPAMConfig": null,
                "Links": null,
                "Aliases": [
                    "postgres",
                    "0e2j3bn2m42"
                ],
                "NetworkID": "35rhlhl3l53l5hlh3523233k3k4k22l3hk2k4",
                "EndpointID":"b3424n43k52o2i4n235k1k4l2l4hj234f14n2",
                "Gateway": "192.168.16.1",
                "IPAddress": "192.168.16.2",
                "IPPrefixLen": 20,
                "IPv6Gateway": "",

so we have to add the NetworkSettings -> Network -> Postgres(mine created network) -> IPAddress i.e. "IPAddress": "192.168.16.2".

After adding this ip it will work.

I hope it will help.

7
votes

This worked for me on Ubuntu 18:

1- Run a postgres container

docker run -d -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password123 --name my-postgres -p 5432:5432 postgres

2- Run a pgAdmin container

docker run --rm -p 5050:5050 thajeztah/pgadmin4

3- Get your local IP (in Ubuntu by ifconfig command)

4- Open localhost:5050 in your browser

5- Click on Servers >> Create >> Server...

6- In General tab, give it a name, for example: docker. In Connection tab, enter these fields:

Host name: The IP from 3

Username: user

Password: password123

7- Click on Save and now everything should work fine.

Note: If this didn't work, try "localhost" for the host name.

6
votes

In order or find your IP of the container, use following command

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id

Referrence: How to get a Docker container's IP address from the host

5
votes

In my case, I had a PostgreSQL container, so I didn't change my container or create a docker-compose approach, I needed pgadming after few months to had installed PostgreSQL, so this is my approach:

  1. docker inspect my_container_id_postgreSQL
  2. The network assigned to PostgreSQL was:

    "Networks": { "docker_default": { "IPAddress": "172.18.0.2", ... } }

  3. Ran my PGADMIN with --network command.

    docker run -p 85:80 --network docker_default -e '[email protected]' -e 'PGADMIN_DEFAULT_PASSWORD=SuperSecret' -d dpage/pgadmin4

  4. Insert the Ip address into pgAdmin and the database credentials used in docker.

I hope this can be useful for someone. Regards.

4
votes

You have to expose the postgres port in the container to you local system. You do this by running your container like this:

docker run -p 5432:5432 <name/id of container>

when connecting with your GUI client or CLI make sure to use the ip-address not localhost even if your ip-address is the localhost ip-address.

docker ps would give you the ip address your postgres container is on.

3
votes

You can create a Docker bridge network to do this too.

$ docker network create pgnet
a0ae44aaf6f806fc37302e4c603b4828c4edb8d487fd9cd90e2fb19ae1d5c65f

$ docker run --detach \
    --name pg \
    --network pgnet \
    --publish 5432:5432 \
    --restart always \
    --env POSTGRES_PASSWORD=pg123 \
    --volume ${PWD}/data:/var/lib/postgresql/data \
    postgres:12.1
b60611e43727dabe483c1f08fdf74961b886ce05b432a10a0625bd1b6db87899

$ docker run --detach \
    --name pgadm \
    --network pgnet \
    --publish 8000:80 \
    --volume ${PWD}/pgadmin:/var/lib/pgadmin \
    --env [email protected] \
    --env PGADMIN_DEFAULT_PASSWORD=pgadm123 \
    dpage/pgadmin4:4.20
27f9ce1c1c4c383ee1507f4e2d88f6ef33d4fcf5b209a8a03b87519f90d56312

Open http://localhost:8000/

  1. Click Add New Server
  2. Create - Server
    1. Name: db
    2. Hostname/address: pg
    3. Username: postgres
    4. Password: pg123
  3. Save

The Hostname/address used above is the name of the Postgres container given by --name pg

1
votes

To find the correct ip for your container, execute the following commands:

Check container ID:

docker ps

To check the correct IP of your container:

docker inspect <ID_CONTAINER> | grep "IPAddress"

The configuration of both PostgreSQL and PgAdmin with Docker are simple, if not right, I recommend redoing the configuration from scratch, if your problem is deeper.

Here is a script I developed to solve this problem. script-sh/install-docker-postgres-and-pgadmin

1
votes

For macOS IPs of postgres and pgadmin4 are different from the ones docker inspect provides. Type

docker-machine ls

Take a look at the name of the server on the left. It's default by default.

docker-machine ip default will IP you need to use for both, pgadmin4 in browser and for postgres in pgadmin4 settings.

0
votes

The solution I tried and worked for me, was to create a docker compose file where I included postgress and pgadmin as services. For more details: Connecting pgadmin to postgres in docker

0
votes

Are you using Window Subsystem LinuxWSL2 to run Docker and PgAdmin? The steps I suggested is similar to what folks suggested. In my case I am using window environment

Step 1: Open CMD and type ipconfig and hit enter.

Step 2: Check WSL IPv4 Adress

Ethernet adapter vEthernet (WSL):

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : 3bd9::997b:b52a::fe80::65b3%63
   IPv4 Address. . . . . . . . . . . : 172.172.172.1  // use the IP as host/address
   Subnet Mask . . . . . . . . . . . : 255.255.255.255

Step 3: Open PgAdmin from the browse and create a server

Step 4:

// Here it depends on your desired config mine is the following

Server: postgres
host address:  IPv4 Address(step 2)
username: postgress(username for postgress)
password: password(password for postgress)

I spend two days to figure out what was wrong, I hope someone will find it helpful

0
votes

If local host port 5432 already in use by another psql servers, change it when creating the container and in Pgadmin. screen