10 tháng 3, 2026 · 10 phút đọc

Docker Compose production-ready: từ dev đến staging

Cấu hình Docker Compose cho môi trường gần production: health checks, secrets management, resource limits và networking.

Docker Compose production-ready: từ dev đến staging

Docker Compose thường được xem là công cụ chỉ dùng cho development — nhưng với cấu hình đúng, nó rất phù hợp cho staging và thậm chí small production deployments. Bài viết này đi vào các chi tiết mà nhiều tutorial bỏ qua.

Multi-stage builds để giảm image size

Dockerfile nên dùng multi-stage build: stage đầu install dependencies và build, stage cuối chỉ copy artifacts. Một Node.js app thường giảm từ 800MB xuống 100-150MB với approach này. Dùng image base distroless hoặc alpine ở production stage.

Layer caching là key để CI/CD nhanh: đặt COPY package.json trước COPY . để layer install dependencies được cache khi code thay đổi nhưng dependencies không đổi.

Container infrastructure diagram
Multi-stage builds giảm production image size đáng kể

Health Checks

Định nghĩa healthcheck trong compose file: test, interval, timeout, retries, start_period. Services phụ thuộc (depends_on) có thể chờ healthy state thay vì chỉ chờ container start. Điều này tránh race condition khi app start nhanh hơn database.

Cho web services: dùng curl -f http://localhost/health hoặc wget -q --spider. Cho database: dùng pg_isready (PostgreSQL) hoặc mysqladmin ping. Tránh dùng sleep — đó là workaround không reliable.

Secrets Management

Không bao giờ đặt secrets trực tiếp trong docker-compose.yml hoặc Dockerfile. Dùng Docker Secrets (cho Swarm) hoặc environment files (.env) được gitignore. Với staging/production, tích hợp vault như HashiCorp Vault hoặc biến môi trường từ CI/CD platform.

Resource Limits

Định nghĩa resources.limits và resources.reservations cho mỗi service. Thiếu limits, một service có thể consume toàn bộ memory của host và kill các services khác. Bắt đầu với limits rộng rồi tune xuống dựa trên monitoring thực tế.

Logging và Observability

Cấu hình logging driver: json-file với max-size và max-file rotation, hoặc gửi thẳng đến centralized logging (Loki, CloudWatch). Structured logs (JSON) dễ parse hơn plain text. Đảm bảo timezone nhất quán giữa host và containers.