Bạn có biết? Bạn chạy một ứng dụng database trong Docker container, lưu dữ liệu vài tuần. Một ngày đẹp trời, bạn restart container — toàn bộ dữ liệu biến mất! Tại sao? Vì mặc định, dữ liệu trong container chỉ tồn tại khi container sống. Container dừng = dữ liệu mất.
Đây chính là lý do bạn cần Docker Volume — cơ chế lưu trữ dữ liệu bền vững, tồn tại độc lập với vòng đời container.
Docker Volume là gì?
Docker Volume là vùng lưu trữ dữ liệu được quản lý bởi Docker, tồn tại bên ngoài lớp filesystem của container. Ngay cả khi container bị xóa, dữ liệu trong volume vẫn an toàn.
- ✅ Dữ liệu không mất khi container dừng hoặc bị xóa
- ✅ Chia sẻ dữ liệu giữa nhiều container dễ dàng
- ✅ Hiệu năng tốt hơn bind mount trên Linux
- ✅ Được Docker quản lý — backup, migrate đơn giản
- ✅ Hỗ trợ nhiều driver: local, NFS, CIFS, cloud storage
Các loại lưu trữ trong Docker
1. Named Volume (Khối lượng đặt tên)
Loại phổ biến nhất. Docker quản lý hoàn toàn — bạn chỉ cần đặt tên.
# Tạo volume
docker volume create my-data
# Sử dụng volume
docker run -d --name my-app -v my-data:/app/data nginx
2. Bind Mount (Gắn kết thư mục)
Ánh xạ trực tiếp thư mục từ host vào container. Phổ biến trong môi trường development.
# Gắn thư mục host vào container
docker run -d --name my-app -v /home/user/project:/app nginx
3. tmpfs Mount
Lưu dữ liệu trong bộ nhớ RAM — biến mất khi container dừng. Dùng cho dữ liệu nhạy cảm như session, token.
# Lưu dữ liệu trong RAM
docker run -d --tmpfs /app/cache nginx
Các lệnh Docker Volume cơ bản
docker volume create
# Tạo volume mới
docker volume create my-data
# Tạo volume với driver cụ thể
docker volume create --driver local my-data
docker volume ls
# Liệt kê tất cả volume
docker volume ls
# Lọc volume theo tên
docker volume ls -f name=my-
docker volume inspect
# Xem chi tiết volume
docker volume inspect my-data
docker volume rm / prune
# Xóa volume cụ thể
docker volume rm my-data
# Xóa tất cả volume không sử dụng
docker volume prune
Use Cases thực tế
1. Lưu trữ Database
# PostgreSQL với volume
docker run -d --name postgres-db \
-v pgdata:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres:16
# Dữ liệu tồn tại ngay cả khi container bị xóa
docker rm -f postgres-db
docker run -d --name postgres-db \
-v pgdata:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
postgres:16
# Dữ liệu vẫn còn!
2. Chia sẻ dữ liệu giữa Containers
# Container 1: Ghi dữ liệu
docker run -d --name writer -v shared-data:/data alpine \
sh -c "echo 'Hello from writer' > /data/message.txt"
# Container 2: Đọc dữ liệu
docker run --rm -v shared-data:/data alpine cat /data/message.txt
# Output: Hello from writer
3. Development với Hot Reload
# Gắn thư mục source code — thay đổi trên host → container thấy ngay
docker run -d --name node-app \
-v $(pwd):/app \
-p 3000:3000 \
node:20-alpine
Bảng so sánh: Named Volume vs Bind Mount vs tmpfs
| Tiêu chí | Named Volume | Bind Mount | tmpfs |
|---|---|---|---|
| Vị trí | Docker quản lý | Thư mục trên host | Bộ nhớ RAM |
| Trường tồn | Có | Có | Không |
| Hiệu năng | Tốt nhất | Tốt | Nhanh nhất |
| Backup | Dễ (Docker CLI) | Trung bình | Không thể |
| Use case | Production | Development | Dữ liệu tạm |
Best Practices
- Dùng Named Volume cho production — Docker quản lý tốt hơn, dễ backup và migrate
- Dùng Bind Mount cho development — sửa code trên host, container thấy ngay
- Đặt tên rõ ràng — postgres-data thay vì vol1
- Backup thường xuyên — dùng docker run để tar dữ liệu ra host
- Không dùng root trong container — tránh vấn đề permission với bind mount
- Dùng .dockerignore — tránh bind mount những file không cần thiết
- Giám sát dung lượng — docker system df -v để kiểm tra
Bước tiếp theo
👉 Bài tiếp theo: Docker Network: Kết nối các Container
Trong bài tiếp theo, chúng ta sẽ tìm hiểu cách các container giao tiếp với nhau qua mạng, các loại network trong Docker, và cách expose port ra bên ngoài. Hẹn gặp lại!