Tập 16: Docker Compose - Ứng Dụng Nhiều Container
Trong tập trước, chúng ta đã khám phá Docker Networking và cách các container giao tiếp với nhau. Tuy nhiên, khi ứng dụng phát triển, việc quản lý nhiều container chỉ bằng lệnh docker run
sẽ trở nên phức tạp. Đây là lúc Docker Compose phát huy tác dụng.
🔹 Docker Compose là gì?
Docker Compose là một công cụ cho phép bạn định nghĩa và chạy các ứng dụng Docker với nhiều container. Thay vì khởi động từng container một cách thủ công, bạn sẽ định nghĩa các dịch vụ trong một tệp YAML duy nhất (docker-compose.yml
) và khởi động tất cả chỉ với một lệnh.
🔹 Tại sao nên sử dụng Docker Compose?
- Quản lý nhiều container dễ dàng.
- Định nghĩa mạng và volume ở một nơi.
- Thiết lập môi trường đồng nhất cho các nhóm.
- Một lệnh (
docker-compose up
) khởi động toàn bộ stack.
🔹 Cách cài đặt Docker Compose
Hầu hết các cài đặt Docker hiện đại đã bao gồm Docker Compose. Để kiểm tra:
docker compose version
Nếu chưa được cài đặt, hãy làm theo hướng dẫn cài đặt chính thức của Docker.
🔹 Ví dụ cơ bản về docker-compose.yml
Hãy cùng chạy một ứng dụng web đơn giản với Flask (Python) và Redis.
version: '3'
services:
web:
build: ./app
ports:
- "5000:5000"
depends_on:
- redis
redis:
image: redis:alpine
Trong đoạn mã này:
web
→ ứng dụng Flask của chúng ta (được xây dựng từ thư mục./app
).redis
→ một container Redis sử dụng hình ảnh chính thức.depends_on
→ đảm bảoredis
khởi động trướcweb
.
🔹 Chạy ứng dụng
Để khởi động ứng dụng:
docker compose up
Điều này sẽ khởi động cả hai container cùng lúc.
Để dừng ứng dụng:
docker compose down
🔹 Thêm Volumes & Networks
Bạn có thể định nghĩa lưu trữ vĩnh viễn và mạng tùy chỉnh:
version: '3'
services:
db:
image: postgres:alpine
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
Điều này đảm bảo dữ liệu của cơ sở dữ liệu không bị mất khi container khởi động lại.
🔹 Ví dụ Thực Tế
Một ứng dụng full-stack có thể bao gồm:
- Frontend (React/Next.js)
- Backend (Node.js, Django, Flask, v.v.)
- Database (Postgres, MongoDB, MySQL)
- Cache (Redis)
Tất cả đều được định nghĩa trong một tệp docker-compose.yml
duy nhất.
🔹 Các lệnh chính
docker compose up -d
→ khởi động ở chế độ tách biệt.docker compose down
→ dừng và xóa các container.docker compose logs -f
→ xem nhật ký.docker compose ps
→ liệt kê các dịch vụ đang chạy.
🔹 Thực hành tốt nhất
- Sử dụng tệp môi trường (
.env
) để quản lý bí mật. - Giữ các dịch vụ phân tách (tách biệt DB, cache, v.v.).
- Sử dụng volumes cho dữ liệu vĩnh viễn.
- Tránh việc cứng hóa thông tin xác thực trong
docker-compose.yml
.
🔹 Các cạm bẫy phổ biến
- Khó khăn trong việc quản lý phiên bản: Luôn đảm bảo rằng bạn đang sử dụng phiên bản Docker Compose tương thích với Docker.
- Quá tải container: Tránh khởi động quá nhiều container cùng lúc, có thể gây ra sự cố hiệu suất.
🔹 Mẹo Tối ưu Hiệu suất
- Sử dụng cache: Nếu bạn đang phát triển, hãy sử dụng cache để tăng tốc độ xây dựng.
- Quản lý tài nguyên: Theo dõi việc sử dụng tài nguyên của từng container để tối ưu hóa cấu hình.
🔹 Giải quyết sự cố
- Container không khởi động: Kiểm tra nhật ký của container để tìm hiểu nguyên nhân bằng lệnh
docker compose logs
. - Lỗi mạng: Đảm bảo rằng các dịch vụ có thể giao tiếp với nhau qua mạng đã định nghĩa.
✅ Trong tập tiếp theo, chúng ta sẽ khám phá Tập 17: Docker Volumes & Quản lý Dữ liệu Vĩnh Viễn — đảm bảo dữ liệu của bạn tồn tại sau khi container khởi động lại.
💡 Câu hỏi cho bạn: Bạn có muốn tôi tạo một ứng dụng đa dịch vụ thực tế với Docker Compose (ví dụ: Node.js + MongoDB + Redis) trong tập tiếp theo không?