Overview

To run PostgreSQL on Docker

Run PostgreSQL on docker:

Pull the Image from Docker Hub

docker pull postgres

Verify the downloaded image

λ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
postgres            latest              b97bae343e06        3 weeks ago         313MB
alpine              latest              a24bb4013296        4 weeks ago         5.57MB
hello-world         latest              bf756fb1ae65        6 months ago        13.3kB

Volume Container

Create a Volume Container for persisting data generated by and used by Docker containers,here the PostgeSQL container. Otherwise the data would be lost in case if you want to remove the PostgreSQL container. the -v parameter should match the PostgreSQL default data path.

λ docker create -v /var/lib/postgresql/data --name postgresql-data alpine
be73eac8183f809a606d9484118a9775de9d97c0ed6a5204b19403b96e5e98e6

Run PostgreSQL with volumne container

λ docker run --name postgres1 -e POSTGRES_PASSWORD=password123 -d --volumes-from postgresql-data postgres

Verify db status

λ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
9426aa235613        postgres            "docker-entrypoint.s…"   15 seconds ago      Up 14 seconds       5432/tcp            postgres1

Connect to PostGreSQL

To Connect to PostgreSQL, we might need to use the network IP address. First find the network details of docker:

λ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
9a74c109118a        bridge              bridge              local
38c6238bcf19        host                host                local
5da6ef33f9d0        none                null                local

Here, ‘bridge’ is our network. Lets find the IP address for the postgres:

λ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "9a74c109118a93cdbcdb43da734d0275ad1ea57fa1580a231067d54d074a352d",
        "Created": "2020-07-02T23:51:23.8227395Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "8a598f453cab6034ee76415d8c1456214e4111d2332d72e08b3ad8959c99fdb3": {
                "Name": "elegant_babbage",
                "EndpointID": "fa8ac23b634a95738ff8e11e6ecb3b72c4d39ac08859b2898f7664840b7a00e9",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "eeb90789f0f66d1c44560efc0287e49f04cfe66a05f32d48f4c50c9096c1f39f": {
                "Name": "postgres1",
                "EndpointID": "d6f68665bccc4f59767c451ef77cf913a3dbac2e5143b93eea2b43b77730ff25",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

From above output, we can deduct that the postgres1 IP is 172.17.0.2. Lets connect using psql:

λ docker run -it --rm --network bridge postgres psql -h 172.17.0.2 -U postgres
Password for user postgres:
psql (12.3 (Debian 12.3-1.pgdg100+1))
Type "help" for help.

postgres=# 

PgAdmin

We can also use PgAdmin to connect to the Database

Pull the PgAdmin image

λ docker pull dpage/pgadmin4
Using default tag: latest
latest: Pulling from dpage/pgadmin4
....
Digest: sha256:e653453cbeeba098bae4de9c7c3388278d4b695814f2f6d25ceed2a02ce7887c
Status: Downloaded newer image for dpage/pgadmin4:latest
docker.io/dpage/pgadmin4:latest

Run PgAdmin docker

λ docker run -p 80:80 -e "PGADMIN_DEFAULT_EMAIL=user@domain.com" -e "PGADMIN_DEFAULT_PASSWORD=password123" -d dpage/pgadmin4
ddcbeab01f28a1c9fb051e238e57ae534f916cc6f586e27d35233db87e25b4c7

Now we will have PostgreSQL and PgAdmin running:

λ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
eeb90789f0f6        postgres            "docker-entrypoint.s…"   14 minutes ago      Up 14 minutes       0.0.0.0:5432->5432/tcp        postgres1
8a598f453cab        dpage/pgadmin4      "/entrypoint.sh"         18 minutes ago      Up 18 minutes       0.0.0.0:80->80/tcp, 443/tcp   elegant_babbage

Connect with PgAdmin

Open the PgAdmin in browser @ http://localhost

Add a new server:

Enter Connection information and Save:

And its connected:

References

https://docs.docker.com/

https://hub.docker.com/_/postgres

https://www.pgadmin.org/download/pgadmin-4-windows/