Docker sudah jadi skill wajib developer modern. Tapi command-nya banyak dan sering lupa. Artikel ini adalah cheat sheet yang bisa dibuka kapanpun kamu butuh.

🖼️ Image

# Ambil image dari Docker Hub
docker pull nginx
docker pull nginx:1.25          # versi spesifik
docker pull php:8.2-fpm

# Lihat semua image lokal
docker images
docker image ls

# Hapus image
docker rmi nginx
docker rmi nginx:1.25
docker image prune              # hapus semua image yang tidak dipakai

# Build image dari Dockerfile
docker build -t nama-app:1.0 .
docker build -t nama-app:1.0 -f Dockerfile.prod .

# Push image ke registry
docker push username/nama-app:1.0

# Inspect image
docker inspect nginx
docker history nginx            # lihat layer-layer image

📦 Menjalankan Container

# Run container
docker run nginx
docker run -d nginx                         # detached (background)
docker run -d --name web nginx              # beri nama
docker run -d -p 8080:80 nginx              # map port host:container
docker run -d -p 8080:80 -p 443:443 nginx   # multiple port

# Run interaktif (masuk ke dalam container)
docker run -it ubuntu bash
docker run -it --rm ubuntu bash             # hapus container saat exit

# Run dengan environment variable
docker run -d -e APP_ENV=production nama-app
docker run -d --env-file .env nama-app

# Run dengan volume (mount folder)
docker run -d -v /host/path:/container/path nginx
docker run -d -v $(pwd):/var/www/html php:8.2-cli

# Run dengan resource limit
docker run -d --memory=512m --cpus=1.0 nginx

⚙️ Manage Container

# Lihat container
docker ps                       # yang sedang berjalan
docker ps -a                    # semua (termasuk yang stopped)

# Start / Stop / Restart
docker start nama-container
docker stop nama-container
docker restart nama-container

# Hapus container
docker rm nama-container
docker rm -f nama-container     # force stop + hapus
docker container prune          # hapus semua container yang stopped

# Masuk ke container yang sedang berjalan
docker exec -it nama-container bash
docker exec -it nama-container sh    # kalau bash tidak ada

# Jalankan command di dalam container
docker exec nama-container php artisan migrate

# Lihat log
docker logs nama-container
docker logs -f nama-container        # real-time (follow)
docker logs --tail 50 nama-container # 50 baris terakhir

# Lihat resource usage
docker stats
docker stats nama-container

# Inspect container
docker inspect nama-container

💾 Volume

# Buat volume
docker volume create nama-volume

# Lihat volume
docker volume ls

# Gunakan volume saat run container
docker run -d -v nama-volume:/var/lib/mysql mysql:8.0

# Inspect volume (lihat lokasi di host)
docker volume inspect nama-volume

# Hapus volume
docker volume rm nama-volume
docker volume prune             # hapus semua volume yang tidak dipakai

🌐 Network

# Lihat network
docker network ls

# Buat network
docker network create nama-network

# Connect container ke network
docker network connect nama-network nama-container

# Run container di network tertentu
docker run -d --network nama-network nama-app

# Inspect network
docker network inspect nama-network

# Hapus network
docker network rm nama-network
docker network prune

🐙 Docker Compose

Docker Compose dipakai untuk mengelola multi-container application. Semua konfigurasi ditulis di file docker-compose.yml.

# Start semua service (baca docker-compose.yml)
docker compose up
docker compose up -d             # background
docker compose up --build        # rebuild image dulu

# Stop semua service
docker compose down
docker compose down -v           # + hapus volume

# Lihat status service
docker compose ps

# Lihat log
docker compose logs
docker compose logs -f           # real-time
docker compose logs app          # log service tertentu

# Jalankan command di service tertentu
docker compose exec app bash
docker compose exec app php artisan migrate

# Restart service tertentu
docker compose restart app

# Rebuild image
docker compose build
docker compose build app         # service tertentu

Contoh docker-compose.yml untuk Laravel

services:
  app:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/var/www/html
    environment:
      - APP_ENV=local
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: myapp
    volumes:
      - db_data:/var/lib/mysql
    ports:
      - "3306:3306"

volumes:
  db_data:

🧹 Cleanup

# Hapus semua yang tidak dipakai sekaligus
docker system prune
docker system prune -a           # termasuk semua image yang tidak dipakai
docker system prune -a --volumes # + semua volume

# Cek penggunaan disk Docker
docker system df
💡 Workflow Paling Umum
docker compose up -d             # start semua service
docker compose logs -f           # pantau log
docker compose exec app bash     # masuk ke container app
# ... kerja / debug ...
docker compose down              # matikan semua