Docker & Podman
Perintah container runtime yang paling sering dibutuhkan, mencakup siklus hidup container, manajemen image, volume, jaringan, Compose, dan pembersihan. Tab Docker dan Podman ditampilkan berdampingan — sebagian besar sintaksnya identik.
00
Instalasi dan Verifikasi
Cek versi dan pastikan daemon / service berjalan sebelum melanjutkan.
Cek versi dan info runtime
docker
docker version # versi client + server (daemon) docker info # ringkasan sistem: storage driver, runtime, dll.
podman
podman version # versi client (tidak butuh daemon) podman info # ringkasan sistem: storage, rootless, dll.
Status service
Podman tidak membutuhkan daemon. Setiap perintah berjalan langsung sebagai proses milik user (rootless by default).
docker
sudo systemctl status docker sudo systemctl enable --now docker
podman
# Tidak ada daemon; jalankan perintah langsung. # Untuk socket API yang kompatibel Docker: systemctl --user start podman.socket
01
Siklus Hidup Container
Menjalankan, menghentikan, dan mengelola container.
Menjalankan container
Flag
--rm otomatis menghapus container setelah berhenti — ideal untuk task sekali jalan.docker
# format dasar docker run [opsi] <image> [perintah] # contoh umum docker run -d --name web -p 8080:80 nginx # background, port forwarding docker run -it --rm ubuntu bash # interaktif, hapus saat selesai docker run -d -e DB_URL=postgres://... myapp # env var docker run --rm -v "$(pwd)":/app -w /app node:22 npm test # mount dir kerja
podman
# format dasar podman run [opsi] <image> [perintah] # contoh umum podman run -d --name web -p 8080:80 nginx # background, port forwarding podman run -it --rm ubuntu bash # interaktif, hapus saat selesai podman run -d -e DB_URL=postgres://... myapp # env var podman run --rm -v "$(pwd)":/app -w /app node:22 npm test # mount dir kerja
Melihat container
docker
docker ps # container yang sedang berjalan
docker ps -a # semua container (termasuk yang berhenti)
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"podman
podman ps # container yang sedang berjalan
podman ps -a # semua container (termasuk yang berhenti)
podman ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"Menghentikan dan menghapus
docker
docker stop web # SIGTERM → tunggu → SIGKILL (grace period) docker kill web # SIGKILL langsung docker rm web # hapus container (harus sudah berhenti) docker rm -f web # paksa hentikan lalu hapus docker rm $(docker ps -aq) # hapus semua container yang berhenti
podman
podman stop web # SIGTERM → tunggu → SIGKILL (grace period) podman kill web # SIGKILL langsung podman rm web # hapus container (harus sudah berhenti) podman rm -f web # paksa hentikan lalu hapus podman rm $(podman ps -aq) # hapus semua container yang berhenti
Masuk ke container yang berjalan
docker
docker exec -it web bash # shell interaktif docker exec web cat /etc/os-release # jalankan perintah tanpa shell interaktif docker attach web # hubungkan ke stdin/stdout proses utama
podman
podman exec -it web bash # shell interaktif podman exec web cat /etc/os-release # jalankan perintah tanpa shell interaktif podman attach web # hubungkan ke stdin/stdout proses utama
Menyalin file
docker
docker cp web:/etc/nginx/nginx.conf ./nginx.conf # container → host docker cp ./config.json web:/app/config.json # host → container
podman
podman cp web:/etc/nginx/nginx.conf ./nginx.conf # container → host podman cp ./config.json web:/app/config.json # host → container
02
Image
Mengunduh, membangun, menandai, dan mendistribusikan image.
Mengunduh dan mencari image
docker
docker pull nginx # unduh image terbaru docker pull nginx:1.27-alpine # versi spesifik docker images # daftar image lokal docker images --filter dangling=true # image tanpa tag (<none>)
podman
podman pull nginx # unduh image terbaru podman pull nginx:1.27-alpine # versi spesifik podman images # daftar image lokal podman images --filter dangling=true # image tanpa tag (<none>)
Membangun image
Flag
--no-cache berguna saat layer cache menyimpan dependensi lama yang perlu diperbarui.docker
docker build -t myapp:1.0 . # build dari Dockerfile di direktori saat ini docker build -t myapp:1.0 -f deploy/Dockerfile . # Dockerfile kustom docker build --no-cache -t myapp:1.0 . # build ulang tanpa cache docker build --target builder -t myapp:dev . # multi-stage: berhenti di stage tertentu
podman
podman build -t myapp:1.0 . # build dari Dockerfile di direktori saat ini podman build -t myapp:1.0 -f deploy/Dockerfile . # Dockerfile kustom podman build --no-cache -t myapp:1.0 . # build ulang tanpa cache podman build --target builder -t myapp:dev . # multi-stage: berhenti di stage tertentu
Menandai dan mendistribusikan
docker
docker tag myapp:1.0 registry.example.com/myapp:1.0 docker push registry.example.com/myapp:1.0 docker pull registry.example.com/myapp:1.0
podman
podman tag myapp:1.0 registry.example.com/myapp:1.0 podman push registry.example.com/myapp:1.0 podman pull registry.example.com/myapp:1.0
Menghapus image
docker
docker rmi nginx # hapus image docker rmi -f nginx # paksa hapus (meski ada container yang menggunakannya) docker image prune # hapus semua image dangling docker image prune -a # hapus semua image yang tidak dipakai container mana pun
podman
podman rmi nginx # hapus image podman rmi -f nginx # paksa hapus (meski ada container yang menggunakannya) podman image prune # hapus semua image dangling podman image prune -a # hapus semua image yang tidak dipakai container mana pun
Ekspor dan impor image
docker
docker save myapp:1.0 | gzip > myapp.tar.gz # ekspor ke file docker load < myapp.tar.gz # impor dari file
podman
podman save myapp:1.0 | gzip > myapp.tar.gz # ekspor ke file podman load < myapp.tar.gz # impor dari file
03
Volume dan Mount
Persistensi data di luar container.
Mengelola volume
Gunakan named volume untuk data aplikasi (lebih mudah dikelola) dan bind mount untuk berbagi kode dari host ke container.
docker
docker volume create pgdata # buat named volume docker volume ls # daftar volume docker volume inspect pgdata # detail mountpoint, driver, dll. docker volume rm pgdata # hapus volume docker volume prune # hapus semua volume yang tidak terpakai
podman
podman volume create pgdata # buat named volume podman volume ls # daftar volume podman volume inspect pgdata # detail mountpoint, driver, dll. podman volume rm pgdata # hapus volume podman volume prune # hapus semua volume yang tidak terpakai
Menggunakan volume saat run
docker
# named volume docker run -d -v pgdata:/var/lib/postgresql/data postgres:16 # bind mount (path absolut atau $(pwd)) docker run -d -v "$(pwd)/app":/app -p 3000:3000 node:22 # read-only bind mount docker run -d -v "$(pwd)/config":/app/config:ro myapp
podman
# named volume podman run -d -v pgdata:/var/lib/postgresql/data postgres:16 # bind mount (path absolut atau $(pwd)) podman run -d -v "$(pwd)/app":/app -p 3000:3000 node:22 # read-only bind mount podman run -d -v "$(pwd)/config":/app/config:ro myapp
Volume sementara (tmpfs)
docker
docker run --tmpfs /tmp:rw,size=128m myapp # RAM disk, tidak persisten
podman
podman run --tmpfs /tmp:rw,size=128m myapp # RAM disk, tidak persisten
04
Jaringan
Mengelola network
docker
docker network ls # daftar network docker network create appnet # buat bridge network baru docker network inspect appnet # detail: subnet, container terhubung, dll. docker network rm appnet
podman
podman network ls # daftar network podman network create appnet # buat bridge network baru podman network inspect appnet # detail: subnet, container terhubung, dll. podman network rm appnet
Menghubungkan container ke network
Container dalam network yang sama dapat saling berkomunikasi menggunakan nama container sebagai hostname — tidak perlu expose port ke host.
docker
docker run -d --name db --network appnet postgres:16 docker run -d --name api --network appnet -e DB_HOST=db myapi # menghubungkan container yang sudah berjalan docker network connect appnet web docker network disconnect appnet web
podman
podman run -d --name db --network appnet postgres:16 podman run -d --name api --network appnet -e DB_HOST=db myapi # menghubungkan container yang sudah berjalan podman network connect appnet web podman network disconnect appnet web
Mode network khusus
docker
docker run --network host myapp # berbagi namespace jaringan host docker run --network none myapp # isolasi penuh, tanpa jaringan
podman
podman run --network host myapp # berbagi namespace jaringan host podman run --network none myapp # isolasi penuh podman run --network pasta myapp # mode rootless default di Podman ≥ 5 (lebih baik dari slirp4netns)
05
Compose — Stack Multi-Container
Mendefinisikan dan menjalankan aplikasi multi-container dari satu file YAML.
Perintah dasar Compose
docker
docker compose up -d # jalankan semua service di background docker compose up -d --build # build ulang image lalu jalankan docker compose down # hentikan dan hapus container + network docker compose down -v # juga hapus named volume docker compose ps # status semua service docker compose logs -f api # ikuti log service tertentu docker compose exec api bash # masuk ke container service docker compose pull # perbarui semua image
podman
podman compose up -d # butuh podman-compose (pip install podman-compose) # atau gunakan Podman v4+ built-in: podman compose up -d podman compose down podman compose ps podman compose logs -f api podman compose exec api bash
Contoh docker-compose.yml minimal
contoh
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_PASSWORD: secret
volumes:
- pgdata:/var/lib/postgresql/data
api:
build: .
restart: unless-stopped
ports:
- "3000:3000"
environment:
DATABASE_URL: postgres://postgres:secret@db:5432/mydb
depends_on:
- db
volumes:
pgdata:Scale dan update service
docker
docker compose up -d --scale worker=4 # jalankan 4 replika service worker docker compose up -d --no-deps api # rebuild dan restart hanya service api
podman
podman compose up -d --scale worker=4 podman compose up -d --no-deps api
06
Debugging dan Inspeksi
Log container
docker
docker logs web # seluruh log docker logs -f web # ikuti log secara real-time docker logs --tail 100 web # 100 baris terakhir docker logs --since 1h web # log 1 jam terakhir docker logs --timestamps web # sertakan stempel waktu
podman
podman logs web # seluruh log podman logs -f web # ikuti log secara real-time podman logs --tail 100 web # 100 baris terakhir podman logs --since 1h web # log 1 jam terakhir podman logs --timestamps web # sertakan stempel waktu
Inspeksi container dan image
docker
docker inspect web # metadata lengkap dalam JSON
docker inspect web | jq '.[0].NetworkSettings.IPAddress' # ambil IP
docker inspect --format '{{.State.Status}}' web
docker history myapp:1.0 # layer image + ukuran
docker diff web # perubahan filesystem sejak container dibuatpodman
podman inspect web # metadata lengkap dalam JSON
podman inspect web | jq '.[0].NetworkSettings.IPAddress' # ambil IP
podman inspect --format '{{.State.Status}}' web
podman history myapp:1.0 # layer image + ukuran
podman diff web # perubahan filesystem sejak container dibuatStatistik penggunaan sumber daya
docker
docker stats # live: CPU, RAM, jaringan, disk semua container docker stats web api # hanya container tertentu docker stats --no-stream # snapshot sekali, lalu keluar docker top web # proses yang berjalan di dalam container
podman
podman stats # live: CPU, RAM, jaringan, disk semua container podman stats web api # hanya container tertentu podman stats --no-stream # snapshot sekali, lalu keluar podman top web # proses yang berjalan di dalam container
Debug container yang gagal start
Jika container langsung berhenti, gunakan
--entrypoint untuk mengganti entrypoint dan masuk ke shell untuk investigasi.docker
# ganti entrypoint untuk investigasi
docker run -it --rm --entrypoint bash myapp
# lihat exit code container yang sudah berhenti
docker inspect web --format '{{.State.ExitCode}}'podman
# ganti entrypoint untuk investigasi
podman run -it --rm --entrypoint bash myapp
# lihat exit code container yang sudah berhenti
podman inspect web --format '{{.State.ExitCode}}'07
Registry
Login dan autentikasi
docker
docker login # Docker Hub docker login registry.example.com # registry privat docker logout registry.example.com
podman
podman login docker.io # Docker Hub
podman login registry.example.com
podman logout registry.example.com
# Podman menyimpan kredensial di ${XDG_RUNTIME_DIR}/containers/auth.jsonMencari image
docker
docker search nginx # cari di Docker Hub
podman
podman search nginx # cari di semua registry yang dikonfigurasi podman search --list-tags docker.io/library/nginx # daftar tag tersedia
08
Pod (Podman)
Podman mendukung konsep Pod seperti Kubernetes — sekelompok container yang berbagi namespace jaringan dan PID.
Mengelola pod
Pod sangat berguna untuk meniru perilaku Kubernetes secara lokal sebelum deploy, atau untuk mengelompokkan container yang harus berbagi localhost.
podman
podman pod create --name mypod -p 8080:80 # buat pod dengan port forwarding podman run -d --pod mypod nginx # tambahkan container ke pod podman run -d --pod mypod sidecar-app # container kedua berbagi jaringan nginx podman pod ps # daftar pod podman pod inspect mypod podman pod stop mypod podman pod rm mypod
docker
# Docker tidak memiliki konsep Pod bawaan. # Gunakan --network container:<nama> untuk berbagi namespace jaringan: docker run -d --name web nginx docker run -d --network container:web sidecar-app
Generate Kubernetes YAML dari pod
podman
podman generate kube mypod > mypod.yaml # ekspor pod ke format Kubernetes podman kube play mypod.yaml # jalankan pod dari Kubernetes YAML
docker
# Tidak tersedia di Docker. Gunakan Kompose untuk mengonversi # docker-compose.yml ke Kubernetes manifest: # kompose convert -f docker-compose.yml
Integrasi systemd (Podman)
Podman dapat menghasilkan unit systemd untuk container atau pod, memungkinkan container berjalan sebagai service yang dikelola systemd tanpa daemon.
podman
# buat unit systemd untuk container yang berjalan podman generate systemd --name web --files --new mv container-web.service ~/.config/systemd/user/ systemctl --user daemon-reload systemctl --user enable --now container-web.service
docker
# Docker umumnya dikelola via daemon dan restart policy: docker run -d --restart unless-stopped --name web nginx
09
Pembersihan
Membebaskan ruang disk dari resource yang tidak terpakai.
Prune bertarget
docker
docker container prune # hapus semua container yang berhenti docker image prune # hapus image dangling (<none>:<none>) docker image prune -a # hapus semua image yang tidak dipakai container aktif docker volume prune # hapus volume yang tidak terhubung container mana pun docker network prune # hapus network yang tidak dipakai
podman
podman container prune # hapus semua container yang berhenti podman image prune # hapus image dangling (<none>:<none>) podman image prune -a # hapus semua image yang tidak dipakai container aktif podman volume prune # hapus volume yang tidak terhubung container mana pun podman network prune # hapus network yang tidak dipakai
Prune sekaligus (nuclear option)
Perintah ini tidak bisa dibatalkan. Semua container berhenti, image tidak terpakai, volume anonim, dan network kustom akan dihapus permanen.
docker
docker system prune # container, image dangling, network docker system prune -a # + semua image yang tidak dipakai docker system prune -a --volumes # + volume juga docker system df # ringkasan penggunaan disk
podman
podman system prune # container, image dangling, network podman system prune -a # + semua image yang tidak dipakai podman system prune -a --volumes # + volume juga podman system df # ringkasan penggunaan disk