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. 😊