
Docker Compose là gì?

Docker Compose là công cụ định nghĩa và chạy ứng dụng multi-container chỉ với một file cấu hình YAML duy nhất. Thay vì phải chạy lần lượt hàng chục lệnh docker run, bạn mô tả toàn bộ hệ thống gồm web server, database, cache, message queue trong file compose.yaml, rồi khởi động tất cả bằng một câu lệnh docker compose up.
Kể từ phiên bản v2, Docker Compose được viết lại hoàn toàn bằng Go và tích hợp sẵn vào Docker CLI dưới dạng plugin. Tới giữa năm 2026, phiên bản mới nhất là Docker Compose v5.5.1 — tiếp tục tuân thủ Compose Specification đã được chuẩn hóa, đồng thời bổ sung các tính năng như Compose Bridge giúp chuyển đổi sang Kubernetes.
Docker Compose giải quyết bài toán cốt lõi của phát triển ứng dụng thực tế: một dự án hiếm khi chỉ có một container. Ứng dụng web cần database, cache, reverse proxy, worker. Mỗi thành phần là một container riêng biệt. Compose chính là lớp điều phối giúp quản lý chúng như một hệ thống thống nhất.
Lợi ích chính của Docker Compose
- Một file, một lệnh: Toàn bộ ngăn xếp hạ tầng được mô tả trong một file YAML, khởi động bằng
docker compose up - Môi trường lặp lại: Dev, staging, production dùng cùng config, loại bỏ lỗi “chạy được trên máy tôi”
- Mạng nội bộ tự động: Compose tạo network riêng cho project, các service gọi nhau qua tên service — không cần cấu hình IP thủ công
- Persistent data: Volume định nghĩa trong file, dữ liệu không mất khi container restart
- Quản lý vòng đời: Start, stop, rebuild, xem logs, chạy lệnh một lần đều có command riêng
- Chi phí gần bằng không: Compose chỉ là lớp CLI gọi Docker Engine API, không có daemon hay control plane riêng — nhẹ hơn Kubernetes rất nhiều
File compose.yaml cơ bản

Một file Compose điển hình cho ứng dụng web + PostgreSQL + Redis trông như sau:
services:
web:
build: .
ports:
- "8080:8080"
depends_on:
- db
- redis
environment:
DATABASE_URL: postgres://app:secret@db:5432/app
db:
image: postgres:16-alpine
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: secret
redis:
image: redis:7-alpine
volumes:
pgdata:
Chỉ với file này, lệnh docker compose up -d khởi động đồng thời ba service, tạo network nội bộ, mount volume bền vững, và cấp biến môi trường cho nhau. Service web truy cập database qua hostname db — Compose lo phần resolve tên.
Compose phù hợp khi nào?
Môi trường phát triển (development)
Đây là use case phổ biến nhất. Trước đây, mỗi thành viên mới trong team phải đọc một trang tài liệu dài về cách cài PostgreSQL, Redis, mail server… Giờ đây chỉ cần clone repo và chạy docker compose up — môi trường hoàn chỉnh sẵn sàng trong vài phút.
Kiểm thử tự động (CI/CD)
Docker Compose tạo và xóa môi trường test biệt lập một cách nhanh chóng: khởi động database + service, chạy test, rồi docker compose down dọn sạch. Mỗi pipeline nhận một môi trường sạch, không xung đột.
Triển khai production quy mô nhỏ
Với server đơn hoặc VPS nhỏ, Compose đủ sức chạy production. Bí quyết là dùng nhiều file override — file gốc cho cấu hình chung, file riêng cho production:
docker compose -f compose.yaml -f compose.prod.yaml up -d
File production có thể override restart policy, image tag, secret, volume. Hướng dẫn chính thức của Docker nhấn mạnh: trong production, mã nguồn phải nằm trong image (không bind-mount thư mục code), và nên set restart: always cho các service quan trọng. Xem thêm tại Docker Compose production guide.
So sánh Docker Compose và Kubernetes
| Tiêu chí | Docker Compose | Kubernetes |
|---|---|---|
| Phạm vi | Một máy chủ | Cụm nhiều nút |
| Độ phức tạp | Một file YAML, học trong phút | Nhiều loại object, học hàng tuần |
| Scale | Thủ công, trên một máy | Tự động, trải nhiều nút |
| Tự phục hồi | restart: always |
Đầy đủ: scheduling, self-healing |
| Tài nguyên | Gần như zero overhead | Cần control plane, etcd, kubelet… |
| Quy mô phù hợp | Dev / Test / Production nhỏ | Production quy mô lớn |
Quy tắc thực tế: bắt đầu với Compose, chuyển sang Kubernetes khi cần auto-scaling, multi-node, hoặc tự phục hồi ở quy mô lớn. Docker còn cung cấp Compose Bridge để chuyển file Compose thành Kubernetes manifest khi đã sẵn sàng nâng cấp.
Ví dụ thực hành: triển khai bộ ứng dụng monitoring
Một ví dụ kinh điển — bộ giám sát hệ thống với Prometheus + Grafana:
services:
prometheus:
image: prom/prometheus:latest
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
depends_on:
- prometheus
Chạy docker compose up -d, truy cập Grafana tại port 3000, thêm Prometheus làm data source — cả bộ giám sát hoạt động mà không cần cài metric server thủ công trên hệ điều hành. Đó chính là sức mạnh của Compose: mô tả hạ tầng như code, tái lập chỉ trong giây lát.
Best practices khi dùng Compose
- Tách file theo môi trường: compose.yaml (nền tảng) + compose.prod.yaml / compose.test.yaml (override)
- Không bind-mount code trong production: mã phải nằm trong image, bind-mount chỉ dùng cho dev để hot-reload
- Set restart policy phù hợp:
restart: alwayscho service production quan trọng - Dùng biến môi trường: File
.envhoặc sectionenvironmentđể tùy biến theo môi trường, không hardcode secret - Rebuild có kiểm soát:
docker compose build web && docker compose up --no-deps -d webđể cập nhật một service mà không đụng các service khác - Thêm log aggregator: Đưa service thu thập log vào file Compose production
Muốn tìm hiểu sâu hơn, tài liệu chính thức tại docs.docker.com/compose là nguồn đầy đủ nhất về Compose Specification, profiles, và các tính năng mở rộng. Đối với người mới, hãy bắt đầu với một project nhỏ hai service — web + database — rồi phát triển dần. Docker Compose là kỹ năng cơ bản nhưng cực kỳ giá trị cho mọi lập trình viên.
