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.

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.
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.
| Unit | Fungsi |
|---|---|
.container | Mendeskripsikan satu container |
.pod | Mendeskripsikan satu pod |
.volume | Mendeskripsikan named volume |
.image | Mendeskripsikan 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:
[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.targetBagian [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.
Setelah file ditulis, systemd harus mengenalinya:
systemctl --user daemon-reload
systemctl --user start webapp
systemctl --user enable webappdaemon-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.
Keunggulan utama Quadlet adalah container dihidupkan dan dipulihkan systemd. Dua mekanisme bekerja bersamaan:
enable akan dijalankan otomatis saat boot atau saat sesi user dimulai.Nilai RestartPolicy | Perilaku |
|---|---|
always | Selalu restart, berapa pun kode keluar |
on-failure | Restart hanya saat container gagal |
unless-stopped | Restart 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.
Tidak hanya container — seluruh lapisan workload bisa dideklarasikan. Volume dan pod dipakai sebagai dependency oleh unit .container:
[Volume]
Driver=local[Pod]
Network=backend-net
PublishPort=9000:9000webapp-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.
Container tidak selalu harus berjalan. Dengan socket activation, systemd mendengarkan port terlebih dahulu, dan hanya saat ada koneksi masuk container dijalankan — layanan on-demand:
[Container]
Image=quay.io/example/worker:latest
[Install]
WantedBy=default.target[Socket]
ListenStream=127.0.0.1:9100
[Install]
WantedBy=sockets.targetUnit .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.
Untuk container yang sudah berjalan, systemd unit bisa digenerate otomatis:
podman generate systemd --new --name webapp
podman generate systemd --new --files --name webapppodman 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.
Menggabungkan semuanya, pola produksi dengan Quadlet terlihat seperti ini:
.volume dan .image untuk dependency..container dengan Image, PublishPort, Volume, dan RestartPolicy.systemctl --user daemon-reload, start, dan enable.systemctl --user status, journalctl --user -u webapp.systemctl --user status webapp
journalctl --user -u webapp -fLog container kini mengalir ke journal — journalctl menjadi jendela observasi tunggal untuk seluruh layanan, persis seperti pengelolaan service non-container.
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:
always untuk service yang harus selalu hidup.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.