How To Setup PostgreSQL and PGAdmin4 on Docker14 January, 2020written by Bill

I use docker almost every day (for my development environment) but i don't know why i installed PostgreSQL on my own laptop and not in docker like on my office computer :D. Just for your information, i use Archlinux on my laptop, and i usually got some problems with the regular system update for my PostgreSQL, it tooks me a few hours to fix it that's why i decide to use PostgreSQL database inside docker.

But, i found that by using it on docker is bit different, especially for accessing the PostgreSQL commands since it's being use inside a docker container, so we can't directly use the command through terminal.

I assume you guys already know how to work with docker, and in this article i'll share the basic setup for PostgreSQL database and its tools like PgAdmin through our favorite tool docker compose and terminal. I won't cover any security tips or best configurations since it's only for development, but if you still want to know how to hardening your docker environment for PostgreSQL, please read the documentation.

First step, make sure you have docker and docker compose installed on your machine, then you can pull the PostgreSQL image from docker hub (feel free to choose your own PostgreSQL version), i'm gonna use PostgreSQL 11 and the latest pgadmin4, run docker pull postgres:11-alpine then docker pull dpage/pgadmin4.

Quick setup

You can run the following commands in you terminal:

  $ mkdir postgres-docker && cd postgres-docker

  # Create docker volume for docker
  $ docker volume create --driver local --name=postgrevolume
  $ docker volume create --driver local --name=pgadminvolume

  # Create docker network for docker
  $ docker network create --driver bridge postgrenetwork

  # Create postgre environment files
  $ nano postgre-env.list
  POSTGRES_USER=your_pg_username
  POSTGRES_PASSWORD=your_pg_password

  $ nano pgadmin-env.list
  PGADMIN_DEFAULT_EMAIL=your_pgadmin_email@yourdomain.com
  PGADMIN_DEFAULT_PASSWORD=your_pgadmin_password

  docker run --publish 5432:5432 \
    --volume=postgrevolume:/pgdata \
    --env-file=postgre-env.list \
    --name="postgres" \
    --hostname="postgres" \
    --network="postgrenetwork" \
    --detach \
  postgres:11-alpine

  docker run --publish 8088:80 \
    --volume=pgadminvolume:/var/lib/pgadmin \
    --env-file=pgadmin-env.list \
    --name="pgadmin4" \
    --hostname="pgadmin4" \
    --network="postgrenetwork" \
    --detach \
  dpage/pgadmin4:latest

Open your browser to localhost:8088 and input your pgadmin email and password. Add new server then set the postgres container IP address as host, you can check the IP address through this command docker container inspect postgres or you can just set postgres as host since we've run our docker with --hostname="postgres" option.

Docker Compose

We can also use docker compose to wrapped up our services in one file. Create docker-compose.yml file inside postgres-docker directory with the following configurations:

  version: '3.7'
  services:
    database:
      image: postgres:11-alpine
      container_name: postgres
      hostname: postgres
      env_file:
       - ./postgre-env.list
      volumes:
        - postgresvolume:/pgdata
      ports:
        - '5432:5432'
      networks:
        - postgrenetwork

    pgadmin4:
      image: dpage/pgadmin4:latest
      container_name: pgadmin4
      hostname: pgadmin4
      env_file:
        - ./pgadmin-env.list
      volumes:
        - pgadminvolume:/var/lib/pgadmin
      ports:
        - '8088:80'
      networks:
        - postgrenetwork

  networks:
    postgrenetwork:

  volumes:
    postgresvolume:
    pgadminvolume:

Save it and run docker-compose up -d, it'll work as well as you run directly through docker run command on terminal.

With this, there will be no problems anymore if i update/upgrade my linux system, i can completely remove PostgreSQL package from my laptop and just using it through docker container. Feel free to send me a feedback on the comment box below, i'll appreciate that.

postgresqldocker

Reading Time2 min