• banner-01

Mencoba Bermain Container dengan Podman di Fedora (Bitnami/Postgresql)

Table of Contents

  Info

The AsciiDoc format is a useful presentation format in its own right: AsciiDoc markup is simple, intuitive and as such is easily proofed and edited.

Podman adalah daemonless container engine yang dapat digunakan untuk membuat, mengelola, dan menjalankan OCI container di sistem Linux. Cara pakainya kurang lebih sama dengan Docker.

OCI adalah abreviation dari Open Container Initiative, adalah sebuah proyek Linux Foundation yang dimulai pada Juni 2015 untuk mendesain open standards yang akan digunakan sebagai operating-system level virtualization. Secara sederhana, inisiatif ini bertujuan untuk membuat kesepakatan bersama tentang standar spesifikasi dari container: 1) Runtime Specification 2) Image Specification. Jadi, meskipun container dibuat oleh provider yang berbeda, tetap dapat digunakan satu sama lain.

Skenario

Kali ini, saya akan mencoba bermain-main sedikit dengan Podman, dengan menjalankan container PostgreSQL service, menggunakan container image yang dibuat oleh Bitnami.

Saya sudah memiliki PostgreSQL data di sistem Fedora saya /var/lib/pgsql/data.

Saya akan coba melakukan mounting PostgreSQL data yang ada di sistem ke PostgreSQL container.

 +---------------------------------------------+
 | Fedora System                               |
 |                          +----------------+ |
 |                          | PostgreSQL     | |
 |                          | Container      | |
 | +------------+           | +------------+ | |
 | | PostgreSQL |           | | PostgreSQL | | |
 | |    Data    |------------>|    Data    | | |
 | | on System  |           | | on System  | | |
 | +------------+           | +------------+ | |
 |                          +----------------+ |
 |                                             |
 +---------------------------------------------+

Setelah itu, saya akan men-generate systemd service untuk PostgreSQL container yang sudah dibuat.

Tahapan

(1) Konfigurasi PostgreSQL di Fedora System

Install postgresql-server.

$ sudo dnf install postgresql-server

Lakukan setup untuk menginisialisasi database.

$ sudo /usr/bin/postgresql-setup --initdb

Jalankan PostgreSQL service, karena saya akan membuat user dan user’s database.

$ sudo systemctl start postgresql.service

Pindah ke postgresql shell.

$ sudo -iu postgres

Kalau berhasil,

[postgres@fedora-x61 ~]$ _

* fedora-x61 adalah hostname dari laptop saya.

Buat user baru.

[postgres@fedora-x61 ~]$ createuser --interactive
Enter name of role to add: bandithijo  (1)
Shall the new role be a superuser? (y/n) y
1 Samakan dengan username yang kita gunakan!

Buat database untuk user yang kita buat.

[postgres@fedora-x61 ~]$ createdb bandithijo

Kita akan merubah kepemilikan (owner) dari database atas nama username kita.

Masuk ke PostgreSQL console.

[postgres@fedora-x61 ~]$ psql

Kalau berhasil,

postgres=# _

Ganti kepemilikan database atas nama username, dengan query berikut ini.

postgres=# ALTER DATABASE bandithijo OWNER TO bandithijo;

Tahap membuat user dan database user telah selesai.

Selanjutnya, edit file /var/lib/pgsql/data/pg_hba.conf

/var/lib/pgsql/data/pg_hba.conf
1
2
3
4
5
6
7
8
...
...
# TYPE  DATABASE        USER            ADDRESS            METHOD
...
...
# IPv4 local connections:
#host   all             all              127.0.0.1/32      ident  (1)
host    all             bandithijo       127.0.0.1/32      trust  (2)
1 Duplicate, dan disable (comments)
2 Ganti user all menjadi bandithijo dengan method trust

Kemudian, log out dan log in kembali.

Sekarang, sudah dapat mengakses PostgreSQL console.

$ psql
psql (13.3)
Type "help" for help.

bandithijo=# _

(2) Kontainerisasi

Saya akan menggunakan image container yang dibuat oleh Bitnami. Alasannya karena, lokasi direktori PostgreSQL data yang disimpan di image container tersebut sama dengan yang ada di Fedora, yaitu di /var/lib/pgsql/data/.

Pada tahap ini, saya menggunakan root credential.

Pulling image container untuk PostgreSQL dari quay.io. Saya akan menggunakan PostgreSQL versi 13.3.0

# podman pull quay.io/bitnami/postgresql:13.3.0

Karena Bitnami PostgreSQL image container menggunkan user 1001, maka saya perlu merubah direktori owner dari /var/lib/pgsql/data.

# chown -R 1001:1001 /var/lib/pgsql

Kemudian, saya menjalankan PostgreSQL image container dengan mantra berikut ini,

# podman run --name postgresql --net host -v /var/lib/pgsql/data:/bitnami/postgresql/data:Z -e ALLOW_EMPTY_PASSWORD=yes bitnami/postgresql:13.3.0

-v adalah abreviation untuk volume, saya melakukan mounting direktori PostgreSQL data dari Fedora System ke PostgreSQL data Bitnami image container.

Gunakan --net host untuk mendefinisikan bahwa kontainer ini menggunkan network dari host.

Outputnya,

postgresql 07:42:59.65
postgresql 07:42:59.65 Welcome to the Bitnami postgresql container
postgresql 07:42:59.66 Subscribe to project updates by watching https://github.com/bitnami/bitnami-docker-postgresql
postgresql 07:42:59.66 Submit issues and feature requests at https://github.com/bitnami/bitnami-docker-postgresql/issues
postgresql 07:42:59.66
postgresql 07:42:59.67 INFO  ==> ** Starting PostgreSQL setup **
postgresql 07:42:59.71 INFO  ==> Validating settings in POSTGRESQL_* env vars..
postgresql 07:42:59.72 WARN  ==> You set the environment variable ALLOW_EMPTY_PASSWORD=yes. For safety reasons, do not use this flag in a production environment.
postgresql 07:42:59.73 INFO  ==> Loading custom pre-init scripts...
postgresql 07:42:59.74 INFO  ==> Initializing PostgreSQL database...
postgresql 07:42:59.74 INFO  ==> Cleaning stale /bitnami/postgresql/data/postmaster.pid file
postgresql 07:42:59.78 INFO  ==> pg_hba.conf file not detected. Generating it...
postgresql 07:42:59.78 INFO  ==> Generating local authentication configuration
postgresql 07:42:59.80 INFO  ==> Deploying PostgreSQL with persisted data...
postgresql 07:42:59.84 INFO  ==> Configuring replication parameters
postgresql 07:42:59.91 INFO  ==> Configuring fsync
postgresql 07:42:59.96 INFO  ==> Loading custom scripts...
postgresql 07:42:59.97 INFO  ==> Enabling remote connections
postgresql 07:43:00.01 INFO  ==> ** PostgreSQL setup finished! **

postgresql 07:43:00.05 INFO  ==> ** Starting PostgreSQL **
2021-07-20 07:43:00.134 GMT [1] LOG:  pgaudit extension initialized
2021-07-20 07:43:00.150 GMT [1] LOG:  starting PostgreSQL 13.3 on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
2021-07-20 07:43:00.151 GMT [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2021-07-20 07:43:00.151 GMT [1] LOG:  listening on IPv6 address "::", port 5432
2021-07-20 07:43:00.156 GMT [1] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2021-07-20 07:43:00.402 GMT [1] LOG:  database system is ready to accept connections  (1)
1 Berhasil!

Kalau sukses, seharusnya bisa mengakses PostgreSQL console dengan akun bandithijo.

Untuk mengakses PostgreSQL console, gunakan mantra,

# psql -h localhost -p 5432 -U bandithijo

Kalau berhasil,

psql (13.3)
Type "help" for help.

bandithijo=# _

Kalau tidak ingin menggunakan -h localhost, bisa mendefinisikan environment variable untuk PGHOST=localhost.

$HOME/.bashrc atau $HOME/.zshrc
1
export PGHOST=localhost

Cek database untuk user bandithijo.

bandithijo=# \l
                                   List of databases
    Name    |   Owner    | Encoding |   Collate   |    Ctype    |   Access privileges
------------+------------+----------+-------------+-------------+-----------------------
 bandithijo | bandithijo | UTF8     | en_US.UTF-8 | en_US.UTF-8 | (1)
 postgres   | postgres   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0  | postgres   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
            |            |          |             |             | postgres=CTc/postgres
 template1  | postgres   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
            |            |          |             |             | postgres=CTc/postgres
(4 rows)
1 Akun bandithijo ada.

(3) Generate systemd service dari running container

Ini bagian yang saya suka, karena sangat praktis untuk men-generate systemd service dari running container. Hal ini memudahkan saya untuk menghentikan dan menjalankan container.

Pertama, pindah lokasi dulu ke /etc/systemd/system/

# cd /etc/systemd/system

Jalankan mantra untuk men-genereate systemd service dari PostgreSQL image container yang sedang berjalan.

# podman generate systemd --new --files --name postgresql

--name postgresql adalah nama dari image container yang akan dibuatkan systemd service-nya.

Akan dibuatkan file systemd service bernama container-postgresql.service.

/etc/systemd/system/container-postgresql.service

Reload systemd daemon.

# systemctl daemon-reload

Sebelum menjalankan service ini, stop & hapus dulu PostgreSQL image container yang masih running.

# podman stop postgresql
# podman rm postgresql

Kemudian, jalankan service yang sudah digenerate.

# systemctl start container-postgresql.service

Kalau sukses, harusnya sudah dapat masuk ke PostgreSQL console dengan user bandithijo.

$ psql -h localhost -p 5432 -U bandithijo
psql (13.3)
Type "help" for help.

bandithijo=# _

User database bandithijo juga seharusnya masih ada.

bandithijo=# \l
                                   List of databases
    Name    |   Owner    | Encoding |   Collate   |    Ctype    |   Access privileges
------------+------------+----------+-------------+-------------+-----------------------
 bandithijo | bandithijo | UTF8     | en_US.UTF-8 | en_US.UTF-8 | (1)
 postgres   | postgres   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0  | postgres   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
            |            |          |             |             | postgres=CTc/postgres
 template1  | postgres   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
            |            |          |             |             | postgres=CTc/postgres
(4 rows)

Selesai!

Tambahan

Mengakses PostgreSQL data dari dalam running image container

Kalau kita cek lokasi dari PostgreSQL data, dari dalam PostgreSQL console.

bandithijo=# SHOW data_directory;
      data_directory
--------------------------
 /bitnami/postgresql/data  (1)
(1 row)
1 Lokasi PostgreSQL data di dalam image container

Untuk mengakses PostgreSQL data image container yang sedang berjalan, dapat menggunakan mantra berikut,

$ podman exec -ti postgresql /bin/bash
1001@fedora-x61:/$ _

Kemudian, masuk ke dalam direktori /bitnami/postgresql/data/.

1001@fedora-x61:/$ cd /bitnami/postgresql/data

Isinya akan sama dengan yang ada di system /var/lib/pgsql/data/.

base    log           pg_dynshmem    pg_logical    pg_notify    pg_serial     pg_stat      pg_subtrans  pg_twophase  pg_wal   postgresql.auto.conf  postmaster.pid
global  pg_commit_ts  pg_ident.conf  pg_multixact  pg_replslot  pg_snapshots  pg_stat_tmp  pg_tblspc    PG_VERSION   pg_xact  postmaster.opts

Referensi

***