0
0
Lập trình
Admin Team
Admin Teamtechmely

Tập 16: Docker Compose - Ứng Dụng Nhiều Container

Đăng vào 4 ngày trước

• 3 phút đọc

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:

Copy
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)Redis.

Copy
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ảo redis khởi động trước web.

🔹 Chạy ứng dụng

Để khởi động ứng dụng:

Copy
docker compose up

Điều này sẽ khởi động cả hai container cùng lúc.

Để dừng ứng dụng:

Copy
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:

Copy
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?

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào