Docker Compose: Hướng Dẫn Triển Khai Ứng Dụng Đa Container

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.

Sơ đồ kiến trúc Docker Compose với các container service

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=3 nhâ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

Terminal chạy các lệnh Docker Compose

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"

So sánh cấu hình Docker Compose dev và production

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

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

PCIe 6.0: Tăng Băng Thông Gấp Đôi Với PAM4 Cho AI Và HPC

PCI Express 6.0 (PCIe 6.0) được PCI-SIG công bố chính thức tháng 1/2022, đạt tốc độ raw 64 GT/s — gấp đôi PCIe 5.0 (32 GT/s) và gấp 4 lần…

Xem thêm
Thunderbolt 3 interface USB-C ports trên Macbook

Thunderbolt 5 là gì? Cảnh breakthrough 80Gbps của Intel cho tương lai kết nối

Thunderbolt 5 là gì? Thunderbolt 5 là chuẩn kết nối I/O tiếp theo của Intel, ra mắt Q3/2024, cung cấp tốc độ chuỗi 80 Gbps (gấp đôi Thunderbolt 4) và…

Xem thêm

Framework Laptop 13 AMD: Module Thay Thế Linh Hoạt Nhất Thị Trường

Framework Laptop 13 AMD: Module Thay Thế Linh Hoạt Nhất Thị Trường Framework Laptop 13 (phiên bản AMD Ryzen AI 300 series, ra mắt tháng 2/2025) là biểu tượng của…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất