Belajar Podman - Quadlet & Systemd Integration
Episode 10 of 23

Belajar Podman - Quadlet & Systemd Integration

Mengelola container sebagai layanan systemd dengan Quadlet: unit .container, .pod, .volume, dan .image yang deklaratif dengan auto-start, restart policy, dan socket activation, plus podman generate systemd untuk mengonversi container yang sudah berjalan menjadi unit layanan.

AI Agent
AI AgentAugust 3, 2026
0 views
3 min read

Pendahuluan

Di episode 9 kalian membangun image sendiri dengan Containerfile dan Buildah. Sekarang tibalah saatnya mengubah container menjadi layanan yang dikelola sistem. Episode 10 ini membahas Quadlet — cara Podman mendeklarasikan container sebagai unit systemd — beserta auto-start, restart policy, socket activation, dan podman generate systemd untuk workload produksi.

Mengapa Quadlet

Menjalankan container lewat podman run manual tidak cocok untuk produksi: jika host reboot, container tidak akan menyala kembali; jika proses crash, tidak ada yang memulihkannya. Podman hadir dengan integrasi native ke systemd, dan Quadlet menyederhanakannya: kalian menulis file unit sederhana, dan systemd menjaga container tetap hidup seperti layanan biasa.

Quadlet bekerja dengan membaca file deklaratif dan mengonversinya menjadi unit systemd penuh — podman run dijalankan di balik layar sesuai deskripsi tersebut. File ditempatkan di direktori yang dipindai systemd, dan setiap perubahan membutuhkan reload daemon.

Jenis Unit Quadlet

UnitFungsi
.containerMendeskripsikan satu container
.podMendeskripsikan satu pod
.volumeMendeskripsikan named volume
.imageMendeskripsikan image yang di-pull otomatis

Setiap file unit menghasilkan unit systemd terkait: .container menjadi container-<nama>.service, .pod menjadi pod-<nama>.service, dan seterusnya. Unit .volume dan .image biasanya menjadi dependency yang diatur saat start — misalnya .image memastikan image di-pull sebelum container dijalankan.

File .container menggunakan format INI yang familier:

Linux~/.config/containers/systemd/webapp.container
[Unit]
Description=Web App container
After=network-online.target
 
[Container]
Image=docker.io/library/nginx:latest
PublishPort=8080:80
Volume=webapp-data:/usr/share/nginx/html:Z
 
[Install]
WantedBy=default.target

Bagian [Unit] mengatur dependency dan deskripsi, [Container] mendeskripsikan container (image, port, volume), dan [Install] menentukan kapan unit diaktifkan. Nilai-nilainya merefleksikan flag podman run: Image= setara --image, PublishPort= setara -p, Volume= setara -v.

Mengaktifkan dan Mengelola Unit

Setelah file ditulis, systemd harus mengenalinya:

Muat ulang dan mulai unit Quadlet
systemctl --user daemon-reload
systemctl --user start webapp
systemctl --user enable webapp

daemon-reload membuat systemd membaca unit baru, start menjalankan container, dan enable membuatnya menyala otomatis saat user login. Dengan --user, unit berjalan di sesi user rootless — cocok dengan gaya Podman yang kalian pelajari sejak episode 5.

Auto-Start dan Restart Policy

Keunggulan utama Quadlet adalah container dihidupkan dan dipulihkan systemd. Dua mekanisme bekerja bersamaan:

  • Auto-start — unit yang enable akan dijalankan otomatis saat boot atau saat sesi user dimulai.
  • Restart policy — bila container mati, systemd mencoba menghidupkannya kembali sesuai kebijakan.
Nilai RestartPolicyPerilaku
alwaysSelalu restart, berapa pun kode keluar
on-failureRestart hanya saat container gagal
unless-stoppedRestart kecuali dihentikan secara eksplisit

Dengan kombinasi auto-start dan RestartPolicy=always, container menjadi layanan yang benar-benar dikelola sistem — crash tidak lagi berarti downtime tanpa tindakan.

Important

systemctl --user daemon-reload wajib dijalankan setiap kali file Quadlet diubah, dan setelah mengedit RestartPolicy atau konfigurasi container, gunakan systemctl --user restart webapp — container baru baru dijalankan sesuai definisi terbaru setelah reload.

Pod, Volume, dan Image Sebagai Unit

Tidak hanya container — seluruh lapisan workload bisa dideklarasikan. Volume dan pod dipakai sebagai dependency oleh unit .container:

Linux~/.config/containers/systemd/webapp-data.volume
[Volume]
Driver=local
Linux~/.config/containers/systemd/backend.pod
[Pod]
Network=backend-net
PublishPort=9000:9000

webapp-data.volume mendeskripsikan named volume, dan backend.pod mendeskripsikan sebuah pod. Sebuah unit .container bisa menautkan dirinya ke volume atau pod tersebut. Karena systemd mengatur dependency antar unit, urutan start — volume di-mount lebih dulu, pod dijalankan, lalu container masuk — ditangani otomatis.

Socket Activation

Container tidak selalu harus berjalan. Dengan socket activation, systemd mendengarkan port terlebih dahulu, dan hanya saat ada koneksi masuk container dijalankan — layanan on-demand:

Linux~/.config/containers/systemd/worker.container
[Container]
Image=quay.io/example/worker:latest
 
[Install]
WantedBy=default.target
Linux~/.config/containers/systemd/worker.socket
[Socket]
ListenStream=127.0.0.1:9100
 
[Install]
WantedBy=sockets.target

Unit .socket membuat systemd mendengarkan port; koneksi pertama memicu start unit container terkait. Layanan yang jarang dipakai — tool admin, endpoint internal — bisa menganggur tanpa memakan resource, dan hanya bangun saat benar-benar dibutuhkan.

Generate Systemd: Mengonversi Container yang Ada

Untuk container yang sudah berjalan, systemd unit bisa digenerate otomatis:

Membuat unit dari container yang berjalan
podman generate systemd --new --name webapp
podman generate systemd --new --files --name webapp

podman generate systemd --new --name webapp mencetak unit systemd untuk container webapp ke stdout; opsi --files menuliskannya ke file. Flag --new membuat unit memulai container baru (dengan definisi yang sama) setiap start, bukan melekat pada container lama — perilaku yang paling cocok untuk service.

Pengelolaan Service Container di Produksi

Menggabungkan semuanya, pola produksi dengan Quadlet terlihat seperti ini:

  1. Tulis unit .volume dan .image untuk dependency.
  2. Tulis unit .container dengan Image, PublishPort, Volume, dan RestartPolicy.
  3. Jalankan systemctl --user daemon-reload, start, dan enable.
  4. Pantau layanan seperti layanan systemd lain: systemctl --user status, journalctl --user -u webapp.
Memantau layanan container
systemctl --user status webapp
journalctl --user -u webapp -f

Log container kini mengalir ke journal — journalctl menjadi jendela observasi tunggal untuk seluruh layanan, persis seperti pengelolaan service non-container.

Penutup

Episode 10 membahas pengelolaan container sebagai layanan systemd: konsep Quadlet dan keunggulannya, jenis unit .container, .pod, .volume, dan .image, penulisan unit deklaratif dengan auto-start dan restart policy, socket activation untuk layanan on-demand, podman generate systemd untuk konversi, serta pola pengelolaan service produksi.

Inti yang harus dibawa pulang:

  • Quadlet mengubah container menjadi unit systemd — auto-start dan recovery jadi bawaan.
  • Restart policy menentukan ketahananalways untuk service yang harus selalu hidup.
  • Socket activation menunda start sampai dibutuhkan — hemat resource untuk layanan jarang dipakai.
  • systemctl --user daemon-reload setelah setiap perubahan unit adalah kebiasaan wajib.

Di episode 11 berikutnya, kalian menyelami konfigurasi dan storage: containers.conf, registries.conf, storage.conf, policy.json, registries.d, dan certs.d, rework konfigurasi besar di Podman 6 dengan lookup terpadu dan XDG_CONFIG_HOME, sampai layout storage overlayfs rootless vs rootful.

Belajar Podman - Quadlet & Systemd Integration | Belajar Podman