Nurul Huda

Nurul Huda

Seorang Web Developer dan pemerhati SEO, senang menulis tentang pemrograman dan berbagi pengalaman digital.

PostgreSQL Menggunakan Docker

02 Februari 2024 15.49

Beberapa tahun silam, kami pernah menangani sebuah projek tua dari salah satu client. Saat itu kami akan melakukan migrasi projek tersebut dari server fisik ke server pihak ketiga. Proses migrasi projek mengalami beberapa kendala:

  1. Versi ProstgreSQL terlalu tua
  2. Sudah tidak tersedia lagi di repository OS dari server baru (waktu itu pakai Ubuntu Server)
  3. Solusinya adalah: harus compile PostgreSQL secara manual.
  4. Dependencies untuk compile sendiri juga sudah tidak mudah di-install sehingga PostgreSQL menjadi bottleneck.
  5. Database memiliki berbagai macam stored procedure yang membuat datanya tidak kompatibel untuk di-export ke postgres versi terbaru (pengguna hardcore postgres pasti familiar dengan problem upgrade versi db yang sering breaking change).

Setelah melakukan berbagai macam cara, akhirnya kami memutuskan untuk menggunakan docker saja. Ini adalah salah satu pengalaman pertama kami menggunakan docker untuk production, biasanya hanya kami gunakan untuk development saja.

Long story short, karena itu sudah beberapa tahun yang lalu, ternyata postgresql yang kita jalankan di dalam docker container terbukti cukup reliable untuk melayani traffic yang bisa dibilang besar.

Di kesempatan kali ini saya akan mendemonstrasikan bagaimana cara menggunakan PostgreSQL dengan menggunakan docker (untuk kebutuhan development).

Prerequisite

  • Pastikan sudah menginstall docker (saya menggunakan docker versi 25.0.2)
  • Sudah familiar dengan docker container
  • Linux atau WSL

Image yang digunakan

Di sini saya akan menggunakan 2 image berikut:

Catatan: adminer tidak wajib, hanya untuk memudahkan kita menggunakan postgresql.

Membuat Services

1. Buat folder baru

Siapkan sebuah direktori baru untuk menampung postgresql yang akan kita install. Saya menggunakan direktori berikut:

~/workspaces/docker-apps/postgres/

2. Buat file docker-compose.yml

Buat file dengan nama docker-compose.yml di dalam folder tersebut.

3. Buat service adminer

Kita mulai dari service yang gampang terlebih dahulu. Edit file docker-compose.yml menjadi seperti berikut:

services:
  adminer:
    image: adminer
    ports:
      - 8012:8080

Jalankan perintah:

docker compose up -d

Docker akan mengunduk image adminer jika sebelumnya belum pernah diinstall sama sekali. Tunggu sampai proses selesai kemudian jalankan perintah:

docker compose ps

Jika mendapatkan output seperti ini:

NAME                 IMAGE     COMMAND                  SERVICE   CREATED         STATUS         PORTS
postgres-adminer-1   adminer   "entrypoint.sh php -…"   adminer   9 seconds ago   Up 7 seconds   0.0.0.0:8012->8080/tcp, :::8012->8080/tcp

Berarti container adminer telah berjalan dengan sukses dan mengekspos port 8012 yang bisa kita akses.

Silakan buka browser dan kunjungi http://localhost:8012.

4. Membuat service PostgreSQL

Nama service yang akan kita gunakan adalah: db dan image yang kita gunakan adalah postgres.

Sesuai dokumentasi, image ini menerima beberapa environment variables, pada kesempatan ini kita hanya akan menggunakan 2 saja yaitu:

  • POSTGRES_PASSWORD
  • PGDATA (di step berikutnya)

Ubah file docker-compose.yml menjadi seperti berikut:

services:
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: 12345
    ports:
      - 5432:5432
  adminer:
    image: adminer
    ports:
      - 8012:8080

Perhatikan variabel POSTGRES_PASSWORD karena nilai tersebut adalah password yang kita gunakan untuk membuat koneksi terhadap postgresql.

Matikan proses sebelumnya, kemudian jalankan kembali:

docker compose down
docker compose up -d

Docker akan mengunduh image baru jika belum pernah terunduh sama sekali. Jalankan perintah docker compose ps untuk melihat apakah postgres sudah berjalan:

NAME                 IMAGE      COMMAND                  SERVICE   CREATED          STATUS          PORTS
postgres-adminer-1   adminer    "entrypoint.sh php -…"   adminer   56 seconds ago   Up 55 seconds   0.0.0.0:8012->8080/tcp, :::8012->8080/tcp
postgres-db-1        postgres   "docker-entrypoint.s…"   db        56 seconds ago   Up 55 seconds   0.0.0.0:5432->5432/tcp, :::5432->5432/tcp

Mengakses via adminer

  1. Silakan buka kembali adminer di http://localhost:8012.
  2. Pilih PostgreSQL sebagai system
  3. Masukkan db sebagai host (sesuai dengan nama service).
  4. Isi postgres sebagai username
  5. dan 12345 sebagai password (sesuai dengan variabel POSTGRES_PASSWORD).

Mengakses via dbeaver

Kita juga bisa menggunakan dbeaver, dengan localhost sebagai host.

Mengakses via psql (dari dalam container)

Ada 2 cara untuk mengakses postgres menggunakan perintah psql. Kita bisa menggunakan psql yang terinstall secara native di komputer host, atau kita juga bisa menggunakan psql yang terdapat di dalam kontainer docker.

Jika menggunakan psql dari dalam kontainer, kita bisa melakukan perintah berikut:

docker compose exec -ti db psql -U postgres

Keterangan:

  • db adalah nama service
  • -ti flag ini agar kita bisa melakukan mode interaktif
  • postgres adalah nama username

Agar data bisa persistent

Jika kita men-stop container di atas, kemudian menjalankannya lagi. Kita akan notice bahwa data yang sudah kita buat sebelumnya ternyata hilang alias tidak persistent. Hal itu wajar karena begitulah memang cara kerja docker container.

Bagaimana caranya agar kita bisa membuat data kita persistent?

Kita bisa menggunakan docker volume.

Ubah file docker-compose.yaml kita menjadi seperti berikut:

services:
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: 12345
      PGDATA: /var/lib/postgresql/data/pgdata
    volumes:
      - ./data:/var/lib/postgresql/data
    ports:
      - 5432:5432
  adminer:
    image: adminer
    ports:
      - 8012:8080

Jalankan kembali container postgres maka data kita akan persisten sekali pun setelah komputer host dimatikan.