Menjalankan PostgreSQL Database Dengan Docker

Menjalankan PostgreSQL di docker bisa sangat berguna terutama untuk keperluan testing. Dia bisa dijalankan di mana pun. Kita dapat menjalankannya dengan data testing, menggunakannya kemudian menghapusnya dengan mudah ketika testing selesai. Menjalankan Postgres di docker juga dapat mempermudah integration testing dan automation testing.

Cara menjalankan PostgreSQL dengan Docker

Untuk menjalankan Postgres di Docker, kita bisa menggunakan Docker image official postgres. Gunakan command berikut untuk menjalankannya.

docker run -d \
    -e POSTGRES_PASSWORD=mypassword \
    -e POSTGRES_USER=myuser \
    -p 5432:5432 \
    --name mypostgres postgres 
Parameter POSTGRES_PASSWORD wajib ada. Ini berisi password yang akan digunakan untuk user di parameter POSTGRES_USER. Parameter POSTGRES_USER ini opsional. Kalau parameter tersebut tidak ada, akan digunakan user name default yaitu postgres. Kita bisa menggunakan user name dan password itu untuk mengakses database. Parameter -p 5432:5432 ini untuk mengarahkan port 5432 milik komputer host ke port 5432 milik container di Docker, dimana Postgres dijalankan.

Sekarang PostgreSQL sudah berjalan di Docker. Untuk memastikannya, kita dapat menggunakan command docker ps atau docker container ls.

docker ps

Kita dapat mencoba mengakses database menggunakan psql psql -h localhost -p 5432 -U myuser. Database yang baru dibuat masih kosong. Kalau ingin membuat database dengan terisi suatu data-data, kita bisa menyimpan file SQL di directory /docker-entrypoint-initdb.d/ di Docker image.

Jalankan dengan inisialisasi data

File yang ada di directory /docker-entrypoint-initdb.d/ akan di eksekusi ketika container dijalankan. File-file tersebut dapat berupa *.sql, *.sql.gz, or *.sh. Kita akan coba menggunakan SQL berikut untuk menginisialisasi data pada database kita di Docker. Kita simpan command SQL berikut ke sebuah file, kemudian bind directory tempat file berada ke directory /docker-entrypoint-initdb.d/ di container.

CREATE DATABASE mydb;

\c mydb;

CREATE TABLE city (
  id serial PRIMARY KEY,
  name VARCHAR
);

INSERT INTO city (name) VALUES ('Jakarta');
INSERT INTO city (name) VALUES ('Bandung');
INSERT INTO city (name) VALUES ('Bandar Lampung');
SQL tersebut untuk membuat suatu database, kemudian connect ke database tersebut, membuat suatu table, lalu insert beberapa data ke table tersebut.

Ketika menjalankan container, kita menambahkan parameter -v untuk melakukan bind directory. Coba lihat contoh command dibawah.

1
2
3
4
5
6
docker run -d \
    -e POSTGRES_PASSWORD=mypassword \
    -e POSTGRES_USER=myuser \
    -p 5432:5432 \
    -v /your/directory/initdb:/docker-entrypoint-initdb.d \
    --name mypostgres postgres 
Kamu perlu menyesuaikan alamat folder yang berisi file SQL di atas.
Sekarang karena kita sudah membuat database di PostgreSQL container, kita bisa langsung connect ke database tersebut.
psql -h localhost -p 5432 -U myuser mydb
Untuk select data.
PostgreSQL data initialized
Bisa dilihat kalau data-data berhasil di inisialisasikan.

Mempertahankan data

Seperti yang kita ketahui kalau data di PostgreSQL di docker akan hilang kalau container dihapus. Kita bisa membuat data tersebut tidak hilang dengan membuat sebuah docker volume dan bind ke directory /var/lib/postgresql/data. Gunakan command ini untuk membuat docker volume.

docker volume create postgresdata
Kita bisa melihat volume yang sudah dibuat dengan command docker volume ls.

Kita perlu bind volume tersebut ke container untuk membuat data di PostgreSQL tersimpan.

1
2
3
4
5
6
7
docker run -d \
    -e POSTGRES_PASSWORD=mypassword \
    -e POSTGRES_USER=myuser \
    -p 5432:5432 \
    -v postgresdata:/var/lib/postgresql/data \
    -v ${PWD}/initdb:/docker-entrypoint-initdb.d \
    --name mypostgres postgres 
Coba ubah data-data kemudian hapus container dan jalankan lagi. Kita akan lihat data yang diubah tadi tetap tersimpan.

Kesimpulan

Kita bisa menjalankan PostgreSQL dengan mudah di docker. Ini dapat membantu kita melakukan development dan testing. Kita dapat membuat script untuk menginisialisasi data. Kita juga dapat membuat data tidak hilang ketika container di remove dengan memasang docker volume di container.


See also