Vì sao dữ liệu biến mất khi container bị xoá và volume giải quyết việc đó như thế nào?
Đáp án mẫu
File của container nằm trong một writable layer mỏng đặt trên image chỉ đọc. Layer này thuộc về container, nên khi container bị xoá, layer cùng mọi thứ ghi vào đó đều bị xoá theo. Container được thiết kế để dùng rồi bỏ.
Volume là vùng lưu trữ do Docker quản lý, nằm ngoài layer của container. Bạn mount nó vào một đường dẫn trong container, nên dữ liệu ghi ở đó còn lại sau khi container bị xoá và có thể được mount vào container mới.
docker run -d --name db -v pgdata:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret postgres:17
docker rm -f db
docker run -d --name db -v pgdata:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret postgres:17 # the data is still there
Các lệnh hữu ích: docker volume ls, docker volume inspect pgdata và docker volume rm pgdata. Volume không có tên là anonymous, dễ bị thất lạc, nên hãy ưu tiên named volume.
Bất cứ thứ gì container phải giữ lại, như file database hay file upload, đều đặt trên volume hoặc trong một dịch vụ bên ngoài.
Container dùng xong là bỏ, nên dữ liệu phải nằm ở nơi khác.
Ý chính
- File của container nằm trong writable layer
- Xoá container sẽ xoá layer đó
- Volume nằm ngoài container và có thể mount lại
- Ưu tiên named volume hơn volume ẩn danh
Câu hỏi nối tiếp thường gặp
- docker rm và docker rm -v khác nhau như thế nào?
Lỗi thường gặp
- Chạy database không có volume và mất dữ liệu khi tạo lại
- Dùng docker compose down -v mà không biết nó xoá volume