Docker Compose: 37,393 GitHub Stars — Hướng Dẫn Thiết Lập Ứng Dụng Đa Container 2026
Docker Compose (docker compose) xác định và chạy ứng dụng Docker đa container bằng cấu hình YAML khai báo. Tương thích với Docker, Traefik, Prometheus, Grafana. Bao gồm cài đặt, gia cố production, kiểm tra sức khỏe và so sánh với Kubernetes/Podman/Nomad.
- ⭐ 37393
- Apache-2.0
- Cập nhật 2026-05-19
{{< resource-info >}}

Giới Thiệu #
Việc quản lý ứng dụng đa container bằng các lệnh docker run thuần sẽ nhanh chóng trở nên khó kiểm soát. Một web stack điển hình cần database, cache, reverse proxy và chính ứng dụng——đó là bốn container riêng biệt với network, volume và biến môi trường cần kết nối lại với nhau. Docker Compose giải quyết vấn đề này bằng một file YAML khai báo duy nhất. Với hơn 37.000 GitHub stars, nó vẫn là công cụ được áp dụng rộng rãi nhất cho phát triển local và triển khai production trên một node. Hướng dẫn này bao gồm mọi thứ từ cài đặt đến gia cố production, với cấu hình thực tế bạn có thể triển khai ngay hôm nay.
Docker Compose Là Gì? #
Docker Compose là công cụ xác định và chạy ứng dụng Docker đa container bằng file cấu hình YAML khai báo (thường là compose.yaml). Nó tự động xử lý service discovery, tạo network, mount volume và thứ tự khởi động——biến một thư mục định nghĩa container thành một hệ thống có thể chạy được chỉ bằng một lệnh.
Docker Compose Hoạt Động Như Thế Nào #

Kiến trúc rất đơn giản. Bạn viết file compose.yaml mô tả các service, network và volume. CLI plugin docker compose đọc file này và dịch thành các lệnh gọi API Docker Engine. Đây là những gì diễn ra bên dưới:
- Cách ly project: Compose tạo một Docker network chuyên dụng tên là
<project>_<network>(mặc định: tên thư mục +_default). Tất cả service trong project giao tiếp qua network bridge bị cách ly này. - Service discovery: Các container tiếp cận nhau bằng tên service. Nếu bạn có service
db, containerapikết nối đếndb:5432mà không cần cấu hình DNS. - Quản lý volume: Named volume giữ dữ liệu qua các lần restart container. Compose thêm tiền tố tên project vào tên volume để tránh xung đột.
- Sắp xếp thứ tự phụ thuộc: Chỉ thị
depends_onkiểm soát thứ tự khởi động. Kết hợp vớicondition: service_healthy, nó đảm bảo database sẵn sàng trước khi ứng dụng khởi động. - Vòng đợi tài nguyên:
docker compose uptạo mọi thứ;docker compose downphá hủy. Thêm--volumesđể xóa dữ liệu persistent, hoặc--rmi allđể dọn dẹp image.
Đặc tả Compose hiện đại (v2.x+, dựa trên Go) là đặc tả rolling——không còn cần khóa cấp cao nhất version:. Tên file chuẩn đã chuyển từ docker-compose.yml sang compose.yaml, mặc dù cả hai đều được chấp nhận để tương thích ngược.
Cài Đặt & Thiết Lập #
Docker Compose v2 được phân phối như một CLI plugin đi kèm với Docker Engine. Binary docker-compose (v1) dựa trên Python legacy đã bị deprecated vào năm 2023 và không còn được duy trì.
Linux (Ubuntu/Debian) #
# Cập nhật chỉ mục gói
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
# Thêm khóa GPG chính thức của Docker
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Thêm repository
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Cài đặt Docker Engine + plugin Compose
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
# Thêm user vào nhóm docker (cần đăng xuất để áp dụng)
sudo usermod -aG docker $USER
newgrp docker
# Xác minh
docker compose version
# Kết quả mong đợi: Docker Compose version v2.36.0+
macOS #
Tải Docker Desktop từ docker.com. Docker Compose đã được tích hợp sẵn. Trên Apple Silicon, Docker Desktop sử dụng Virtualization.framework cho hiệu suất tốt hơn 30-40% so với backend QEMU cũ.
# Xác minh sau khi cài đặt
docker compose version
Xác Minh Sau Cài Đặt #
# Kiểm tra container đang chạy trong project compose
docker compose ps
# Xem log cho tất cả service
docker compose logs --tail 100 -f
# Kiểm tra mức sử dụng tài nguyên
docker stats --no-stream
Windows (WSL2) #
# Kích hoạt WSL2
wsl --install
# Khởi động lại, sau đó cài đặt Docker Desktop với WSL2 backend được chọn
docker compose version
Cài Đặt Binary Thủ Công #
Cho môi trường không có package manager:
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.36.0/docker-compose-linux-x86_64 \
-o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
docker compose version
Tích Hợp Với Các Công Cụ Phổ Biến #
Traefik (Reverse Proxy & Load Balancer) #
Traefik tự động phát hiện container Docker và định tuyến traffic dựa trên label. Điều này loại bỏ việc cấu hình nginx thủ công:
# compose.yaml — Traefik + Whoami ví dụ
name: proxy-demo
services:
traefik:
image: traefik:v3.3
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
whoami:
image: traefik/whoami
labels:
- "traefik.enable=true"
- "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
- "traefik.http.routers.whoami.entrypoints=web"
Khởi động bằng docker compose up -d và truy cập http://whoami.localhost.
Prometheus + Grafana (Stack Giám Sát) #
# compose.yaml — Stack giám sát
name: monitoring
services:
prometheus:
image: prom/prometheus:v3.2.0
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus_data:/prometheus
ports:
- "9090:9090"
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
grafana:
image: grafana/grafana:11.5.0
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
depends_on:
- prometheus
volumes:
prometheus_data:
grafana_data:
Prometheus thu thập metric container; Grafana trực quan hóa chúng. Thêm nguồn dữ liệu Prometheus tại http://prometheus:9090 sau khi đăng nhập.
Ứng Dụng Full-Stack (PostgreSQL + Redis + FastAPI + Nginx) #
# compose.yaml — Ứng dụng 3-tier sẵn sàng production
name: myapp
services:
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: appuser
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: appdb
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U appuser -d appdb"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
restart: unless-stopped
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 3s
retries: 3
restart: unless-stopped
api:
build:
context: ./api
dockerfile: Dockerfile
environment:
DATABASE_URL: postgresql://appuser:${DB_PASSWORD}@db:5432/appdb
REDIS_URL: redis://redis:6379/0
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
restart: unless-stopped
nginx:
image: nginx:1.27-alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
api:
condition: service_healthy
restart: unless-stopped
volumes:
postgres_data:
redis_data:
Các pattern chính được minh họa: dependency có kiểm tra sức khỏe, named volume để persistence, build context cho image tùy chỉnh, và restart: unless-stopped cho khả năng phục hồi.
Benchmark / Các Trường Hợp Sử Dụng Thực Tế #
Docker Compose xuất sắc trong các tình huống cụ thể. Dưới đây là số liệu từ các triển khai production và so sánh:
| Chỉ số | Docker Compose | Kubernetes | Podman Compose | Nomad |
|---|---|---|---|---|
| RAM Control Plane | ~50 MB | ~2 GB | 0 MB (không daemon) | ~100 MB |
| Số Node Hỗ Trợ | Một node | Không giới hạn | Một node | Không giới hạn |
| Service Mỗi Project | 1-50 điển hình | 1-10,000+ | 1-50 điển hình | 1-1,000+ |
| Thởi Gian Deploy Đầu | < 5 phút | 2-8 giờ | < 5 phút | 30-60 phút |
| Số Dòng YAML 3-Tier | ~40 | ~200+ (Deployment + Service) | ~40 | ~80 |
| Auto-Scaling | Thủ công (docker compose up –scale) | Native HPA | Thủ công | Native |
| Rolling Updates | Chỉ recreate | Native | Chỉ recreate | Native |
Tốc độ khởi động: Docker Compose đưa stack 5 service lên trong vòng 10 giây trên máy 4 nhân. Triển khai Kubernetes tương đương với Helm mất 60-120 giây bao gồm cả việc lập lịch pod.
Hiệu quả tài nguyên: Overhead Compose khoảng 50 MB RAM cho CLI + Docker daemon. Một control plane Kubernetes tối thiểu tiêu thụ ~2 GB trước khi chạy workload nào. Đối với triển khai dưới 10 service trên một node, Compose sử dụng overhead orchestration ít hơn 40 lần.
Áp dụng CI/CD: Hơn 90% workflow GitHub Actions sử dụng container dựa vào Docker Compose cho môi trường kiểm tra tích hợp. Lệnh docker compose up --wait (chờ trạng thái healthy) loại bỏ pipeline test không ổn định do race condition.
Sử Dụng Nâng Cao / Gia Cợ Production #
Health Checks và Thứ Tự Khởi Động #
Không bao giờ triển khai production mà không có health check. Container hiển thị trạng thái Up chỉ có nghĩa là tiến trình đã khởi động——không phải ứng dụng đang hoạt động:
services:
api:
image: myapp:v1.2.3
healthcheck:
test: ["CMD", "curl", "-fsS", "http://localhost:8080/ready"]
interval: 15s
timeout: 5s
retries: 3
start_period: 30s
depends_on:
db:
condition: service_healthy
restart: unless-stopped
Xoay Vòng Log #
Log JSON không giới hạn sẽ lấp đầy đĩa. Cấu hình driver logging local với rotation:
services:
api:
image: myapp:v1.2.3
logging:
driver: "local"
options:
max-size: "10m"
max-file: "3"
compress: "true"
Giới Hạn Tài Nguyên #
Ngăn một container bất thường làm cạn kiệt tài nguyên của các container khác:
services:
worker:
image: myapp-worker:v1.2.3
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
cpus: '0.25'
memory: 128M
Profiles để Phân Tách Môi Trường #
Sử dụng profiles để định nghĩa service chỉ dùng cho dev mà không cần duy trì nhiều file:
services:
api:
image: myapp:latest
ports:
- "8080:8080"
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: devpass
pgadmin:
image: dpage/pgadmin4:latest
profiles: ["debug"]
ports:
- "5050:80"
environment:
PGADMIN_DEFAULT_EMAIL: admin@local.dev
PGADMIN_DEFAULT_PASSWORD: admin
Chỉ chạy công cụ debug khi cần: docker compose --profile debug up -d. Không có flag này, pgadmin sẽ bị bỏ qua.
Quản Lý Secrets #
Không bao giờ commit mật khẩu vào file compose. Sử dụng Docker secrets hoặc file môi trường:
services:
api:
image: myapp:latest
secrets:
- db_password
environment:
DB_PASSWORD_FILE: /run/secrets/db_password
secrets:
db_password:
file: ./secrets/db_password.txt
Chỉ Thị include (Compose v2.20+) #
Chia project lớn thành các file compose module:
# compose.yaml — file gốc
name: platform
include:
- path: ./infra/postgres.yaml
- path: ./infra/redis.yaml
- path: ./apps/api.yaml
- path: ./apps/worker.yaml
env_file: ./apps/worker.env
Mỗi file được include là một file compose hợp lệ với service, network và volume riêng. Điều này giữ các file cá nhển dưới 50 dòng và giúp review code dễ quản lý.
Triển Khai Blue/Green #
Để cập nhật zero-downtime mà không cần Kubernetes, sử dụng hai project compose và reverse proxy:
#!/bin/bash
# deploy.sh
CURRENT=$(cat /tmp/current_slot 2>/dev/null || echo "blue")
NEW=$([ "$CURRENT" = "blue" ] && echo "green" || echo "blue")
# Build và khởi động slot mới
docker compose -p "app-${NEW}" -f compose.yaml up -d --build --wait
# Cập nhật nginx upstream
sed -i "s/app-${CURRENT}/app-${NEW}/g" /etc/nginx/conf.d/upstream.conf
nginx -s reload
# Hạ slot cũ
docker compose -p "app-${CURRENT}" -f compose.yaml down
# Lưu slot đang hoạt động
echo "$NEW" > /tmp/current_slot
So Sánh Với Các Lựa Chọn Thay Thế #
| Tính năng | Docker Compose | Kubernetes | Podman + Compose | Nomad |
|---|---|---|---|---|
| Độ Khó | Thấp (YAML đơn) | Cao (nhiều resource) | Thấp (tương thích Docker CLI) | Trung bình (config HCL) |
| Đa Node | Không (một host) | Có | Không (một host) | Có |
| Cần Daemon | Có (dockerd) | Có (kubelet + control plane) | Không (không daemon) | Có (Nomad agent) |
| Rootless Mặc Định | Không | Không | Có | Tùy chọn |
| Auto-Scaling | Chỉ thủ công | Native HPA | Chỉ thủ công | Native |
| Storage Volume | Chỉ local | CSI plugin (mọi backend) | Chỉ local | Host + CSI |
| Quản Lý Secrets | File-based env | Native Secrets + Vault | File-based env | Tích hợp Vault |
| Quy Mô Cộng Đồng | 37K+ stars | 110K+ (kubernetes/kubernetes) | 23K+ (containers/podman) | 15K+ (hashicorp/nomad) |
| Phù Hợp Nhất Cho | Dev, CI/CD, production nhỏ | Production quy mô lớn | Bảo mật, rootless | Workload hỗn hợp |
| Giấy Phép | Apache-2.0 | Apache-2.0 | Apache-2.0 | BUSL (source available) |
Hạn Chế / Đánh Giá Trung Thực #
Docker Compose không phải giải pháp vạn năng. Đây là những nơi nó còn thiếu sót:
Ràng buộc một node: Compose chạy trên một host. Nếu host đó gặp sự cố, toàn bộ stack sẽ down. Đối với yêu cầu high availability, bạn cần Kubernetes, Nomad hoặc Docker Swarm.
Không có auto-scaling native: docker compose up --scale api=3 hoạt động, nhưng nó là thủ công. Không có horizontal pod autoscaling dựa trên CPU hoặc memory như Kubernetes HPA.
Quản lý secrets hạn chế: Docker secrets đọc từ file chấp nhận được cho thiết lập một node. Nhưng thiếu rotation, mã hóa at rest và RBAC chi tiết mà Kubernetes Secrets hoặc HashiCorp Vault cung cấp.
Rolling updates cơ bản: Compose tái tạo container. Nó không thể làm canary deployment, traffic splitting hoặc rollback về replica set trước đó. Đối với triển khai zero-downtime mission-critical, hãy sử dụng orchestrator phức tạp hơn.
Networking chỉ local: Network bridge mặc định hoạt động trong một host. Service mesh đa host, ingress controller và cross-region load balancing cần Kubernetes hoặc service mesh như Istio.
Phụ thuộc daemon: Không giống Podman, Compose yêu cầu Docker daemon (dockerd) chạy. Daemon là điểm lỗi đơn lẻ và mối lo ngại bảo mật tiềm ẩn trong môi trường được quản lý.
Câu Hỏi Thường Gặp #
Tôi có vẫn cần dòng version: "3.8" trong file compose không? #
Không. Đặc tả Compose giờ đã không có phiên bản. Khóa version bị bỏ qua trong Compose v2.x+ và v5.x. Các project mới nên hoàn toàn bỏ qua nó và sử dụng compose.yaml làm tên file. File docker-compose.yml legacy với dòng version vẫn hoạt động để tương thích ngược.
Sự khác biệt giữa docker-compose và docker compose là gì? #
docker-compose (có dấu gạch ngang) là binary v1 dựa trên Python legacy, deprecated năm 2023 và không còn được duy trì. docker compose (có dấu cách) là v2 CLI plugin được viết bằng Go, được duy trì tích cực, nhanh hơn và đi kèm với Docker Engine. Tất cả script và CI pipeline mới nên sử dụng docker compose.
Làm thế nào để chạy Docker Compose trong production mà không có downtime? #
Docker Compose không có rolling update tích hợp. Các cách tiếp cận thực tế: (1) chấp nhận downtime ngắn trong docker compose up -d cho công cụ nội bộ, (2) sử dụng script blue/green deployment được hiển thị trong phần Sử Dụng Nâng Cao với hai project compose và reverse proxy, hoặc (3) migrate sang Kubernetes hoặc Nomad khi zero-downtime là yêu cầu bắt buộc.
Tôi có thể sử dụng Docker Compose với Podman không? #
Có, thông qua podman-compose cung cấp khả năng tương thích khoảng 90-95%. Podman cũng hỗ trợ Docker Compose v2 thông qua lớp tương thích Docker API. Tuy nhiên, một số tính năng nâng cao như depends_on với condition: service_healthy có thể hoạt động khác. Đối với các team cần container rootless, hãy test file compose cụ thể của bạn với Podman trước khi cam kết.
Làm thế nào để debug service không khởi động được? #
Bắt đầu với docker compose logs <service> để xem stderr/stdout. Nếu container thoát ngay lập tức, sử dụng docker compose run --rm <service> sh để lấy shell và kiểm tra môi trường. Đối với vấn đề phụ thuộc, kiểm tra docker compose ps để xác minh trạng thái health. Thêm depends_on với condition: service_healthy để khắc phục race condition giữa các service.
Docker Compose có miễn phí cho sử dụng thương mại không? #
Có. Docker Compose là mã nguồn mở theo giấy phép Apache-2.0 và miễn phí cho cả sử dụng cá nhân và thương mại. Docker Desktop (bao gồm Compose trên macOS và Windows) có hạn chế giấy phép cho tổ chức có 250+ nhân viên hoặc doanh thu $10M+, nhưng bản thân CLI plugin Compose không có hạn chế nào trên Linux.
Kết Luận #
Docker Compose vẫn là công cụ thực tế nhất cho việc triển khai đa container vào năm 2026. Nó biến các stack đa service phức tạp thành định nghĩa một file mà mọi developer có thể chạy, test và triển khai. Đối với môi trường phát triển, pipeline CI/CD và workload production trên một node, 37.393 GitHub stars phản ánh tính hữu ích hàng ngày thực tế——không phải sự cường điệu.
Hành động:
- Thay thế mọi lệnh
docker-compose(v1) còn sót lại bằngdocker compose(v2) - Xóa dòng
version:khỏi file compose và đổi tên thànhcompose.yaml - Thêm health check và
restart: unless-stoppedcho mọi service production - Thiết lập xoay vòng log trước khi đĩa đầy
- Đối với hosting, DigitalOcean cung cấp các droplet Docker được cấu hình sẵn giúp bạn từ con số không đến
docker compose uptrong vòng 5 phút, và HTStack cung cấp các phiên bản VPS được quản lý được tối ưu hóa cho workload container.
Tham gia nhóm Telegram của chúng tôi để chia sẻ cấu hình Docker Compose và nhận trợ giúp từ các developer khác.
Bài viết này chứa liên kết affiliate. Nếu bạn mua hosting qua các liên kết này, dibi8.com nhận được hoa hồng mà không phát sinh chi phí thêm cho bạn.
Hosting Và Hạ Tầng Được Đề Xuất #
Trước khi triển khai các công cụ trên vào production, bạn cần hạ tầng vững chắc. Hai lựa chọn dibi8 đang dùng:
- DigitalOcean — Credit miễn phí $200 trong 60 ngày, 14+ khu vực toàn cầu. Lựa chọn mặc định cho dev chạy AI tools open source.
- HTStack — VPS Hong Kong, độ trễ thấp khi truy cập từ Trung Quốc. Cùng IDC đang host dibi8.com.
Liên kết tiếp thị — không tăng chi phí của bạn, giúp dibi8.com hoạt động.
Nguồn & Tài Liệu Tham Khảo #
- Tài Liệu Chính Thức Docker Compose
- Tham Chiếu Đặc Tả Compose
- Kho GitHub Docker Compose
- Tài Liệu Traefik Docker Provider
- Hướng Dẫn Giám Sát Docker Prometheus
- Docker Compose vs Kubernetes — distr.sh
- So Sánh Podman vs Docker 2026
- Thực Hành Tốt Nhất Production Docker Compose
- Nomad vs Docker Compose — hostmycode.com
- Giá Cả & Giấy Phép Docker Desktop
💬 Bình luận & Thảo luận