Lewati ke konten utama

Podman Compose: Alternatif Rootless untuk Docker Compose

Podman Compose adalah alat berbasis Python yang membaca berkas Docker Compose dan menjalankan aplikasi multi-kontainer menggunakan arsitektur Podman yang rootless dan tanpa daemon untuk lingkungan pengembangan yang berfokus pada keamanan.
· 12 mnt Baca

Jelajahi bersama AI

Misalkan Anda punya berkas docker-compose.yml yang sudah berjalan berbulan-bulan. Namun sekarang Anda diminta menggunakan Podman alih-alih Docker, dan Anda tidak yakin apakah perlu mengedit berkas tersebut atau mulai dari nol. Lingkungan pengembangan lokal Anda bergantung pada berkas Compose itu, dan membangun ulang seluruh setup jelas bukan sesuatu yang sempat Anda lakukan.

Kabar baiknya, Podman Compose memungkinkan Anda menjalankan berkas Compose yang sudah ada dengan Podman alih-alih Docker. Ini adalah lapisan kompatibilitas berbasis Python yang menerjemahkan definisi Compose Anda menjadi perintah Podman, sehingga Anda tetap bisa memakai alur kerja multi-kontainer yang sudah familier.

Dalam artikel ini, saya akan menunjukkan apa itu Podman Compose, cara memasangnya, dan cara menjalankan aplikasi multi-kontainer pertama Anda dengannya. Jika Anda baru dengan beberapa konsep dalam artikel ini, daftarlah ke Kursus Konsep Kontainerisasi dan Virtualisasi untuk memahami dasar-dasarnya.

Apa itu Podman Compose?

Podman Compose adalah alat berbasis Python yang membaca berkas docker-compose.yml Anda dan menerjemahkannya menjadi perintah Podman.

Anda tetap menulis berkas Docker Compose standar dengan services, networks, dan volumes. Podman Compose mengurai berkas itu dan menjalankan perintah podman yang setara untuk memulai kontainer Anda. Ia melakukan pekerjaan penerjemahan untuk Anda, sehingga Anda tidak perlu mengonversi sintaks Compose secara manual menjadi perintah CLI Podman.

Perlu dicatat bahwa Podman Compose bukan pengganti satu banding satu untuk Docker Compose.

Ini adalah lapisan kompatibilitas. Beberapa fitur Docker Compose langsung berfungsi, yang lain perlu penyesuaian, dan sebagian tidak berfungsi sama sekali. Alat ini menargetkan kompatibilitas, namun tidak mereplikasi setiap perilaku Docker Compose.

Begini cara lain memandangnya: Docker Compose berbicara langsung ke daemon Docker. Podman Compose berbicara ke CLI Podman, yang kemudian mengelola kontainer tanpa daemon. Hasil akhirnya terlihat mirip, tetapi mekanisme dasarnya berbeda.

Artinya Anda dapat memakai kembali sebagian besar berkas Compose yang sudah ada, tetapi Anda perlu memahami di mana perbedaannya muncul.

Mengapa Menggunakan Podman Compose?

Podman Compose memungkinkan Anda menjalankan aplikasi multi-kontainer tanpa memasang Docker.

Dibandingkan dengan Docker, Anda mendapatkan kontainer rootless secara bawaan. Podman menjalankan kontainer tanpa memerlukan hak istimewa root. Secara sederhana, risikonya lebih kecil jika suatu kontainer terkompromi. Docker mengharuskan daemon berjalan sebagai root, bahkan jika Anda menjalankan kontainer rootless di atasnya.

Ini menjadikan Podman Compose lebih cocok untuk lingkungan yang berfokus pada keamanan. Jika Anda bekerja di server Linux yang dikunci ketat atau lingkungan yang tidak mengizinkan daemon level root, Podman Compose memberikan alur kerja multi-kontainer yang Anda butuhkan.

Ini juga berguna untuk pengembangan dan pengujian. Anda bisa menjalankan lingkungan lokal, menguji konfigurasi kontainer, dan memvalidasi berkas Compose tanpa memasang Docker. Ideal untuk penerapan ringan ketika Anda tidak membutuhkan orkestrasi penuh.

Namun perlu dicatat bahwa Podman Compose tidak ideal untuk setiap situasi.

Jika Anda menjalankan beban kerja produksi berskala besar, sebaiknya gunakan Kubernetes atau Docker Swarm. Dukungan Podman Compose di macOS dan Windows juga lebih lemah dibanding Linux, sehingga pengalaman pengembangan lintas platform tidak akan semulus itu. Dan jika tim Anda sudah berinvestasi di ekosistem Docker dengan plugin kustom dan tooling, beralih ke Podman Compose berarti membangun ulang sebagian alur kerja tersebut.

Kesimpulannya, gunakan Podman Compose saat Anda membutuhkan kontainer rootless, lingkungan yang mengutamakan keamanan, atau setup pengembangan tanpa Docker.

Memasang Podman Compose

Podman Compose paling baik digunakan di Linux, tempat Podman berjalan secara native.

Anda bisa memasangnya di macOS dan Windows, tetapi Anda perlu menjalankan Podman terlebih dahulu di dalam mesin virtual. Ini menambah kompleksitas dan tidak semulus pengalaman di Linux. Jika Anda di macOS atau Windows, harapkan langkah setup tambahan dan potensi keanehan jaringan.

Memasang di Linux

Cara termudah memasang Podman Compose adalah melalui pip.

pip install podman-compose

Memasang Podman compose di Linux

Memasang Podman compose di Linux

Perintah ini memasang versi terbaru dari PyPI. Anda tidak perlu khawatir tentang manajemen versi Python—jika Anda memasang Python 3, Anda siap jalan.

Beberapa distribusi Linux juga menyediakan paket Podman Compose di repositorinya. Di Fedora, RHEL, dan CentOS, Anda bisa menggunakan:

sudo dnf install podman-compose

Di Ubuntu dan sistem berbasis Debian, jalankan perintah berikut:

sudo apt install podman-compose

Versi dari manajer paket biasanya tertinggal dari PyPI, jadi Anda mungkin tidak langsung mendapatkan fitur terbaru.

Memasang di macOS dan Windows

Di macOS dan Windows, Anda perlu menyiapkan Podman Desktop terlebih dahulu atau menggunakan podman machine untuk membuat VM Linux. Setelah berjalan, pasang Podman Compose dengan pip di dalam lingkungan tersebut.

Jadi langkah pertama adalah menyambung ke mesin tersebut:

podman machine ssh

SSH ke Podman VM

SSH ke Podman VM

Karena VM berbasis Fedora, Anda bisa menjalankan perintah ini untuk memasang Podman Compose:

sudo dnf install podman-compose

Memasang Podman Compose

Memasang Podman Compose

Proses dua langkah ini berarti Anda tidak menjalankan Podman Compose langsung pada OS host—Anda menjalankannya di dalam VM Linux yang dibuat Podman.

Memverifikasi pemasangan

Jalankan perintah ini untuk memastikan Podman Compose terpasang dengan benar:

podman-compose --version

Memverifikasi pemasangan Podman Compose

Memverifikasi pemasangan Podman Compose

Anda seharusnya melihat nomor versi tercetak di terminal. Jika muncul galat "command not found", pastikan direktori bin Python Anda ada di PATH.

Itu saja yang Anda perlukan untuk mulai menggunakan Podman Compose.

Menjalankan Berkas Compose dengan Podman Compose

Anda sudah memasang Podman Compose—sekarang saya tunjukkan cara menjalankan aplikasi nyata.

Menggunakan berkas Docker Compose yang ada

Podman Compose membaca berkas docker-compose.yml standar. Anda tidak perlu mengganti nama atau mengubah format.

Berikut aplikasi FastAPI sederhana yang didefinisikan dalam berkas Compose:

services:
  web:
    image: python:3.14-slim
    container_name: fastapi-app
    working_dir: /src
    volumes:
      - ./src:/src
    ports:
      - "8000:8000"
    command: bash -c "pip install fastapi uvicorn && uvicorn main:app --host 0.0.0.0 --port 8000"

Dengan kode aplikasi di src/main.py:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello from FastAPI"}

@app.get("/health")
def health_check():
    return {"status": "healthy"}

Sebagian besar fitur Docker Compose berfungsi langsung dengan Podman Compose. Termasuk:

  • Menarik image dan membuat kontainer
  • Pemetaan port
  • Mount volume (baik volume bernama maupun bind mount)
  • Variabel lingkungan
  • Jaringan dasar antar layanan

Namun beberapa fitur perlu penyesuaian. Jika berkas Compose Anda memakai plugin khusus Docker, pengandar jaringan kustom, atau argumen build lanjutan, kemungkinan Anda perlu memodifikasi bagian-bagian tersebut.

Podman Compose juga menangani jaringan secara berbeda—layanan tidak otomatis saling mengenali berdasarkan nama layanan seperti pada Docker Compose.

Perintah dasar Podman Compose

Anda sekarang dapat memulai layanan dengan perintah ini:

podman-compose up

Ini menarik image, membuat kontainer, dan memulai semua yang didefinisikan dalam berkas Compose Anda. Tambahkan -d untuk menjalankan dalam mode terpisah jika Anda tidak ingin log mengalir ke terminal.

Keluaran Podman

Keluaran Podman

Sekarang Anda bisa membuka aplikasi pada port 8000 di mesin Anda (atau di instance Ubuntu jarak jauh seperti yang saya gunakan). Anda akan melihat yang berikut:

Aplikasi FastAPI berjalan melalui Podman

Aplikasi FastAPI berjalan melalui Podman

Untuk menghentikan layanan yang berjalan, jalankan:

podman-compose down

Ini menghentikan dan menghapus kontainer. Volume tetap ada kecuali Anda menambahkan --volumes untuk menghapusnya juga.

Untuk memeriksa log layanan Anda, jalankan perintah ini:

podman-compose logs

Tambahkan -f untuk mengikuti log secara real-time, atau tentukan nama layanan untuk melihat log dari kontainer tersebut saja.

Untuk membersihkan semuanya, termasuk kontainer, jaringan, dan volume, jalankan ini:

podman-compose down --volumes

Perintah-perintah ini meniru sintaks Docker Compose, jadi jika Anda sudah familier dengan docker-compose, Anda akan merasa langsung cocok.

Podman Compose vs. Docker Compose dan Lainnya

Podman Compose dan Docker Compose bertujuan sama, tetapi bekerja berbeda di balik layar. Berikut penjelasannya.

Eksekusi rootless

Docker Compose memerlukan daemon Docker yang berjalan sebagai root. Bahkan ketika Anda mengonfigurasi kontainer rootless, daemon itu sendiri butuh hak istimewa. Podman Compose berjalan sepenuhnya tanpa akses root secara default. Kontainer Anda dimulai sebagai pengguna Anda, bukan sebagai layanan sistem, yang mengurangi vektor serangan dan membuat Podman Compose lebih aman di lingkungan multi-pengguna.

Perilaku jaringan

Docker Compose membuat jaringan bridge default untuk layanan Anda. Kontainer dapat saling menjangkau berdasarkan nama layanan secara otomatis.

Podman Compose menggunakan jaringan berbasis pod. Semua kontainer dalam berkas Compose Anda dikelompokkan ke dalam satu pod Podman, dan mereka berbagi namespace jaringan yang sama. Ini berarti kontainer berkomunikasi melalui localhost alih-alih nama layanan, yang dapat mengejutkan pengguna Docker.

Jika aplikasi Anda mengharapkan terhubung ke basis data di db:5432, Anda harus menggantinya menjadi localhost:5432 saat berjalan dengan Podman Compose.

Pengelompokan berbasis pod

Docker Compose mengelola kontainer individual. Podman Compose membuat sebuah pod, yaitu pengelompokan terinspirasi Kubernetes tempat kontainer berbagi jaringan dan dapat berbagi penyimpanan. Model pod ini menyelaraskan Podman Compose dengan pola Kubernetes, sehingga lebih mudah memigrasikan beban kerja nanti jika Anda memerlukan orkestrasi.

Integrasi systemd

Podman terintegrasi dengan systemd untuk mengelola kontainer sebagai layanan sistem. Anda dapat menghasilkan berkas unit systemd dari kontainer yang berjalan dan mengelolanya seperti layanan Linux lainnya. Docker tidak menawarkan integrasi systemd native pada level kontainer.

Opsi lainnya

Jika Podman Compose tidak sesuai kebutuhan Anda, ada alternatif berikut:

  • Podman native dengan systemd memungkinkan Anda mengelola kontainer sebagai layanan tanpa berkas Compose sama sekali
  • Kubernetes memberi Anda orkestrasi penuh jika Anda menjalankan beban kerja produksi berskala, meski jauh lebih berat dibanding alat bergaya Compose

Podman Compose berada di antara perintah kontainer sederhana dan orkestrasi penuh. Ia memberikan alur kerja multi-kontainer tanpa persyaratan daemon Docker.

Jaringan dan Volume di Podman Compose (Apa yang Berbeda)

Pengguna Docker yang beralih ke Podman Compose biasanya mengeluhkan dua hal: jaringan dan volume. Di bagian ini, saya bahas perbedaannya.

Komunikasi antarlayanan

Di Docker Compose, Anda terhubung ke layanan lain berdasarkan nama layanannya. Jika Anda punya layanan web dan layanan basis data bernama db, aplikasi Anda terhubung ke db:5432.

Podman Compose menempatkan semua layanan dalam satu pod. Kontainer dalam pod yang sama berbagi namespace jaringan, yang berarti semuanya menggunakan localhost. String koneksi basis data Anda berubah dari db:5432 menjadi localhost:5432.

Hal ini sering mengecoh. Aplikasi Anda mulai, mencoba terhubung ke db:5432, dan gagal karena nama host itu tidak terpecahkan. Anda perlu memperbarui string koneksi atau variabel lingkungan untuk menggunakan localhost sebagai gantinya.

Jaringan default

Docker Compose membuat jaringan bridge untuk layanan Anda. Setiap kontainer mendapat alamat IP sendiri di jaringan itu, dan resolver DNS Docker menangani lookup nama layanan.

Podman Compose tidak membuat jaringan terpisah secara default. Model pod berarti kontainer berbagi jaringan pada level yang lebih rendah. Jika Anda mendefinisikan jaringan kustom dalam berkas Compose, Podman Compose akan mencoba membuatnya, tetapi perilakunya bisa tidak persis sama dengan Docker.

Perilaku volume dan bind mount

Volume dan bind mount sebagian besar bekerja dengan cara yang sama antara Docker Compose dan Podman Compose. Anda mendefinisikannya dalam berkas Compose, dan Podman akan membuatnya.

Namun ada kendala izin.

Podman berjalan rootless secara default, sehingga kepemilikan berkas dan izin dapat berperilaku berbeda. Bind mount yang baik-baik saja di Docker bisa memunculkan error izin di Podman karena pengguna dalam kontainer tidak cocok dengan UID pengguna host Anda.

Anda juga akan melihat lokasi volume berbeda. Docker menyimpan volume di /var/lib/docker/volumes/ sedangkan Podman menyimpannya di ~/.local/share/containers/storage/volumes/ untuk kontainer rootless.

Solusinya mudah diterapkan jika Anda memahami penyebabnya. Jadi cukup sesuaikan string koneksi untuk jaringan, dan periksa izin berkas untuk masalah volume.

Keterbatasan Umum dan Hal-hal yang Perlu Diwaspadai

Podman Compose bekerja baik untuk setup multi-kontainer dasar, tetapi memiliki keterbatasan yang perlu Anda ketahui sebelum berkomitmen menggunakannya.

Fitur Compose yang tidak didukung

Tidak semua fitur Docker Compose dapat diterjemahkan ke Podman Compose. Build context dengan argumen kompleks sering gagal atau berperilaku berbeda. Plugin dan ekstensi Docker Compose tidak akan berfungsi sama sekali. Fitur seperti GPU passthrough, pemeriksaan kesehatan tingkat lanjut, dan beberapa mode jaringan tidak berfungsi atau memerlukan solusi.

Jika berkas Compose Anda sangat bergantung pada fitur docker-compose.yml versi 3.x, harapkan ada coba-coba.

Ekspektasi jaringan yang berbeda dari Docker

Layanan tidak berkomunikasi berdasarkan nama layanan—mereka menggunakan localhost. Ini merusak aplikasi yang meng-hardcode nama layanan di string koneksi.

Jaringan bridge kustom tidak berperilaku sama seperti Docker. Resolusi DNS bekerja berbeda karena model pod.

Harapkan butuh waktu untuk memperbarui konfigurasi dan variabel lingkungan agar sesuai dengan model jaringan Podman, tetapi itu hanya sekali di awal.

Keterbatasan platform di macOS/Windows

Podman Compose paling baik di Linux. Di macOS dan Windows, Anda menjalankan semuanya di dalam VM Linux, yang menambah lapisan kompleksitas. Sinkronisasi berkas antara host dan VM bisa lebih lambat. Jaringan antara host dan kontainer memerlukan konfigurasi tambahan.

Jika tim Anda menggunakan mesin macOS atau Windows untuk pengembangan, Docker Compose biasanya opsi yang lebih mulus.

Kematangan alat dan kesenjangan ekosistem

Podman Compose lebih muda dibanding Docker Compose. Komunitasnya lebih kecil, jadi menemukan jawaban untuk masalah spesifik butuh usaha lebih. Alat pihak ketiga dan integrasi dibangun untuk Docker terlebih dahulu, Podman kemudian (jika ada). Dukungan IDE dan alat GUI tertinggal dari ekosistem Docker.

Anda tidak akan menemukan sebanyak jawaban di Stack Overflow atau isu GitHub untuk masalah Podman Compose.

Keterbatasan ini tidak membuat Podman Compose tidak dapat digunakan, tetapi perlu dipertimbangkan sebelum berkomitmen. Pengguna Docker Compose tidak menghadapi friksi-friksi ini sama sekali.

Praktik Terbaik Menggunakan Podman Compose

Berikut cara menghindari sakit kepala Podman Compose yang paling umum.

  • Mulailah dengan berkas Compose sederhana. Jangan langsung memigrasikan setup Docker paling kompleks Anda. Mulailah dengan aplikasi layanan tunggal, verifikasi berjalan, lalu tambahkan bertahap. Ini membantu Anda mengisolasi masalah saat muncul.

  • Uji jaringan rootless sejak awal. Jalankan aplikasi multi-layanan dan verifikasi kontainer bisa berkomunikasi melalui localhost. Ubah string koneksi dari nama layanan ke localhost. Jika jaringan tidak bekerja sesuai harapan, Anda akan langsung tahu.

  • Jelaslah dalam mendefinisikan volume dan port. Jangan bergantung pada default. Tentukan path penuh untuk bind mount. Definisikan pemetaan port. Atur izin berkas secara eksplisit jika Anda me-mount direktori host. Model rootless Podman berarti asumsi yang berhasil di Docker bisa gagal di sini.

  • Gunakan Podman Compose terutama untuk pengembangan dan produksi ringan. Ia menangani lingkungan dev lokal dan penerapan kecil dengan baik. Untuk produksi berskala, Anda butuh Kubernetes atau platform orkestrasi lain. Podman Compose tidak dibangun untuk klaster high-availability atau mesh layanan kompleks.

Kesimpulan

Podman Compose memberikan cara praktis untuk menjalankan aplikasi multi-kontainer dengan Podman alih-alih Docker. Ia membaca berkas Compose yang sudah ada dan menerjemahkannya menjadi perintah Podman, sehingga Anda tidak perlu mempelajari alur kerja yang benar-benar baru. Namun ini bukan klon sempurna Docker Compose. Jaringan bekerja berbeda, beberapa fitur tidak didukung, dan Anda perlu menyesuaikan string koneksi serta konfigurasi agar sesuai dengan model berbasis pod milik Podman.

Terakhir, saya sarankan Anda membaca perbedaan antara Docker dan Podman untuk mempelajari lebih lanjut pendekatan arsitektural masing-masing dan kompatibilitasnya.

Dario Radečić

Penulis

Dario Radečić

Senior Data Scientist yang berbasis di Kroasia. Penulis Tekno Teratas dengan lebih dari 700 artikel yang telah diterbitkan, menghasilkan lebih dari 10 juta tayangan. Penulis buku Machine Learning Automation with TPOT.

FAQ Docker Compose

Apa itu Podman Compose?

Podman Compose adalah alat berbasis Python yang membaca berkas Docker Compose dan menerjemahkannya menjadi perintah Podman. Ini memungkinkan Anda menjalankan aplikasi multi-kontainer menggunakan Podman alih-alih Docker, memberi Anda alur kerja Compose yang sama tanpa memerlukan daemon atau hak istimewa root.

Bisakah saya menggunakan berkas Docker Compose dengan Podman Compose?

Ya, Podman Compose membaca berkas docker-compose.yml standar. Sebagian besar fitur dasar Docker Compose langsung berfungsi, meskipun Anda perlu menyesuaikan string koneksi dari nama layanan menjadi localhost karena model jaringan berbasis pod milik Podman.

Apa perbedaan utama antara Podman Compose dan Docker Compose?

Podman Compose berjalan rootless secara default dan tidak memerlukan daemon, sementara Docker Compose membutuhkan daemon Docker yang berjalan sebagai root. Podman Compose juga menggunakan jaringan berbasis pod, di mana kontainer berbagi localhost, sedangkan Docker Compose memberi setiap layanan nama host sendiri.

Mengapa layanan saya gagal terhubung saat menggunakan Podman Compose?

Podman Compose menempatkan semua layanan dalam satu pod yang berbagi namespace jaringan, sehingga kontainer berkomunikasi melalui localhost alih-alih nama layanan. Anda perlu mengubah string koneksi seperti db:5432 menjadi localhost:5432 di konfigurasi aplikasi Anda.

Apakah Podman Compose berfungsi di macOS dan Windows?

Ya, tetapi Anda perlu menjalankan Podman di dalam VM Linux terlebih dahulu menggunakan Podman Desktop atau podman machine. Ini menambah kompleksitas dibanding Linux, tempat Podman berjalan secara native, dan Anda mungkin menemui sinkronisasi berkas yang lebih lambat serta keanehan jaringan.

Topik

Terkait

blogs

Tutorial Korelasi di R

blogs

Spaghetti Plot dan Jalur Badai