Struktur Docker Compose #

Docker Compose adalah alat untuk mendefinisikan dan menjalankan aplikasi multi-container menggunakan satu file deklaratif bernama docker-compose.yml. Dengan Compose, kita bisa mendeskripsikan service, network, volume, config, dan secret secara terpusat, konsisten, dan mudah direproduksi di berbagai environment (local, staging, production).

Artikel ini akan membahas struktur Docker Compose secara sangat detail, mencakup:

  • Struktur dasar file docker-compose.yml
  • Semua section utama dan field-field penting
  • Contoh penggunaan nyata untuk setiap bagian
  • Catatan best practice di setiap area

Catatan: Docker Compose modern mengikuti Compose Specification, sehingga keyword version: sudah tidak wajib lagi, namun masih sering ditemui di proyek lama.

Gambaran Struktur Umum Docker Compose #

services:
  <service-name>:
    image:
    build:
    command:
    environment:
    ports:
    volumes:
    depends_on:
    networks:

volumes:
  <volume-name>:

networks:
  <network-name>:

configs:
  <config-name>:

secrets:
  <secret-name>:

Tidak semua section wajib digunakan. Struktur ini bersifat modular dan bisa disesuaikan dengan kebutuhan arsitektur.


Section services #

services adalah inti dari Docker Compose. Setiap service merepresentasikan satu container runtime.

Struktur Dasar Service #

services:
  app:
    image: nginx:alpine

Field Umum pada Service #

image #

Menentukan image Docker yang digunakan.

image: redis:7-alpine

Best practice:

  • Gunakan tag spesifik, hindari latest

build #

Digunakan jika image dibangun dari Dockerfile.

build:
  context: .
  dockerfile: Dockerfile
  args:
    APP_ENV: production

Field penting:

  • context: path build
  • dockerfile: nama Dockerfile
  • args: build-time argument

container_name #

Menentukan nama container secara eksplisit.

container_name: my-nginx

Catatan:

  • Tidak disarankan untuk environment scale / swarm

command #

Override command default image.

command: ["npm", "run", "start"]

Atau:

command: npm run start

entrypoint #

Override entrypoint image.

entrypoint: ["/entrypoint.sh"]

environment #

Mendefinisikan environment variable.

environment:
  APP_ENV: production
  DEBUG: "false"

Atau array:

environment:
  - APP_ENV=production
  - DEBUG=false

env_file #

Load environment variable dari file.

env_file:
  - .env

ports #

Expose port container ke host.

ports:
  - "8080:80"

Format:

  • HOST:CONTAINER

expose #

Expose port hanya ke internal network.

expose:
  - "3000"

volumes #

Mount volume atau bind mount.

volumes:
  - ./data:/var/lib/mysql
  - app-data:/app/data

depends_on #

Mengatur urutan startup service.

depends_on:
  - db

Dengan kondisi (Compose v2):

depends_on:
  db:
    condition: service_healthy

healthcheck #

Mendefinisikan pengecekan kesehatan container.

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 30s
  timeout: 5s
  retries: 3

restart #

Kebijakan restart container.

restart: unless-stopped

Nilai umum:

  • no
  • always
  • on-failure
  • unless-stopped

networks #

Menentukan network yang digunakan service.

networks:
  - backend

user #

Menentukan user yang digunakan container.

user: "1000:1000"

working_dir #

Menentukan working directory.

working_dir: /app

tty dan stdin_open #

Umum untuk container interaktif.

tty: true
stdin_open: true

Section volumes #

Mendefinisikan named volume.

volumes:
  app-data:
    driver: local

Digunakan untuk:

  • Database
  • Persistent storage

Section networks #

Mendefinisikan custom network.

networks:
  backend:
    driver: bridge

Advanced:

networks:
  frontend:
    external: true

Section configs #

Digunakan untuk config non-sensitive (umum di Swarm).

configs:
  nginx_conf:
    file: ./nginx.conf

Digunakan di service:

configs:
  - source: nginx_conf
    target: /etc/nginx/nginx.conf

Section secrets #

Digunakan untuk data sensitif.

secrets:
  db_password:
    file: ./secrets/db_password.txt

Digunakan di service:

secrets:
  - db_password

Contoh Docker Compose Lengkap #

services:
  app:
    build: .
    container_name: demo-app
    ports:
      - "8080:8080"
    environment:
      APP_ENV: production
    depends_on:
      db:
        condition: service_healthy
    networks:
      - backend

  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: app
      POSTGRES_USER: user
      POSTGRES_PASSWORD: secret
    volumes:
      - db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user"]
      interval: 10s
      retries: 5
    networks:
      - backend

volumes:
  db-data:

networks:
  backend:
    driver: bridge

Best Practice #

  1. Pisahkan file untuk environment berbeda (docker-compose.override.yml)
  2. Gunakan .env untuk konfigurasi
  3. Hindari hardcode secret
  4. Gunakan healthcheck + depends_on
  5. Gunakan network terpisah (frontend / backend)
  6. Jangan gunakan container_name untuk sistem yang akan diskalakan

Penutup #

Dengan memahami struktur Docker Compose secara menyeluruh, Anda bisa membangun environment aplikasi yang:

  • Konsisten
  • Mudah dikembangkan
  • Siap untuk production

Pada artikel-artikel berikutnya, struktur ini akan kita turunkan ke use case spesifik seperti web application, database cluster, message broker, hingga arsitektur microservices.

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact