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 builddockerfile: nama Dockerfileargs: 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:
noalwayson-failureunless-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 #
- Pisahkan file untuk environment berbeda (
docker-compose.override.yml) - Gunakan
.envuntuk konfigurasi - Hindari hardcode secret
- Gunakan healthcheck + depends_on
- Gunakan network terpisah (frontend / backend)
- Jangan gunakan
container_nameuntuk 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.