Featured image of post Docker Compose cho người mới (v2) — Thực hành

Docker Compose cho người mới (v2) — Thực hành

Hướng dẫn Docker Compose v2 từ cơ bản với các best practices và ví dụ thực tế cho người mới bắt đầu.

Docker Compose v2 - Công cụ quản lý multi-container

Docker Compose là công cụ giúp bạn định nghĩa và chạy nhiều container cùng lúc thông qua file YAML. Phiên bản v2 mang đến nhiều cải tiến về hiệu suất và tính năng mới.


I. Cài đặt và chuẩn bị

1. Kiểm tra phiên bản Docker Compose

1
2
3
4
5
# Kiểm tra phiên bản hiện tại
docker compose version

# Output mong muốn (v2.x.x)
Docker Compose version v2.24.5

2. Cấu trúc project cơ bản

1
2
3
4
5
6
7
8
my-app/
├── docker-compose.yml
├── .env
├── app/
│   ├── Dockerfile
│   └── src/
└── nginx/
    └── nginx.conf

II. Cú pháp Docker Compose v2

1. File docker-compose.yml cơ bản

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: "3.8"

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development
    volumes:
      - .:/app
      - /app/node_modules
    depends_on:
      - db

  db:
    image: postgres:15
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

volumes:
  postgres_data:

2. Sử dụng file .env

1
2
3
4
5
6
7
# .env file
NODE_ENV=development
DB_HOST=db
DB_PORT=5432
DB_NAME=myapp
DB_USER=user
DB_PASSWORD=password
1
2
3
4
5
6
7
# docker-compose.yml
services:
  web:
    environment:
      - NODE_ENV=${NODE_ENV}
      - DB_HOST=${DB_HOST}
      - DB_PORT=${DB_PORT}

III. Best Practices cho Docker Compose v2

1. Quản lý Networks

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
version: "3.8"

services:
  frontend:
    build: ./frontend
    networks:
      - frontend-network

  backend:
    build: ./backend
    networks:
      - frontend-network
      - backend-network

  database:
    image: postgres:15
    networks:
      - backend-network

networks:
  frontend-network:
    driver: bridge
  backend-network:
    driver: bridge

2. Health Checks

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
services:
  web:
    build: .
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

  db:
    image: postgres:15
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
      interval: 10s
      timeout: 5s
      retries: 5

3. Resource Limits

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
services:
  web:
    build: .
    deploy:
      resources:
        limits:
          cpus: "0.5"
          memory: 512M
        reservations:
          cpus: "0.25"
          memory: 256M

IV. Các lệnh Docker Compose v2 thường dùng

1. Lệnh cơ bản

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# Khởi chạy services (detached mode)
docker compose up -d

# Xem logs
docker compose logs -f

# Dừng services
docker compose down

# Rebuild và restart
docker compose up --build -d

# Xem trạng thái services
docker compose ps

2. Lệnh nâng cao

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Chạy lệnh trong container
docker compose exec web bash

# Scale service
docker compose up --scale web=3 -d

# Xem resource usage
docker compose top

# Validate compose file
docker compose config

V. Ví dụ thực tế: Web App với Database

1. Node.js + PostgreSQL + Redis

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
version: "3.8"

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development
      - DATABASE_URL=postgresql://user:password@db:5432/myapp
      - REDIS_URL=redis://redis:6379
    volumes:
      - .:/app
      - /app/node_modules
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
    restart: unless-stopped

  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user"]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data
    restart: unless-stopped

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - app
    restart: unless-stopped

volumes:
  postgres_data:
  redis_data:

2. File nginx.conf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
events {
    worker_connections 1024;
}

http {
    upstream app {
        server app:3000;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://app;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

VI. Override và Multiple Environments

1. docker-compose.override.yml

1
2
3
4
5
6
7
8
9
# docker-compose.override.yml (tự động load)
version: "3.8"

services:
  app:
    volumes:
      - .:/app
    environment:
      - DEBUG=true

2. Environment-specific files

1
2
3
4
5
# Development
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d

# Production
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# docker-compose.prod.yml
version: "3.8"

services:
  app:
    restart: always
    deploy:
      resources:
        limits:
          memory: 1G
    environment:
      - NODE_ENV=production

Ghi chú triển khai

  • Khi áp dụng vào dự án của bạn, hãy lưu ý các điểm quan trọng:
    • Luôn sử dụng .env file cho sensitive data
    • Implement health checks cho critical services
    • Sử dụng named volumes cho persistent data
    • Cấu hình restart policies phù hợp
  • Best practices:
    • Tách biệt networks cho security
    • Sử dụng specific image tags thay vì latest
    • Implement proper logging strategy
  • Troubleshooting:
    • Sử dụng docker compose logs để debug
    • Kiểm tra docker compose config trước khi deploy
    • Monitor resource usage với docker compose top

🎯 Lời kết

Docker Compose v2 là công cụ mạnh mẽ giúp bạn quản lý multi-container applications một cách dễ dàng. Với các best practices trên, bạn có thể xây dựng và triển khai ứng dụng một cách chuyên nghiệp và hiệu quả! 🚀

Hãy thử nghiệm với các ví dụ trên và dần dần áp dụng vào dự án thực tế của bạn. 😊