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

HTTP/3 và QUIC là gì: giao thức web mới, nhanh hơn HTTP/2

HTTP/3 và QUIC là gì: giao thức web mới, nhanh hơn HTTP/2 HTTP/3 là phiên bản thứ ba của giao thức Hypertext Transfer Protocol — nền tảng trao đổi thông…

Xem thêm

Power amplifier là gì: công suất, hiệu suất và lớp khuếch đại

Power amplifier là gì: công suất, hiệu suất và lớp khuếch đại Power amplifier (tầng khuếch đại công suất) là thiết bị điện tử tăng công suất tín hiệu từ…

Xem thêm

Wi-Fi là gì: chuẩn IEEE 802.11, băng tần và các thế hệ mới

Wi-Fi là gì: chuẩn IEEE 802.11, băng tần và các thế hệ Wi-Fi là gì? Đây là tên thương mại do Wi-Fi Alliance đăng ký cho một họ sản phẩm…

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