
Docker Compose cho phát triển microservice cục bản
Docker Compose là công cụ giúp bạn khởi chạy toàn bộ stack microservice bằng một lệnh duy nhất từ file docker-compose.yml. Thay vì chạy từng container riêng lẻ, Compose tự động quản lý service, mạng và ổ cứng sống cho môi trường phát triển đồng nhất. Bài viết này hướng dẫn cách cấu hình một stack gồm API, PostgreSQL, Redis và Adminer chỉ trong vài phút.
Docker Compose làm gì trong dev?
Docker Compose (còn gọi là docker compose trên CLI hiện đại) đọc file YAML cấu hình và biến .env, sau đó tạo và khởi chạy tất cả container trong stack. Mỗi service có thể dùng build: (từ Dockerfile) hoặc image: (từ registry). Compose tự động tạo một mạng bridge để các service giao tiếp với nhau qua tên service, đảm bảo môi trường dev giống hệt CI và production. Bạn không cần viết script bash phức tạp để khởi động nhiều container — một lệnh docker compose up thay thế toàn bộ quy trình đó.
Một trong những lợi ích chính là tính nhất quán giữa môi trường. Mỗi thành viên trong team dùng cùng cấu hình, cùng phiên bản database, cùng biến môi trường — không còn lỗi “trên máy tôi chạy được”. Kết hợp với healthcheck, Compose đảm bảo service phụ chạy sẵn trước service chính, loại bỏ race condition phổ biến khi API kết nối database chưa sẵn sàng.

Ví dụ docker-compose.yml microservice dev
Dưới đây là một file cấu hình hoàn chỉnh cho môi trường dev gồm API (build từ source), PostgreSQL, Redis và Adminer (chỉ chạy khi dùng profile dev):
services:
api:
build: .
env_file: .env
ports:
- "8000:8000"
depends_on:
db:
condition: service_healthy
develop:
watch:
- action: sync
path: ./src
target: /app/src
- action: rebuild
path: .
profiles: ["dev"]
db:
image: postgres:16
volumes:
- db_data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD:-secret}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 3s
retries: 3
adminer:
image: adminer
profiles: ["dev"]
ports:
- "8080:8080"
volumes:
db_data:
develop.watch cho phép live-sync code khi thay đổi file — rất tiện cho TDD. profiles: ["dev"] tách tooling (Adminer) ra khỏi service chính, tránh câu lạc quan tài nguyên.
Quản lý mạng và volume
Mặc định Compose tạo một mạng bridge. Các service chỉ cần gọi tên service để kết nối. Để kiểm soát chi tiết, bạn khai báo riêng:
services:
api:
networks:
- backend
db:
networks:
- backend
networks:
backend:
driver: bridge
ipam:
config:
- subnet: 172.28.0.0/16

Volume để dữ liệu sống tún
Dùng named volume để persistent data — ngay cả khi xóa container, dữ liệu volume vẫn còn. Đây là cách đề xuất trong hướng dẫn gettingstarted của Docker:
volumes:
db_data:
Multi-file cấu hình môi trường
Compose tự động gộp -f theo thứ tự. Quy ước chuẩn: compose.yaml (chính) + compose.override.yaml (dev) + compose.prod.yaml (prod). Đây là best practice để môi trường đồng nhất từ dev tới production. Bạn có thể tách tooling ra khỏi service chính bằng profiles — ví dụ: service không có profiles luôn chạy, còn service có profiles: ["debug"] chỉ chạy khi bạn chỉ định docker compose --profile debug up.
File compose.override.yaml thường chứa các thay đổi cho môi trường dev như mounts để live-reload, ports mở rộng, hoặc service phụ như Adminer, Mailhog. Khi deploy production, bạn dùng docker compose -f compose.yaml -f compose.prod.yml up -d, giữ lại chỉ các thành phần cần thiết. Lưu ý: override files luôn được áp dụng tự động khi không có -f — đây là hành vi mặc định của Compose.
Lệnh thường dùng
| Lệnh | Công dụ |
|---|---|
docker compose up -d |
Khởi động background |
docker compose down -v |
Dừng + xóa volume |
docker compose --profile dev up |
Chạy service theo profile |
docker compose logs -f api |
Xem log realtime |
docker compose build |
Build lại image |
Với .env + interpolation (${VAR:-default}), bạn tránh hard-code secret và commit an toàn file cấu hình lên Git. Luôn thêm .env và .dockerignore vào .gitignore.
Kết luận
Docker Compose là lựa chọn lý tưởng để phát triển microservice cục bản: một lệnh, toàn bộ stack chạy đồng thời, code tự đồng sync, dữ liệu sống tún và profile tách tooling. Kết hợp healthcheck để tránh race condition, named volume để persistent data, và multi-file compose để môi trường dev-prod nhất quán.
Đừng quên thêm .dockerignore để loại bỏ .env, node_modules, .git ra khỏi build context — tránh đưa secret vào image layer. Dùng .env + interpolation (${VAR:-default}) để tránh hard-code trong file compose. Đây là những best practice giúp bạn tận dụng tối đa Docker Compose mà không gặp vấn đề bảo mật.

Chi tiết tham khảo tại docs.docker.com/compose và compose-file reference.
