Docker Compose: Quản lý Multi-container Application
Bốn lệnh docker run riêng lẻ cho web server, database, Redis, queue worker thật rắc rối? Docker Compose định nghĩa services, networks, volumes trong một file YAML — một lệnh up là cả hệ thống chạy!
14 phút đọc•
Mục lục bài viết17
Bạn có biết?
Bạn đã chạy thành công Container đơn lẻ, nhưng giờ app của bạn có cả Web server, Database, Redis cache và Queue worker? Bạn phải chạy 4 câu lệnh docker run riêng biệt, nhớ port nào chạy ở đâu, network nào kết nối với nhau... thật rắc rối.
Docker Compose là công cụ giúp bạn định nghĩa và chạy nhiều Docker containers cùng lúc chỉ với một file YAML. Như một "dàn nhạc trưởng", Docker Compose phối hợp tất cả containers hoạt động cùng nhau một cách nhịp nhàng.
Docker Compose là gì?
Docker Compose cho phép bạn định nghĩa toàn bộ ứng dụng (services, networks, volumes) trong một file docker-compose.yml. Sau đó chỉ cần một lệnh để khởi động tất cả.
Các thành phần chính:
Services — Các containers riêng lẻ: web, database, redis...
Networks — Kết nối giữa các services
Volumes — Lưu trữ dữ liệu bền vững
Cài đặt Docker Compose
# Linux — Docker Engine đã bao gồm Compose plugin
docker compose version
# Nếu chưa có, cài riêngsudo apt update && sudo apt install docker-compose-plugin
# macOS / Windows — Docker Desktop đã bao gồm sẵn
💡 Lưu ý: Lệnh mới là docker compose (không gạch ngang). docker-compose (cũ) vẫn hoạt động nhưng không còn được cập nhật tính năng mới.
Bạn đã đi qua gần hết series Docker — giờ là lúc tổng hợp mọi kiến thức cho production! Checklist bảo mật, tối ưu hiệu năng, monitoring, chiến lược deploy và troubleshooting các lỗi thường gặp.
Quản lý container bằng tay trên nhiều server thật mệt mỏi? Docker Swarm biến nhiều host thành một cluster duy nhất — tự động phân phối, scale và tự phục hồi. Khởi tạo Swarm và deploy service.
Thay vì một tòa nhà khổng lồ, microservices xây mỗi chức năng một tòa nhà riêng — Docker là hệ thống đường xá kết nối chúng. Tìm hiểu microservices với Compose, API Gateway và Message Queue.
app — Dùng build: . để build từ Dockerfile trong thư mục hiện tại. Biến môi trường DB_HOST, REDIS_HOST trỏ tới tên service — Docker Compose tự động phân giải DNS.
db — MySQL 8.0 với volume riêng lưu dữ liệu lâu dài.
redis — Redis Alpine nhẹ, cũng có volume riêng.
depends_on — Đảm bảo db và redis khởi động trước app.
Docker Compose quản lý nhiều containers như một hệ thống thống nhất. Ảnh: Unsplash
💡 Luôn dùng .env cho các giá trị nhạy cảm và không commit file này lên Git. Thêm .env vào .gitignore.
Networks trong Docker Compose
Docker Compose tự động tạo một network mặc định khi chạy up. Tất cả services đều kết nối và giao tiếp được qua tên service. Nhưng bạn có thể định nghĩa network riêng để phân tách:
web — Truy cập từ internet (frontend) + gọi app (backend)
app + db — Chỉ nằm trong backend, không truy cập internet trực tiếp
web là "cổng vào" duy nhất từ bên ngoài — tăng bảo mật
docker-compose.override.yml
Docker Compose tự động merge các file docker-compose.yml với docker-compose.override.yml. Dùng file override để cấu hình môi trường phát triển:
# docker-compose.override.yml (PHÁT TRIỂN)services:app:build:context:.dockerfile:Dockerfile.devvolumes:-.:/appports:-"9229:9229"# debug portdb:ports:-"3306:3306"# expose DB khi dev
File này không nên có trên production, hoặc chạy với -f để chọn file cụ thể:
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
Profiles: Chạy services có chọn lọc
Từ Docker Compose 2.x, bạn có thể nhóm services bằng profiles:
depends_on: condition: service_healthy đảm bảo app chỉ chạy khi db thực sự sẵn sàng, không chỉ "đã khởi động".
Best Practices với Docker Compose
1. Luôn chỉ định version — version: '3.8' là phiên bản ổn định, hỗ trợ đầy đủ tính năng.
2. Dùng .env cho cấu hình — Không hardcode password, port, paths.
3. Phân tách services theo chức năng — Mỗi service chỉ làm một việc: web server, database, cache, worker... Không nhồi nhét nhiều process trong một container.
4. Set resource limits — Tránh một container ngốn hết tài nguyên hệ thống:
5. Dùng named volumes, không bind mount production — Named volumes do Docker quản lý, nhanh hơn và an toàn hơn bind mounts trên production.
6. Không chạy Compose như docker run — Đừng đặt mọi thứ vào command: dài dòng. Mỗi service nên có Dockerfile riêng, sạch sẽ, dễ maintain.
7. Sắp xếp services theo thứ tự dependencies — depends_on giúp kiểm soát thứ tự khởi động.
Docker Compose Cheatsheet
# Khởi động
docker compose up -d
# Xây dựng lại images và khởi động
docker compose up -d --build
# Dừng và giữ volumes
docker compose stop
# Dừng và xoá containers + networks
docker compose down
# Xoá cả volumes (⚠️ MẤT DỮ LIỆU)
docker compose down -v
# Xem logs realtime
docker compose logs -f --tail=50# Restart một service
docker compose restart app
# Scale service
docker compose up -d --scale worker=3# Kiểm tra cấu hình (có lỗi không)
docker compose config
Bước tiếp theo
Bạn đã nắm vững Docker Compose — công cụ quản lý multi-container application. Với Compose, bạn có thể dễ dàng chạy các hệ thống phức tạp gồm nhiều services với chỉ một câu lệnh duy nhất.
0 bình luận
Đang tải bình luận...
Để lại bình luận