Lewati ke konten utama
  1. Docker/

Docker Compose untuk Pemula: Menjalankan Aplikasi Multi-Container

Penulis
GezyTech
Menulis tentang AI, Linux, Server, Docker, dan teknologi lainnya.

TLDR
#

Aplikasi modern jarang berdiri sendiri — biasanya butuh database, cache, dan service lain. Docker Compose memungkinkan kamu mendefinisikan semua container itu dalam satu file docker-compose.yml dan menjalankannya dengan satu perintah docker compose up. Artikel ini memandu dari nol sampai aplikasi + database jalan berdampingan.


Pendahuluan
#

Menjalankan container satu per satu dengan docker run cepat jadi repot ketika aplikasi punya banyak bagian: aplikasi web, database, Redis, worker, dan seterusnya. Tiap container butuh opsi network, volume, dan environment sendiri.

Docker Compose menyelesaikan ini dengan deklarasi: kamu tulis apa yang kamu mau (container apa, image apa, port berapa, volume apa) dalam file YAML, lalu Compose yang mengatur semuanya.


Prasyarat
#

Siapkan:

  1. Docker terpasang.
  2. Docker Compose (sudah termasuk di Docker Desktop; di Linux biasanya docker-compose-plugin).

Verifikasi:

docker --version
docker compose version

Contoh Aplikasi Sederhana
#

Bayangkan aplikasi web Node.js yang butuh database MariaDB. Struktur minimal:

proyek/
├── app/
│   ├── package.json
│   └── server.js
└── docker-compose.yml

File docker-compose.yml:

services:
  app:
    build: ./app
    ports:
      - "3000:3000"
    environment:
      DB_HOST: db
      DB_USER: user
      DB_PASSWORD: password
      DB_NAME: appdb
    depends_on:
      - db

  db:
    image: mariadb:11
    environment:
      MARIADB_ROOT_PASSWORD: rootpassword
      MARIADB_DATABASE: appdb
      MARIADB_USER: user
      MARIADB_PASSWORD: password
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

Menjalankan Compose
#

Naikkan semua service:

docker compose up

Menjalankan di background:

docker compose up -d

Melihat status:

docker compose ps

Menghentikan:

docker compose down

Menghentikan sekaligus menghapus volume:

docker compose down -v

Memahami Bagian File YAML
#

Bagian Fungsi
services Daftar container yang akan dijalankan
image Image siap pakai dari registry
build Build image dari Dockerfile
ports Pemetaan port host ke container
environment Environment variable
volumes Penyimpanan persisten
depends_on Urutan start antar service

depends_on vs healthcheck
#

depends_on hanya mengatur urutan start, bukan memastikan database sudah siap menerima koneksi. Untuk itu, tambahkan healthcheck:

services:
  db:
    image: mariadb:11
    environment:
      MARIADB_ROOT_PASSWORD: rootpassword
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 10s
      timeout: 5s
      retries: 5

  app:
    build: ./app
    depends_on:
      db:
        condition: service_healthy

Environment Variable
#

Simpan konfigurasi sensitif di file .env (jangan di-commit):

DB_PASSWORD=rahasia

Referensikan di compose:

services:
  db:
    image: mariadb:11
    environment:
      MARIADB_PASSWORD: ${DB_PASSWORD}

Volume vs Bind Mount
#

Jenis Sintaks Kapan dipakai
Named volume db_data:/var/lib/mysql Data persisten yang dikelola Docker
Bind mount ./app:/app Kode source saat development

Bind mount berguna untuk hot-reload saat development:

services:
  app:
    build: ./app
    volumes:
      - ./app:/app

Perintah Umum
#

Perintah Fungsi
docker compose up -d Jalankan semua service di background
docker compose down Stop & hapus container
docker compose logs -f Lihat log mengalir
docker compose ps Status service
docker compose restart app Restart satu service
docker compose exec app sh Masuk ke shell container
docker compose build Rebuild image
docker compose pull Update image

Troubleshooting
#

Port sudah dipakai
#

Ubah pemetaan port host:

ports:
  - "3001:3000"   # host 3001 → container 3000

Service app tidak bisa konek ke db
#

Gunakan nama service sebagai hostname (misal DB_HOST: db), bukan localhost. Compose membuat network internal otomatis.

Perubahan kode tidak muncul
#

Rebuild image:

docker compose up -d --build

atau gunakan bind mount untuk development.


Keamanan
#

  • Jangan hardcode password di file compose yang di-commit — gunakan .env.
  • Tambahkan .env ke .gitignore.
  • Batasi port yang di-expose ke host — hanya buka yang benar-benar perlu.
  • Jangan expose database ke 0.0.0.0 jika tidak perlu.

Ringkasan
#

# Mulai semua service
docker compose up -d

# Lihat status & log
docker compose ps
docker compose logs -f

# Stop & bersihkan
docker compose down

Dokumentasi resmi: docs.docker.com/compose/