FEBRUARY 04, 2026
·
5 PHÚT ĐỌC
·
HOÀNG DƯƠNG
·
EN 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ị 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
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 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 :
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 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
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
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 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
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 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 :
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 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
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. 😊