Quick reference Docker Compose v2. Syntax, commands, profiles, healthchecks, networking, dan advanced patterns.
Struktur dasar Docker Compose terdiri dari services, volumes, dan networks untuk mendefinisikan aplikasi multi-container.
services:
app:
image: myapp:latest
ports:
- "3000:3000"
environment:
NODE_ENV: production
db:
image
Perintah-perintah umum Docker Compose untuk mengelola lifecycle container, mulai dari build hingga cleanup.
# Start services
docker compose up
docker compose up -d # Detached mode
docker compose up --build # Rebuild images
docker
Konfigurasi service mendefinisikan bagaimana setiap container berjalan, termasuk image, ports, environment, dan dependencies.
services:
app:
# Image or build
image: node:20-alpine
# OR
build:
context: ./app
Profiles memungkinkan kita mengaktifkan atau menonaktifkan services tertentu berdasarkan environment atau use case.
services:
app:
image: myapp
# No profile = always runs
redis:
image: redis:7
profiles: [dev]
adminer:
image: adminer
profiles: [debug]docker compose up # app only
docker compose --profile dev up # app + redis
docker compose --profile dev --profile debug up # allHealth checks memverifikasi bahwa service berjalan dengan baik sebelum service lain yang bergantung padanya dijalankan.
services:
db:
image: postgres:16
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
start_period:
Watch mode memungkinkan file di-sync otomatis ke container saat development, sehingga perubahan langsung terlihat.
services:
web:
build: .
develop:
watch:
# Sync files (hot reload)
- path: ./src
action: sync
target: /app/src
# Rebuild on change
docker compose watchExtends memungkinkan kita mewarisi konfigurasi dari service lain, mengurangi duplikasi kode.
# base.yml
services:
base:
build: .
environment:
NODE_ENV: ${NODE_ENV}# compose.yml
services:
api:
extends:
file: base.yml
service: base
ports:
- "3000:3000"Multiple compose files memungkinkan kita memisahkan konfigurasi untuk environment berbeda seperti dev, staging, production.
# Override with multiple files
docker compose -f compose.yml -f compose.dev.yml up
# Or set environment variable
export COMPOSE_FILE=compose.yml:compose.dev.yml
docker compose up# compose.yml (base)
services:
app:
image: myapp
# compose.dev.yml (overrides)
services:
app:
build: .
volumes:
- ./src:/app/srcResource limits membatasi penggunaan CPU dan memory untuk setiap service agar tidak mengganggu service lain.
services:
app:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256MNetworks mengatur bagaimana container berkomunikasi satu sama lain dan dengan dunia luar.
services:
frontend:
networks:
- frontend-net
backend:
networks:
- frontend-net
- backend-net
db:
networks:
- backend-net
networks
External network memungkinkan kita menggunakan network yang sudah ada dari Docker host.
networks:
existing:
external: true
name: my-existing-networkVolumes menyimpan data secara persistent sehingga tidak hilang ketika container dihapus atau di-restart.
services:
db:
volumes:
# Named volume
- postgres_data:/var/lib/postgresql/data
# Bind mount
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
# Anonymous volume
- /var/lib/postgresql/temp
volumes:
postgres_data:
driver: External volume memungkinkan kita menggunakan volume yang sudah ada dari Docker host.
volumes:
existing:
external: true
name: my-existing-volumeSecrets menyimpan informasi sensitif seperti password dengan aman dan terpisah dari kode aplikasi.
secrets:
db_password:
file: ./db_password.txt
services:
db:
secrets:
- db_password
environment:
POSTGRES_PASSWORD_FILE: /run/secrets/db_passwordLogging mengatur bagaimana log dari container disimpan dan dikelola untuk debugging dan monitoring.
services:
app:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"Environment variables memungkinkan kita mengkonfigurasi aplikasi tanpa mengubah kode, menggunakan file .env atau langsung di YAML.
services:
app:
environment:
# From .env file
DATABASE_URL: ${DATABASE_URL}
# With default value
LOG_LEVEL: ${LOG_LEVEL:-info}
# Direct value
NODE_ENV: productionDATABASE_URL=postgres://localhost:5432/db
LOG_LEVEL=debugInit containers menjalankan tugas setup atau migrasi database sebelum aplikasi utama dijalankan.
services:
migrate:
image: myapp
command: npm run migrate
depends_on:
db:
condition: service_healthy
restart: "no" # Run once
app:
depends_on:
Common patterns menunjukkan contoh konfigurasi Docker Compose yang sering digunakan untuk berbagai jenis aplikasi.
Konfigurasi lengkap untuk aplikasi full-stack dengan frontend, backend, dan database.
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
environment:
VITE_API_URL: http://localhost:4000
api:
build: ./api
services:
app:
build:
context: .
target: development
volumes:
- ./src:/app/src
- /app/node_modules # Preserve node_modules
environment:
NODE_ENV: development
Context variables memungkinkan kita menggunakan environment variables di YAML untuk membuat konfigurasi lebih dinamis.
services:
app:
image: myapp:${TAG:-latest}
environment:
ENV: ${ENVIRONMENT}
BUILD_DATE: ${BUILD_DATE}Best practices adalah panduan untuk menulis Docker Compose yang aman, maintainable, dan optimal.
postgres:16, not postgres:latest)depends_on with condition: service_healthyunless-stopped for production).env files for configuration.gitignore)docker compose config to validateTroubleshooting berisi perintah-perintah untuk debug masalah dengan Docker Compose.
# View logs
docker compose logs -f service_name
# Check service status
docker compose ps
# Inspect service
docker inspect container_id
# Enter container
docker compose exec service_name sh
# Restart service
Perbedaan antara Docker Compose v1 dan v2, serta kapan menggunakan yang mana.
Docker Compose v1 (deprecated):
docker-compose (with hyphen)Docker Compose v2 (current):
docker compose (with space)Link-link berguna untuk belajar Docker Compose lebih dalam.
Happy composing! 🐳