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:
- Versi ProstgreSQL terlalu tua
- Sudah tidak tersedia lagi di repository OS dari server baru (waktu itu pakai Ubuntu Server)
- Solusinya adalah: harus compile PostgreSQL secara manual.
- Dependencies untuk compile sendiri juga sudah tidak mudah di-install sehingga PostgreSQL menjadi bottleneck.
- 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_PASSWORDPGDATA(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
- Silakan buka kembali adminer di http://localhost:8012.
- Pilih
PostgreSQLsebagai system - Masukkan
dbsebagai host (sesuai dengan nama service). - Isi
postgressebagai username - dan
12345sebagai password (sesuai dengan variabelPOSTGRES_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:
dbadalah nama service-tiflag ini agar kita bisa melakukan mode interaktifpostgresadalah 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.
