Volumes & Data Persistence
Container ephemeral theo mặc định — bind mount vs named volume, khi nào dùng loại nào, quản lý dữ liệu database trong container.
Container mặc định là "phù du" (ephemeral) — mọi dữ liệu ghi vào lớp writable sẽ mất khi container bị xoá. Với database, code đang phát triển, hay model weight (khoá Fine-tuning), mất dữ liệu là điều không thể chấp nhận — hiểu đúng volume là điều kiện bắt buộc trước khi chạy bất kỳ stateful service nào trong Docker.
🎯 Mục tiêu học tập
- Giải thích được vì sao dữ liệu trong container mặc định bị mất khi container bị xoá
- Phân biệt Bind Mount và Named Volume, chọn đúng loại theo tình huống
- Quản lý vòng đời volume: tạo, liệt kê, backup, xoá
- Áp dụng đúng cho các tình huống thường gặp: database, code đang phát triển, cache
Vì sao Container là "Ephemeral"
Layer ghi-được (writable layer) của container chỉ tồn tại cùng vòng đời container đó — khi chạy
docker rm, toàn bộ thay đổi trong layer này biến mất vĩnh viễn. Điều này là chủ đích thiết
kế (container nên "vô trạng thái", dễ tạo mới/xoá bỏ/thay thế), nhưng với dữ liệu cần tồn tại lâu
dài (dữ liệu database, file upload người dùng), bạn phải chủ động "gắn" (mount) một vị trí lưu trữ nằm
ngoài vòng đời container.
Bind Mount vs Named Volume
| Đặc điểm | Bind Mount | Named Volume |
|---|---|---|
| Vị trí lưu trữ | Một đường dẫn cụ thể do bạn chỉ định trên máy host | Do Docker quản lý hoàn toàn, nằm trong vùng lưu trữ nội bộ của Docker |
| Dễ truy cập/chỉnh sửa trực tiếp từ host | Có — mở file bằng bất kỳ editor nào trên host | Khó hơn — cần qua Docker CLI hoặc container trung gian |
| Phù hợp cho | Code đang phát triển (hot-reload), file cấu hình | Dữ liệu database, dữ liệu production cần Docker quản lý vòng đời |
| Tính di động giữa các máy | Kém (phụ thuộc đường dẫn host cụ thể) | Tốt hơn (không phụ thuộc cấu trúc thư mục host) |
# Bind mount — gắn thư mục code hiện tại vào container để hot-reload lúc dev
docker run -v $(pwd):/app my-fastapi-image
# Named volume — Docker tự quản lý nơi lưu trữ, phù hợp cho dữ liệu Postgres
docker volume create pgdata
docker run -v pgdata:/var/lib/postgresql/data postgres:16
Quản lý vòng đời Volume
docker volume create pgdata # tạo volume
docker volume ls # liệt kê các volume
docker volume inspect pgdata # xem chi tiết (vị trí lưu trữ thật trên host)
docker volume rm pgdata # xoá volume (chỉ khi không container nào đang dùng)
docker volume prune # dọn dẹp các volume không còn container nào tham chiếu
docker
volume prune và docker system prune --volumes xoá vĩnh viễn dữ liệu trong các volume
không còn được container nào tham chiếu — luôn kiểm tra kỹ trước khi chạy trên máy có dữ liệu quan trọng,
đặc biệt là môi trường có dữ liệu chưa backup.
Áp dụng thực tế: Database, Code Dev, Cache
- Database (PostgreSQL/MySQL): luôn dùng named volume cho thư mục dữ liệu — đảm bảo dữ liệu sống sót qua việc xoá/tạo lại container (ví dụ khi đổi version image).
- Code đang phát triển: dùng bind mount để thay đổi code trên host phản ánh ngay vào container đang chạy (kết hợp với công cụ hot-reload của framework), tránh phải build lại image mỗi lần sửa code lúc dev.
- Cache/dữ liệu tạm (ví dụ cache pip/npm giữa các lần build): có thể dùng BuildKit cache mount (một loại mount đặc biệt chỉ tồn tại trong quá trình build, không nằm trong image cuối) để tăng tốc build lặp lại mà không phình kích thước image.
🏋️ Bài tập thực hành
Chạy 1 container PostgreSQL với named volume cho thư mục dữ liệu. Tạo 1 bảng và thêm vài dòng dữ liệu. Xoá container (docker rm, không xoá volume) và chạy lại 1 container Postgres mới gắn cùng volume đó — xác nhận dữ liệu vẫn còn nguyên. Sau đó thử lại nhưng KHÔNG dùng volume (chạy container không mount gì) để tự chứng kiến dữ liệu mất khi xoá container.
📚 Tài nguyên học tập
-
Docker — Storage overviewTổng quan các loại storage trong DockerDocs
-
Docker — VolumesTài liệu chi tiết Named VolumesDocs
-
Docker — Bind mountsTài liệu chi tiết Bind MountsDocs
✅ Tự đánh giá hoàn thành
- Giải thích được vì sao container mặc định mất dữ liệu khi bị xoá
- Chọn đúng Bind Mount hay Named Volume theo từng tình huống
- Thực hành thành công: dữ liệu Postgres sống sót qua việc xoá/tạo lại container
- Biết cách liệt kê, inspect, và dọn dẹp volume an toàn