Docker cho Database: MySQL, PostgreSQL, Redis
Bạn có biết?
Bạn có biết rằng việc chạy database trong Docker giống như có một tủ lạnh chuyên dụng cho từng loại thực phẩm vậy? MySQL như ngăn đông lạnh, PostgreSQL như ngăn mát, còn Redis như ngăn đá khô. Mỗi container database được setup chỉ trong vài giây, bạn chỉ cần gõ lệnh là có ngay một database sẵn sàng sử dụng.
MySQL
Chạy MySQL Container
docker run -d --name mysql-db \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=mydb \
-e MYSQL_USER=app \
-e MYSQL_PASSWORD=apppass \
-p 3306:3306 \
-v mysql-data:/var/lib/mysql \
mysql:8
Kết nối
docker exec -it mysql-db mysql -u root -p
- Connection: localhost:3306
Environment variables quan trọng
- MYSQL_ROOT_PASSWORD — password cho user root (bắt buộc)
- MYSQL_DATABASE — tự động tạo database khi khởi động
- MYSQL_USER / MYSQL_PASSWORD — tạo user thường
PostgreSQL
Chạy PostgreSQL Container
docker run -d --name postgres-db \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=mydb \
-e POSTGRES_USER=app \
-p 5432:5432 \
-v postgres-data:/var/lib/postgresql/data \
postgres:15
Kết nối
docker exec -it postgres-db psql -U app -d mydb
- Connection: localhost:5432
Environment variables quan trọng
- POSTGRES_PASSWORD — password cho user postgres (bắt buộc)
- POSTGRES_DB — tạo database mặc định
- POSTGRES_USER — tạo user thường
Redis
Chạy Redis Container
docker run -d --name redis-cache \
-p 6379:6379 \
-v redis-data:/data \
redis:7
Redis với password
docker run -d --name redis-cache \
-e REDIS_PASSWORD=secret \
-p 6379:6379 \
redis:7
Kết nối
docker exec -it redis-cache redis-cli
redis-cli -a secret
- Connection: localhost:6379
- Port mặc định: 6379
Persistence
Redis hỗ trợ hai mode lưu trữ:
- RDB — Snapshot định kỳ
- AOF — Append-only file (an toàn hơn)
Dùng image redis:7-alpine để tiết kiệm dung lượng.
Docker Compose cho Full Stack
Đây là file Docker Compose để chạy cả MySQL, PostgreSQL và Redis cùng lúc:
version: "3.8"
services:
mysql:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: mydb
volumes:
- mysql-data:/var/lib/mysql
networks:
- db-network
postgres:
image: postgres:15
environment:
POSTGRES_PASSWORD: secret
POSTGRES_DB: mydb
volumes:
- postgres-data:/var/lib/postgresql/data
networks:
- db-network
redis:
image: redis:7
networks:
- db-network
volumes:
mysql-data:
postgres-data:
networks:
db-network:
driver: bridge
Best Practices cho Database
1. Dùng volumes cho data
KHÔNG lưu data trong container layer. Dùng named volumes để data tồn tại sau khi xóa container:
-v mysql-data:/var/lib/mysql
2. Không dùng :latest
Luôn chỉ định version cụ thể để đảm bảo tính nhất quán:
mysql:8postgres:15redis:7
3. Health checks
Thêm healthcheck vào docker-compose.yml để Docker giám sát trạng thái database:
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
4. Backup strategy
Tạo script backup tự động lưu data ra ngoài container. Đặt backup folder ở host hoặc mount từ cloud storage.
5. Security
- Đặt strong passwords, không dùng password đơn giản
- Với production, dùng Docker Secrets để quản lý password an toàn
- Hạn chế quyền truy cập qua network
So sánh nhanh
| Database | Port mặc định | Image phổ biến | Use case |
|---|---|---|---|
| MySQL | 3306 | mysql:8 | Web apps truyền thống |
| PostgreSQL | 5432 | postgres:15 | Enterprise, analytics |
| Redis | 6379 | redis:7 | Cache, session |
Bước tiếp theo
Tiếp theo, bạn sẽ tìm hiểu cách sử dụng Docker trong CI/CD Pipeline để tự động hóa quy trình build và deploy ứng dụng.