Skip to content
VDS · Docker dan kontainer

Docker Compose: beberapa layanan dengan satu perintah

Cara mendeskripsikan gabungan aplikasi, basis data, dan web server dalam satu file, menjalankannya dengan satu perintah, dan memperbaruinya tanpa build ulang manual.

Diperbarui 23 Agustus 2026

Anda bisa menjalankan satu layanan dengan perintah docker run yang panjang. Dua layanan yang perlu saling terhubung — itu tidak lagi berhasil: Anda akan lupa parameternya keesokan harinya. Compose memindahkan seluruh deskripsi ke dalam file yang bisa Anda baca, edit, dan simpan di repositori.

Contoh minimal

Direktori /opt/myapp, dengan compose.yaml di dalamnya:

services:
  db:
    image: postgres:17
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: app
    volumes:
      - db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      retries: 5

  app:
    image: ghcr.io/example/app:1.4.2
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    environment:
      DATABASE_URL: postgres://postgres:${DB_PASSWORD}@db:5432/app
    ports:
      - "127.0.0.1:8080:8080"

volumes:
  db-data:

Di sebelahnya, file .env:

DB_PASSWORD=long-random-password
chmod 600 .env
docker compose up -d
docker compose ps
docker compose logs -f app

Yang penting di sini

  • Nama, bukan alamat. Aplikasi menjangkau database dengan nama db — Compose membuat jaringan bersama tempat nama layanan diselesaikan secara otomatis. Anda tidak perlu mempublikasikan port database ke luar, dan sebaiknya jangan.
  • restart: unless-stopped. Tanpa itu, tidak ada yang akan hidup kembali setelah mesin reboot.
  • depends_on dengan health check. depends_on biasa hanya menunggu container menyala, bukan menunggu database siap menerima koneksi. Aplikasi menyala lebih awal dan crash.
  • Versi image yang tepat. postgres:17, bukan postgres:latest. Dengan latest, suatu hari pull berikutnya akan membawa versi major yang tidak bisa membuka data lama.
  • Publikasi di 127.0.0.1. Buka port ke luar hanya melalui web server dengan sertifikat.

Perintah sehari-hari

docker compose up -d          # bring up or apply changes
docker compose down           # stop and remove containers (volumes intact)
docker compose down -v        # ...and remove volumes too
docker compose restart app    # restart one service
docker compose exec app sh    # go inside
docker compose pull && docker compose up -d   # update images
docker compose config         # show final file with substitutions

docker compose config adalah cara terbaik untuk memeriksa file sebelum menjalankan: perintah ini akan menunjukkan hasil ekspansi variabel dan apakah ada indentasi yang hilang.

docker compose down -v menghapus volume beserta database-nya. Ini tidak bisa dibatalkan. Sebelum operasi apa pun dengan -v, pastikan Anda punya salinan — lihat backup.

File environment

Memisahkan stack yang sama untuk pengujian dan produksi dengan overlay itu praktis:

docker compose -f compose.yaml -f compose.prod.yaml up -d

File kedua hanya menimpa perbedaannya: batas memori, port yang dipublikasikan, dan level log.

Kesalahan umum

  • Secret di compose.yaml yang disimpan di repositori. Simpan di .env dengan izin 600 dan jangan di-commit.
  • Mencampur docker-compose dan docker compose. Versi v1 lama tidak memahami sebagian sintaks dan menyimpan proyek dengan nama yang berbeda. Pasang plugin-nya — lihat Instalasi Docker.
  • Data di dalam container, bukan di volume. Setelah docker compose down, data itu akan hilang. Lihat volume.
  • Tanpa batas memori. Satu layanan menghabiskan seluruh memori mesin, dan kernel membunuh tetangganya. Lihat batas sumber daya.