Docker Compose 2026: Aplikasi Multi-Container, Jaringan, dan Pertanyaan Interview DevOps

Pelajari Docker Compose untuk aplikasi multi-container dengan networking, volumes, dan deployment produksi. Dilengkapi pertanyaan interview DevOps.

Docker Compose 2026: Aplikasi Multi-Container, Jaringan, dan Pertanyaan Interview DevOps

Docker Compose tetap menjadi alat utama untuk mendefinisikan dan menjalankan aplikasi Docker multi-container pada tahun 2026. Baik untuk mengorkestrasi stack development lokal maupun mempersiapkan interview DevOps, pemahaman tentang networking Compose, dependency service, dan pola produksi membedakan engineer junior dari praktisi senior.

Poin Penting

Docker Compose menggunakan format YAML deklaratif untuk mendefinisikan services, networks, dan volumes dalam satu file. Menjalankan docker compose up akan memulai seluruh stack aplikasi dengan jaringan terisolasi dan penyimpanan persisten.

Memahami Arsitektur Docker Compose

Docker Compose beroperasi berdasarkan prinsip sederhana: definisikan services aplikasi dalam file compose.yaml (konvensi penamaan modern menggantikan docker-compose.yml), dan Compose menangani pembuatan container, networking, dan manajemen lifecycle.

Spesifikasi Docker Compose mendefinisikan tiga konsep inti:

  • Services: Konfigurasi container termasuk image, build context, environment variables, dan resource limits
  • Networks: Channel komunikasi terisolasi antar services
  • Volumes: Penyimpanan data persisten yang bertahan setelah container restart
yaml
# compose.yaml
services:
  api:
    build: ./api
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgres://db:5432/app
    depends_on:
      db:
        condition: service_healthy
    networks:
      - backend

  db:
    image: postgres:16
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=app
      - POSTGRES_PASSWORD_FILE=/run/secrets/db_password
    secrets:
      - db_password
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5
    networks:
      - backend

networks:
  backend:
    driver: bridge

volumes:
  postgres_data:

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

Konfigurasi ini mendemonstrasikan beberapa pola production-ready: health checks untuk dependency ordering, Docker secrets untuk data sensitif, named volumes untuk persistensi, dan definisi network eksplisit.

Mendalami Docker Compose Networking

Secara default, Compose membuat satu network untuk aplikasi. Semua services bergabung ke network ini dan dapat saling menjangkau menggunakan nama service sebagai hostname. Memahami model networking ini fundamental untuk migrasi Kubernetes nantinya.

yaml
# compose.yaml
services:
  frontend:
    build: ./frontend
    ports:
      - "80:80"
    networks:
      - frontend-net
      - backend-net

  api:
    build: ./api
    networks:
      - backend-net

  cache:
    image: redis:7-alpine
    networks:
      - backend-net

  db:
    image: postgres:16
    networks:
      - backend-net

networks:
  frontend-net:
    driver: bridge
  backend-net:
    driver: bridge
    internal: true

Flag internal: true mencegah backend network mengakses internet eksternal. Service frontend menjembatani kedua network, bertindak sebagai satu-satunya titik masuk. Segmentasi network ini mencerminkan praktik keamanan produksi.

Resolusi DNS

Server DNS embedded Docker menyelesaikan nama service secara otomatis. Service api dapat menjangkau database di db:5432 tanpa konfigurasi IP manual.

Multi-Stage Builds dengan Compose

Image produksi harus minimal. Multi-stage builds dikombinasikan dengan Compose profiles memungkinkan konfigurasi berbeda untuk development dan produksi.

dockerfile
# api/Dockerfile
# Stage 1: Build
FROM node:22-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Stage 2: Production
FROM node:22-alpine AS production
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY package*.json ./
USER node
EXPOSE 3000
CMD ["node", "dist/index.js"]

# Stage 3: Development
FROM node:22-alpine AS development
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
USER node
CMD ["npm", "run", "dev"]
yaml
# compose.yaml
services:
  api:
    build:
      context: ./api
      target: ${BUILD_TARGET:-production}
    volumes:
      - ${API_VOLUMES:-./api/dist:/app/dist:ro}
    profiles:
      - ${COMPOSE_PROFILES:-prod}

Menjalankan BUILD_TARGET=development COMPOSE_PROFILES=dev docker compose up memulai konfigurasi development dengan hot reload.

Service Dependencies dan Health Checks

Direktif depends_on mengontrol urutan startup, tetapi container yang dimulai tidak berarti service sudah siap. Health checks menyelesaikan masalah timing ini—pola yang sering ditanyakan dalam interview DevOps.

yaml
# compose.yaml
services:
  api:
    build: ./api
    depends_on:
      db:
        condition: service_healthy
      cache:
        condition: service_started
      migrations:
        condition: service_completed_successfully

  migrations:
    build: ./api
    command: npm run migrate
    depends_on:
      db:
        condition: service_healthy

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

  cache:
    image: redis:7-alpine
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 3

Tiga kondisi dependency tersedia:

  • service_started: Default, container telah dimulai
  • service_healthy: Health check berhasil
  • service_completed_successfully: Container exit dengan kode 0 (untuk init containers)

Siap menguasai wawancara DevOps Anda?

Berlatih dengan simulator interaktif, flashcards, dan tes teknis kami.

Docker Compose untuk Development Lokal

Lingkungan development mendapat manfaat dari bind mounts, environment overrides, dan debugging tools. File compose.override.yaml secara otomatis digabungkan dengan compose.yaml.

yaml
# compose.yaml (konfigurasi dasar)
services:
  api:
    build: ./api
    environment:
      - NODE_ENV=production

  db:
    image: postgres:16
yaml
# compose.override.yaml (override development)
services:
  api:
    build:
      target: development
    volumes:
      - ./api:/app
      - /app/node_modules
    environment:
      - NODE_ENV=development
      - DEBUG=app:*
    ports:
      - "9229:9229"

  db:
    ports:
      - "5432:5432"

Anonymous volume /app/node_modules mencegah node_modules host menimpa dependencies yang terinstall di container.

Pola Deployment Produksi

Docker Compose cocok untuk deployment produksi single-host. Untuk orkestrasi multi-host, Kubernetes dengan Helm menyediakan scaling lebih baik, tetapi Compose tetap viable untuk aplikasi kecil.

yaml
# compose.prod.yaml
services:
  api:
    image: registry.example.com/api:${VERSION:-latest}
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: "0.5"
          memory: 512M
        reservations:
          cpus: "0.25"
          memory: 256M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./certs:/etc/nginx/certs:ro
    depends_on:
      - api

Key deploy mengkonfigurasi resource limits, jumlah replika, dan restart policies. Menjalankan docker compose -f compose.prod.yaml up -d memulai stack produksi dalam mode detached.

Environment Variables dan Manajemen Secrets

Konfigurasi sensitif memerlukan penanganan yang tepat. Docker Compose mendukung beberapa pendekatan, dari file .env hingga Docker secrets.

bash
# .env
POSTGRES_PASSWORD=dev_password_only
API_SECRET_KEY=local_dev_key
yaml
# compose.yaml
services:
  api:
    environment:
      - API_SECRET_KEY  # Mewarisi dari shell atau .env
      - DATABASE_URL=postgres://user:${POSTGRES_PASSWORD}@db:5432/app
    env_file:
      - ./config/api.env

Untuk produksi, Docker secrets menyediakan keamanan lebih baik dengan mounting data sensitif sebagai file daripada environment variables:

yaml
# compose.prod.yaml
services:
  api:
    secrets:
      - api_key
      - db_password
    environment:
      - API_KEY_FILE=/run/secrets/api_key

secrets:
  api_key:
    external: true
  db_password:
    file: ./secrets/db_password.txt
Catatan Keamanan

Jangan pernah commit file .env yang berisi secrets produksi ke version control. Gunakan manajemen secret eksternal seperti HashiCorp Vault atau solusi cloud provider untuk deployment produksi.

Pertanyaan Interview DevOps Umum tentang Docker Compose

Pewawancara menguji pemahaman konsep Compose melalui skenario praktis. Pertanyaan-pertanyaan ini sering muncul dalam interview DevOps dan platform engineering.

T: Bagaimana container dalam network Compose berkomunikasi?

Docker membuat dedicated bridge network untuk setiap project Compose. Services berkomunikasi menggunakan nama service sebagai hostname. Server DNS embedded menyelesaikan nama-nama ini ke alamat IP container. Traffic eksternal hanya dapat menjangkau services melalui port yang dipublikasikan secara eksplisit.

T: Apa yang terjadi ketika menjalankan docker compose up dengan container yang sudah ada?

Compose membandingkan konfigurasi saat ini dengan container yang sedang berjalan. Services yang tidak berubah tetap berjalan. Services yang dimodifikasi dibuat ulang dengan pengaturan baru. Services baru dimulai dari awal. Services yang dihapus dihentikan dan dihapus.

T: Bagaimana menangani migrasi database di Compose?

Dua pola tersedia. Pertama, gunakan init container dengan dependency service_completed_successfully:

yaml
services:
  migrate:
    image: api:latest
    command: npm run migrate
    depends_on:
      db:
        condition: service_healthy

  api:
    depends_on:
      migrate:
        condition: service_completed_successfully

Kedua, sertakan logika migrasi dalam script startup aplikasi, memeriksa dan menerapkan migrasi pending sebelum menerima traffic.

T: Apa perbedaan volumes dan bind mounts?

Named volumes dikelola oleh Docker, disimpan di /var/lib/docker/volumes, dan portable antar host. Bind mounts memetakan direktori host langsung ke dalam container, berguna untuk development tetapi tergantung environment. Volumes mendukung driver untuk penyimpanan remote seperti NFS atau cloud block storage.

T: Apa perbedaan docker-compose dan docker compose?

docker-compose dengan tanda hubung adalah tool standalone berbasis Python V1, sekarang deprecated. docker compose dengan spasi adalah implementasi V2 berbasis Go yang terintegrasi ke Docker CLI. V2 lebih cepat, mendukung Compose Specification sepenuhnya, dan menerima pengembangan aktif.

Debugging Aplikasi Compose

Troubleshooting aplikasi containerized memerlukan teknik spesifik. Perintah-perintah ini mengungkap apa yang terjadi di dalam stack Compose:

bash
# Lihat logs dari semua services
docker compose logs -f

# Logs dari service spesifik dengan timestamps
docker compose logs -f --timestamps api

# Eksekusi command di container yang berjalan
docker compose exec api sh

# Jalankan command sekali (memulai container baru)
docker compose run --rm api npm test

# Lihat penggunaan resource
docker compose top
docker stats

# Inspeksi konfigurasi network
docker network inspect project_backend

# Validasi compose file
docker compose config

Perintah docker compose config menggabungkan semua compose files dan menampilkan konfigurasi final—sangat berharga untuk debugging masalah interpolasi variabel.

Kesimpulan

  • Docker Compose mendefinisikan aplikasi multi-container dalam satu file YAML dengan services, networks, dan volumes
  • Services berkomunikasi via DNS menggunakan nama service sebagai hostname dalam default bridge network
  • Health checks dengan kondisi service_healthy memastikan urutan startup yang tepat
  • Gunakan compose.override.yaml untuk pengaturan khusus development seperti bind mounts dan debug ports
  • Deployment produksi mendapat manfaat dari resource limits, restart policies, dan Docker secrets untuk data sensitif
  • CLI docker compose (V2) menggantikan docker-compose (V1) yang deprecated dengan performa dan fitur lebih baik

Mulai berlatih!

Uji pengetahuan Anda dengan simulator wawancara dan tes teknis kami.

Bagikan

Artikel terkait