
Docker Compose Là Gì?
Docker Compose là công cụ định nghĩa và chạy các ứng dụng Docker đa container thông qua một file YAML duy nhất. Thay vì gõ hàng chục lệnh docker run phức tạp, bạn chỉ cần khai báo services, networks, volumes trong docker-compose.yml và chạy docker compose up.

Tại Sao Nên Dùng Docker Compose?
- Khai báo thay vì mệnh lệnh: Cấu hình một lần, chạy mọi nơi.
- Quản lý phụ thuộc: Service A chỉ start sau khi Service B healthy.
- Môi trường nhất quán: Dev, staging, production dùng cùng file compose.
- Scale dễ dàng:
docker compose up --scale web=3nhân bản service ngay lập tức.
Cấu Trúc File docker-compose.yml
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
depends_on:
- api
networks:
- app-network
api:
build: ./backend
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/app
networks:
- app-network
db:
image: postgres:15-alpine
volumes:
- pgdata:/var/lib/postgresql/data
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
pgdata:
Các Lệnh Thường Dùng
| Lệnh | Chức Năng |
|---|---|
docker compose up -d |
Khởi chạy nền (detached) |
docker compose down |
Dừng và xóa container, network |
docker compose logs -f |
Xem log real-time |
docker compose ps |
Liệt kê container đang chạy |
docker compose exec api bash |
Vào shell container api |
docker compose build --no-cache |
Build lại image không dùng cache |

Best Practices Triển Khai Production
1. Tách File Cấu Hình Môi Trường
Dùng docker-compose.override.yml cho dev và docker-compose.prod.yml cho production:
# docker-compose.prod.yml
services:
web:
image: myapp/web:v1.2.3
restart: unless-stopped
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
2. Healthcheck Cho Mỗi Service
services:
api:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
3. Secrets Management
Không hardcode mật khẩu. Dùng secrets hoặc file .env (không commit):
services:
api:
env_file: .env.prod
secrets:
- db_password
secrets:
db_password:
file: ./secrets/db_password.txt
4. Logging Driver
services:
api:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"

Kịch Bản Thực Tế: Triển Khai Fullstack App
Giả sử bạn có ứng dụng React frontend, Node.js API, PostgreSQL database.
Bước 1: Dockerfile cho Mỗi Service
# frontend/Dockerfile
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
Bước 2: Compose File Hoàn Chỉnh
version: '3.8'
services:
frontend:
build: ./frontend
ports:
- "80:80"
depends_on:
- backend
backend:
build: ./backend
environment:
- NODE_ENV=production
- DB_HOST=db
depends_on:
db:
condition: service_healthy
db:
image: postgres:15-alpine
environment:
- POSTGRES_DB=myapp
- POSTGRES_USER=app
- POSTGRES_PASSWORD_FILE=/run/secrets/db_pass
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app -d myapp"]
interval: 10s
timeout: 5s
retries: 5
secrets:
- db_pass
volumes:
pgdata:
secrets:
db_pass:
file: ./secrets/db_pass.txt
Bước 3: Deploy
# Tạo secret
echo "supersecret" > secrets/db_pass.txt
# Deploy
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
Debugging Thường Gặp
- Port conflict: Kiểm tra
lsof -i :80, đổi port mapping. - Container exit ngay: Xem
docker compose logs service_name, thường do missing env hoặc command sai. - Volume permission: Trên Linux, container user (thường uid 1000) cần quyền ghi volume host.
- Network không resolve: Dùng service name làm hostname (VD:
postgresql://user:pass@db:5432/app).
Kết Luận
Docker Compose biến việc triển khai ứng dụng đa container từ “khoai nhất” thành quy trình chuẩn hóa, lặp lại được. Nắm vững compose file, healthcheck, secrets, override file là chìa khóa để chạy production ổn định. Hãy bắt đầu với một file docker-compose.yml đơn giản hôm nay, sau đó mở rộng dần theo nhu cầu dự án.
Nguồn tham khảo: Docker Compose Documentation, Compose Specification
