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

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

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

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

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

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 dibuat
podman
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 dibuat

Statistik 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

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.json

Mencari 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

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
# 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)

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