alltools.one
DevOps
2025-06-16
8 min
alltools.one Team
YAMLDockerDocker ComposeDevOpsContainers

YAML untuk Docker Compose: Pola Konfigurasi dan Tips

Docker Compose menggunakan YAML untuk mendefinisikan aplikasi multi-kontainer. File docker-compose.yml yang terstruktur dengan baik adalah pembeda antara lingkungan pengembangan yang lancar dan berjam-jam debugging masalah kontainer. Panduan ini membahas pola-pola penting dan jebakan umum.

Struktur Dasar

services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - api

  api:
    build: ./api
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgres://db:5432/myapp
    depends_on:
      - db

  db:
    image: postgres:16
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: myapp
      POSTGRES_PASSWORD: secret

volumes:
  pgdata:

Variabel Lingkungan

Inline

services:
  api:
    environment:
      NODE_ENV: production
      PORT: "3000"
      DEBUG: "false"

Dari File

services:
  api:
    env_file:
      - .env
      - .env.local  # Overrides .env values

Substitusi Variabel

Referensikan variabel lingkungan host:

services:
  api:
    image: myapp:${TAG:-latest}  # Default to "latest"
    environment:
      API_KEY: ${API_KEY}  # Required - fails if not set
      LOG_LEVEL: ${LOG_LEVEL:-info}  # Default to "info"

Jaringan

Jaringan Kustom

services:
  web:
    networks:
      - frontend
  api:
    networks:
      - frontend
      - backend
  db:
    networks:
      - backend

networks:
  frontend:
  backend:
    internal: true  # No external access

Layanan pada jaringan yang sama dapat saling berkomunikasi menggunakan nama layanan. Layanan db hanya dapat dijangkau dari api, bukan dari web.

Pemetaan Port

ports:
  - "8080:80"         # host:container
  - "443:443"
  - "127.0.0.1:3000:3000"  # Bind to localhost only
  - "3000"            # Random host port

Volume

Volume Bernama (Persisten)

services:
  db:
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:
    driver: local

Bind Mount (Pengembangan)

services:
  api:
    volumes:
      - ./src:/app/src          # Source code
      - /app/node_modules       # Anonymous volume (prevent override)

Pola volume anonim (/app/node_modules) mencegah bind mount host menimpa dependensi yang terinstal di kontainer.

Health Check

services:
  db:
    image: postgres:16
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

  api:
    depends_on:
      db:
        condition: service_healthy

Ini memastikan api hanya dimulai setelah db lolos health check — bukan hanya ketika kontainer dimulai.

Field Ekstensi (Pola DRY)

Gunakan field dengan prefiks x- bersama YAML anchor untuk mengurangi pengulangan:

x-common: &common
  restart: unless-stopped
  logging:
    driver: json-file
    options:
      max-size: "10m"
      max-file: "3"

x-env: &common-env
  TZ: UTC
  LOG_FORMAT: json

services:
  api:
    <<: *common
    build: ./api
    environment:
      <<: *common-env
      PORT: "3000"

  worker:
    <<: *common
    build: ./worker
    environment:
      <<: *common-env
      QUEUE: default

Untuk informasi lebih lanjut tentang YAML anchor, lihat panduan YAML anchor dan alias kami.

Compose Multi-Tahap

Pengembangan vs Produksi

# docker-compose.yml (base)
services:
  api:
    build: ./api
    environment:
      DATABASE_URL: postgres://db:5432/myapp

# docker-compose.override.yml (dev - auto-loaded)
services:
  api:
    volumes:
      - ./api/src:/app/src
    environment:
      NODE_ENV: development
      DEBUG: "true"
    ports:
      - "3000:3000"
      - "9229:9229"  # Debug port

# docker-compose.prod.yml
services:
  api:
    environment:
      NODE_ENV: production
    deploy:
      replicas: 3
# Development (auto-loads override)
docker compose up

# Production
docker compose -f docker-compose.yml -f docker-compose.prod.yml up

Jebakan Umum

1. Nomor Port Tanpa Tanda Kutip

# RISKY - YAML interprets 80:80 as a base-60 number
ports:
  - 80:80

# SAFE - always quote
ports:
  - "80:80"

2. Variabel Lingkungan Boolean

# WRONG - YAML converts to boolean
environment:
  DEBUG: true  # Becomes Python True, not string "true"

# CORRECT - quote all env values
environment:
  DEBUG: "true"

3. Timing depends_on

depends_on hanya menunggu kontainer dimulai, bukan kesiapannya:

# Container starts but DB might not be ready
depends_on:
  - db

# Wait for health check
depends_on:
  db:
    condition: service_healthy

Validasi file Docker Compose Anda dengan YAML Validator kami.

FAQ

Apa perbedaan antara docker-compose.yml dan compose.yml?

Kedua nama file berfungsi. compose.yml adalah konvensi baru yang direkomendasikan oleh Docker. docker-compose.yml adalah nama lama. Docker Compose v2+ mencari keduanya, dengan preferensi compose.yml jika keduanya ada. Untuk proyek baru, gunakan compose.yml.

Haruskah saya menggunakan Docker Compose di produksi?

Docker Compose sangat baik untuk pengembangan dan deployment sederhana. Untuk produksi berskala besar, pertimbangkan Docker Swarm (menggunakan file Compose secara native) atau Kubernetes. Keuntungan Compose adalah konfigurasi pengembangan Anda langsung menginformasikan produksi, mengurangi perbedaan lingkungan.

Sumber Terkait

Published on 2025-06-16
YAML for Docker Compose: Configuration Patterns and Tips | alltools.one