Menjalankan PostgreSQL dan PgAdmin4 di Docker Container

Muhammad Rizki Fikriansyah
Daily Life of Mrizki
5 min readDec 12, 2019
Lambang PostgreSQL adalah gajah, sedangkan Docker berfungsi sebagai container yang mengisolasi program. Gambar ini cocok sekali menggambarkan PostgreSQL di Docker Container. Photo by Peter Oslanec on Unsplash

Sebagai web developer, lu setidaknya pasti pernah mengalami kesulitan dalam mengurus Database. Di tutorial kali ini, gue mau nunjukin kalo lu juga bisa menjalankan PostgreSQL atau database favorit lu, dan juga GUI nya PgAdmin4 di docker Container.

Kenapa Menjalankan Database di Docker Container?

Sekilas tentang database di docker container. Buat yang ga tertarik tentang hal ini, dan ingin langsung tau caranya, scroll ke bawah sampai di Membuat Docker Container.

Beberapa waktu yang lalu di kerjaan gue, gue membutuhkan database lokal untuk menguji coba program yang baru gue bikin. Setelah memilih database yang gue bisa, yaitu PostgreSQL, gue mikir capeknya nginstall postgres cuman buat ngetes hal kaya gini. Gue ga peduli dengan data yang ada di databasenya, karena program ini cuman untuk menguji coba kalau programnya berjalan lancar.

Berbekal kemalasan gue, gue akhirnya browsing cara untuk menjalankan PostgreSQL tanpa harus meng-install-nya. Beberapa alternativ adalah dengan menyimpan database di Cloud. Tapi hal itu bertolak belakang sama yang gue pengen. Akhirnya gue sampe pada ide untuk menjalankan database di docker container. Pada saat itu gue terbiasa dengan docker dan menurut gue, itu bukan ide yang buruk.

Membuat Docker Container

Untuk menjalankan docker container, lu pastinya harus punya program namanya Docker.
Apa itu Docker?
Docker adalah program yang memudahkan kita untuk menjalankan program di dalam container. Program yang dijalankan di dalam container memiliki Resources yang terbatas dan juga terisolasi dari Komputer hostnya. Mirip dengan Virtual Machine hanya saja setiap container memakai resource yang disediakan oleh docker. Jelasnya seperti digambarkan di bawah ini.

App A — App F adalah container. Docker berfungsi sebagai jembatan dari Host Operating System ke container tersebut. Gambar diambil dari docker.com
  1. Download Docker
    Untuk mendownload Docker, pergi ke link ini dan ikuti caranya. Step-by-stepnya cukup jelas. Lu hanya perlu memilih sesuai operating system yang lu pake. Sebelum men-download, lu diharuskan untuk daftar di Docker Hub. Docker Hub ini nanti lu pake sebagai repository dimana lu bisa meng-download/upload image yang lu buat.
  2. Pull PostgreSQL dan PgAdmin4 Image
    Docker mempunyai banyak pilihan container yang out-of-the-box sudah bisa langsung dijalankan. Container ini jika belum dijalankan dinamakan Image. Salah satu image yang kita pengen adalah PostgreSQL dan PgAdmin4.
docker pull postgres
docker pull dpage/pgadmin4

Dengan script diatas, lu bisa pull (download) image dari docker hub repository ke komputer yang lu pake saat ini. Maka dari itu lu harus daftar di docker hub.

Walaupun gue tadi bilang out-of-the-box docker image bisa dijalankan. Mereka akan terisolasi di container mereka sendiri. Artinya, PgAdmin4 tidak akan tahu jika PostgreSQL juga sedang dijalankan.

Agar satu sama lain bisa berkomunikasi, jalankan script di bawah ini:

Disclaimer: Script ini adalah Shell Script yang dijalankan di Linux dan kemungkinan bisa dijalankan di Mac. Jika lu pengguna Windows, scriptnya harus sedikit disesuaikan.

#!/bin/bash mkdir $HOME/.postgres-data
cd $HOME/.postgres-data
# stop postgres dan pgadmin4 container
docker kill postgres pgadmin4
# hapus container dari list
docker rm postgres pgadmin4
docker volume create --driver local --name=pgvolume
docker volume create --driver local --name=pga4volume
# network agar postgres dan pgadmin4 bisa berkomunikasi
# satu sama lain
docker network create --driver brige pgnetwork
# environment variables yang diperlukan postgres
cat << EOF > pg-env.list
PG_MODE=primary
PG_PRIMARY_USER=postgres
PG_PRIMARY_PASSWORD=my-secret-password
PG_DATABASE=demo
PG_ROOT_PASSWORD=my-secret-password
PG_PRIMARY_PORT=5432
EOF
# environment variables yang diperlukan pgadmin4
cat << EOF > pgadmin-env.list
PGADMIN_DEFAULT_EMAIL=your-email@example.com
PGADMIN_DEFAULT_PASSWORD=your-secret-password
SERVER_PORT=5050
EOF
# Jalankan postgres container
docker run --publish 5432:5432 \
--volume=pgvolume:/pgdata \
--volume=./:/ \
--env-file=pg-env.list \
--name="postgres" \
--hostname="postgres" \
--network="pgnetwork" \
--detach \
postgres
# Jalankan pgadmin4 container
docker run --publish 5050:80 \
--publish 5443:443 \
--volume=pga4volume:/var/lib/pgadmin \
--volume=./:/ \
--env-file=pgadmin-env.list \
--name="pgadmin4" \
--hostname="pgadmin4" \
--network="pgnetwork" \
--detach \
dpage/pgadmin4

Scriptnya cukup panjang, maka dari itu gue udah bikin gist nya di github. Disana ada script run-postgresql-container.sh dan kill-postgresql-container.sh yang bisa lu pake untuk menjalankan/menghentikan docker containernya.

Lu cukup simpen filenya (gue simpen di $HOME/.bin/ yang gue tambahkan ke $PATH) dan jalankan…

chmod +x setup-postgresql-container.sh
./setup-postgresql-container.sh

Perlu diingat, jika lu menjalankan setup-postgresql-container.sh 2 kali. Semua data yang ada di database itu akan terhapus.

Menjalankan dengan Docker-Compose

Mungkin para docker master yang membaca artikel ini bertanya kenapa ga make docker-compose ?

Sebenarnya saat gue menulis script itu. Gue belum cukup mengerti tentang docker compose. Selain itu, docker-compose adalah program extra yang harus di install di Linux (di Windows termasuk ke dalam installasi Docker Desktop). Untuk membuat container dengan Docker Compose lu harus membuat docker-compose.yml yang di dalamnya berisikan:

version: "3.7"
services:
postgres:
image: postgres:latest
ports:
- "5432:5432"
networks:
- pg-network
volumes:
- "pgvolume:/"
- "$HOME/.postgres-data:/"
environment:
- PG_MODE: primary
- PG_PRIMARY_USER: postgres
- PG_PRIMARY_PASSWORD: my-secret-password
- PG_DATABASE: demo
- PG_ROOT_PASSWORD: my-secret-password
- PG_PRIMARY_PORT: 5432

pgadmin4:
image: dpage/pgadmin4
ports:
- "5050:80"
- "5443:443"
networks:
- pg-network
volumes:
- "pga4volume:/var/lib/pgadmin
- "$HOME/.pgadmin:/"
environment:
- PGADMIN_DEFAULT_EMAIL: your-email@example.com
- PGADMIN_DEFAULT_PASSWORD: your-secret-password
- SERVER_PORT: 5050

volumes:
pgvolume:
pga4volume:

networks:
pg-network:

Untuk Github Gistnya ada disini. Setelah itu cukup lakukan

docker-compose up --build --detach docker-compose.yml

Untuk memudahkan lu untuk menjalankan docker compose. Lu bisa pindahin docker-composenya ke folder yang lu mau, terus bikin shell script atau mungkin batch agar bisa menjalankannya hanya dengan:

start-postgres-pgadmin

Bonus: Menggunakan PgAdmin4 di Web

Jika hal diatas berjalan lancar. PgAdmin bisa lu temuin di localhost:5050 . Disana lu disambut dengan welcome page dari PgAdmin4 seperti gambar dibawah ini.

Welcome Page PgAdmin4

Setelah login. Lu bakal disambut dengan halaman dashboard. Yang lu harus lakuin sekarang adalah menghubungkan PgAdmin4 dengan PostgreSQL.

Klik Add New Server

Dialog seperti yang diatas akan muncul untuk menghubungkan PgAdmin4 dengan Server. Server disini tidak hanya lokal, namun bisa saja server yang berada di komputer lain (contoh: Cloud).

Isi Name dengan postgres . Lalu klik tab Connection di atas!

Di Connection tab, isi seperti gambar diatas. Untuk Username dan Password adalah PG_PRIMARY_USER dan PG_PRIMARY_PASSWORD yang lu masukin di docker-compose.yml atau di setup-postgresql-container.sh sebagai environment variables.

dan voilaaa~~~

Kalau halaman lu jadi seperti ini, artinya lu udah berhasil konek ke PostgreSQL.

Artikel kali ini lebih panjang dari biasanya. Tapi semoga selalu bermanfaat ya!!!

--

--

Muhammad Rizki Fikriansyah
Daily Life of Mrizki

Student of Full Stack Developer, doing Front End, dreaming of becoming an Entrepreneur