Container
Container adalah unit isolasi perangkat lunak yang membungkus kode aplikasi beserta seluruh dependensinya (pustaka dan konfigurasi) agar dapat berjalan secara konsisten di lingkungan mana pun. Bagi Anda yang familier dengan Linux, container tidak sama dengan Mesin Virtual (VM). VM melakukan emulasi perangkat keras dan menjalankan kernel Sistem Operasi (OS) tamu yang utuh. Sebaliknya, container berjalan langsung di atas kernel OS host (induk) yang sama.
Isolasi antar-container di Linux tercapai berkat pemanfaatan dua fitur utama kernel, yaitu namespaces dan cgroups. Namespaces bertugas mengisolasi jarak pandang proses (seperti sistem berkas, jaringan, PID, dan user), sehingga sebuah container merasa berjalan sendirian di dalam sistem. Sementara itu, cgroups (control groups) bertugas mengendalikan dan membatasi penggunaan sumber daya fisik seperti CPU, memori, dan I/O agar tidak terjadi perebutan resource antar-container. Berkat arsitektur yang berbagi kernel ini, container memiliki ukuran yang sangat kecil (hanya puluhan megabita) dan dapat aktif dalam hitungan detik.
1. Image, Container, dan Registry
Untuk menguasai ekosistem ini, Anda harus memahami hubungan logis antara tiga komponen utama berikut:
- Image: Merupakan cetak biru (blueprint) atau resep statis yang bersifat read-only. Image tersusun atas beberapa lapisan (layers) terkompresi, di mana setiap lapisan mewakili satu instruksi spesifik, seperti instalasi paket atau penyalinan kode aplikasi.
- Container: Merupakan instans hidup atau wujud operasional dari image. Saat Anda menjalankan image, sistem akan menambahkan satu lapisan tipis yang dapat dibaca dan ditulis (read-write layer) di bagian paling atas. Semua perubahan data yang terjadi saat aplikasi berjalan hanya akan tersimpan di lapisan atas ini dan akan hilang secara permanen jika container dihapus.
- Registry: Adalah layanan pusat untuk menyimpan, mengelola, dan mendistribusikan image. Contoh registry publik yang paling populer adalah Docker Hub (
docker.io) dan Quay (quay.io).
2. Podman dan Instalasi
Podman (Pod Manager) adalah engine container sumber terbuka (open-source) yang dirancang secara spesifik untuk sistem operasi Linux. Podman menggunakan standar OCI (Open Containers Initiative), yang membuatnya sepenuhnya kompatibel dengan Docker. Anda bahkan bisa membuat alias perintah alias docker=podman untuk kemudahan transisi.
Perbedaan terbesar Podman dengan Docker terletak pada arsitekturnya yang daemonless dan mendukung penuh mode rootless. Podman tidak membutuhkan proses latar belakang (daemon) yang berjalan dengan hak akses root (seperti dockerd pada Docker). Setiap kali Anda menjalankan perintah Podman, perintah tersebut langsung berkomunikasi dengan kernel melalui pustaka libpod. Mode rootless memungkinkan pengguna biasa menjalankan container dengan aman; jika terjadi celah keamanan atau kebocoran dari dalam container, penyerang hanya akan mendapatkan hak akses pengguna biasa di dalam sistem host, bukan kendali penuh root.
Proses instalasi Podman di distribusi Linux Debian/Ubuntu dapat dilakukan dengan perintah berikut:
sudo apt update && sudo apt install podman -y
Setelah instalasi selesai, verifikasi versi Podman yang terpasang menggunakan perintah:
podman version
3. Find, Run, Build, dan Share
Podman menyederhanakan siklus hidup pengembangan aplikasi melalui empat langkah utama yang terstruktur: mencari (Find), menjalankan (Run), membangun (Build), dan membagikan (Share).
Langkah pertama adalah mencari image siap pakai yang tersedia di registry publik. Anda dapat menggunakan perintah pencarian untuk menemukan repositori aplikasi, misalnya mencari utilitas Linux busybox:
podman search docker.io/busybox
Setelah menemukan image yang sesuai, Anda dapat langsung mengunduh dan menjalankannya secara interaktif. Opsi -it digunakan untuk membuka sesi terminal interaktif di dalam container:
podman run -it docker.io/library/busybox #`exit` untuk keluar
Untuk melihat image yang baru saja diunduh, Anda dapat menggunakan perintah podman images:
ubuntu@demo:~$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/busybox latest c6348fa86ba0 6 weeks ago 4.69 MB
ubuntu@demo:~$
Dalam skenario nyata, Anda sering kali perlu memodifikasi atau membuat image sendiri menggunakan berkas konfigurasi bernama Containerfile. Anda juga bisa membangun image langsung dari repositori Git publik yang menyediakan konfigurasi tersebut:
podman build -t hello https://github.com/containers/PodmanHello.git
Untuk menguji image hasil build lokal tersebut, jalankan perintah:
podman run -it hello
Agar hasil kerja Anda dapat digunakan oleh orang lain, Anda dapat mengunggah image lokal ke registry publik seperti Quay.io. Proses ini membutuhkan autentikasi, pemberian tag baru yang sesuai dengan nama pengguna Anda, dan perintah unggah (push):
# 1. Login ke registry
podman login quay.io
# 2. Berikan tag baru pada image lokal agar sesuai dengan tujuan repositori
podman tag localhost/hello quay.io/USERNAME/hello
# 3. Unggah image ke registry
podman push quay.io/USERNAME/hello
Untuk memeriksa detail metadata dari image yang telah berhasil diunggah, gunakan fungsi inspeksi:
podman inspect quay.io/USERNAME/hello
4. Interaksi dan Manajemen State Container
Saat sebuah container berjalan di latar belakang, Anda mungkin perlu melakukan pemeliharaan, melihat aktivitas, atau bahkan menyimpan perubahan state yang terjadi di dalamnya.
Untuk masuk ke dalam sistem berkas container yang sedang aktif tanpa menghentikan aplikasinya, gunakan perintah podman exec. Perintah ini sangat berguna untuk proses debugging internal:
podman exec -it nama_container /bin/bash
Catatan: Jika shell
bashtidak tersedia di dalam container, Anda dapat menggantinya dengan/bin/sh.
Untuk memantau aktivitas atau melihat keluaran standar (standard output) dari aplikasi utama di dalam container, gunakan perintah log. Tambahkan opsi -f (follow) untuk melihat log secara waktu nyata (real-time):
podman logs -f nama_container
Jika Anda melakukan eksperimen atau perubahan konfigurasi langsung di dalam container dan ingin membekukannya menjadi sebuah image baru, Anda dapat menggunakan perintah commit. Namun, perlu diingat bahwa metode ini kurang disarankan untuk lingkungan produksi karena sulit untuk dilacak kembali historinya:
podman commit nama_container my-custom-image:v1
5. Volume dan Bind Mounts
Secara standar, seluruh data yang ditulis di dalam container bersifat sementara (ephemeral). Mengingat lapisan atas container berstatus read-write yang akan musnah saat container dihapus, Anda memerlukan mekanisme penyimpanan permanen untuk data penting seperti basis data atau berkas log. Podman menyediakan dua metode utama:
Volume adalah ruang penyimpanan terisolasi di dalam sistem host yang siklus hidupnya dikelola sepenuhnya oleh Podman. Metode ini sangat aman dan direkomendasikan untuk produksi karena tidak mengganggu struktur direktori utama host.
# Membuat volume baru
podman volume create mydata
# Menjalankan container dengan memasang volume tersebut
podman run -d -v mydata:/data nama_image
Bind Mounts memetakan direktori atau berkas spesifik dari sistem host langsung ke dalam direktori di dalam container. Metode ini sangat ideal untuk lingkungan pengembangan (development) karena perubahan kode program di komputer host akan langsung terbaca secara instan di dalam container.
podman run -d -v /home/user/project:/app nama_image
6. Jaringan dan Konsep Pod
Secara bawaan, Podman menyediakan jaringan bertipe bridge. Setiap container akan mendapatkan alamat IP internal sendiri sehingga mereka dapat saling berkomunikasi di dalam satu host. Anda juga dapat membuat jaringan terisolasi baru agar antar-aplikasi tidak saling bercampur:
# Membuat jaringan khusus
podman network create mynet
# Menjalankan container di dalam jaringan tersebut
podman run -d --network mynet nama_image
Salah satu fitur unggulan yang diadopsi Podman dari Kubernetes adalah konsep Pod. Pod adalah sebuah wadah atau grup logis yang menampung satu atau beberapa container. Semua container yang berada di dalam satu Pod yang sama akan berbagi namespace jaringan, IPC, dan PID yang sama.
Artinya, container A dan container B di dalam satu Pod dapat saling berkomunikasi menggunakan alamat localhost dan port masing-masing, mirip seperti dua proses yang berjalan di komputer yang sama. Pemetaan port ke dunia luar cukup dilakukan sekali pada level Pod.
7. Orkestrasi dan Pemecahan Masalah
Untuk mengelola aplikasi multi-container yang kompleks secara terstruktur, Podman mendukung spesifikasi Docker Compose menggunakan alat tambahan bernama podman-compose. Anda dapat mendefinisikan seluruh arsitektur layanan di dalam sebuah berkas deklaratif docker-compose.yml:
# Mengaktifkan seluruh layanan di latar belakang
podman-compose up -d
# Menghentikan dan menghapus seluruh layanan
podman-compose down
Selain itu, karena Podman ramah terhadap ekosistem Kubernetes, Anda dapat langsung menjalankan berkas manifes YAML Kubernetes di mesin lokal tanpa perlu memasang klaster Kubernetes penuh:
podman play kube deployment.yaml
Jika container Anda mendadak mati tepat setelah dijalankan, lakukan langkah pemeriksaan berikut:
- Periksa Log: Cari pesan kesalahan internal aplikasi dengan
podman logs nama_container. - Inspeksi Metadata: Periksa konfigurasi, variabel lingkungan, dan status exit code dengan
podman inspect nama_container. - Mode Interaktif: Jalankan kembali image secara manual menggunakan opsi
-itdiikuti dengan shell (/bin/shatau/bin/bash) untuk mengisolasi masalah secara langsung.
Terakhir, kontainerisasi yang aktif sering kali meninggalkan sampah digital berupa lapisan image tua atau container mati yang memenuhi ruang penyimpanan disk. Lakukan pembersihan berkala pada sistem Anda dengan perintah:
podman system prune -a