Docker for Backend & AI Engineers
Trang chủ / Module 3
💾 Module 3 / 12 · 4-5 ngày

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.

VolumesBind MountStorage
📌 Vì sao module này quan trọng

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ểmBind MountNamed Volume
Vị trí lưu trữMột đường dẫn cụ thể do bạn chỉ định trên máy hostDo 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ừ hostCó — mở file bằng bất kỳ editor nào trên hostKhó hơn — cần qua Docker CLI hoặc container trung gian
Phù hợp choCode đang phát triển (hot-reload), file cấu hìnhDữ 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áyKé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
⚠️ Lệnh nguy hiểm cần cẩn trọng

docker volume prunedocker 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

PostgreSQL bền vững qua Volume

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

✅ 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