

Docker Container có thể được tạo mới hoặc loại bỏ rất nhanh, nhưng dữ liệu như database, file người dùng hay dữ liệu ứng dụng thường cần được lưu giữ lâu dài. Docker Volume giúp tách dữ liệu khỏi vòng đời của container, nhờ đó dữ liệu vẫn có thể tồn tại và được sử dụng lại ngay cả khi container cũ đã bị xóa.
Docker Volume là cơ chế lưu trữ dữ liệu bền vững dành cho container, được Docker tạo và quản lý. Volume được mount vào filesystem của container tại một đường dẫn xác định để ứng dụng có thể đọc hoặc ghi dữ liệu.
Điểm khác biệt quan trọng là dữ liệu trong volume không thuộc writable layer của một container cụ thể. Vì vậy, volume có thể tiếp tục tồn tại sau khi container sử dụng nó bị xóa và sau đó được mount vào container khác.

Volume được lưu trong vùng storage mà Docker daemon quản lý.
Với Docker Engine trên Linux trong cấu hình thông thường, có thể kiểm tra Mountpoint bằng:
docker volume inspect app-dataKết quả có thể chứa đường dẫn tương tự:
/var/lib/docker/volumes/app-data/_dataNguồn ban đầu cũng đề cập /var/lib/docker/volumes là khu vực Docker sử dụng để quản lý volume trên Linux.
Tuy nhiên, không nên coi đây là thư mục để ứng dụng hoặc người quản trị trực tiếp chỉnh sửa dữ liệu.
Docker khuyến nghị tương tác với dữ liệu volume bằng cách mount volume vào container. Việc truy cập hoặc sửa trực tiếp vùng dữ liệu do Docker quản lý là hành vi không được hỗ trợ và có thể gây lỗi dữ liệu.
Với Docker Desktop, Docker daemon còn có thể chạy bên trong môi trường máy ảo, vì vậy không nên mặc định rằng /var/lib/docker/volumes là một thư mục có thể truy cập trực tiếp từ hệ điều hành desktop.
Tiêu chí | Named Volume | Anonymous Volume |
| Tên | Do người dùng đặt | Docker sinh tự động |
| Dễ nhận biết | Có | Khó hơn |
| Tái sử dụng | Dễ | Khó hơn |
| Quản lý | Thuận tiện | Dễ phát sinh volume dư thừa |
| Phù hợp | Database, persistent data | Mount tạm hoặc trường hợp không cần tham chiếu lại |
| Lifecycle | Đến khi được chủ động xóa | Có thể tồn tại sau container, ngoại trừ một số trường hợp như --rm |
Docker hiện hỗ trợ nhiều dạng storage mount, trong đó phổ biến nhất với dữ liệu ứng dụng là:
Trong phạm vi lưu trữ dữ liệu container, cần đặc biệt phân biệt Volume, Bind Mount và tmpfs.
Storage do Docker quản lý.
Phù hợp khi cần:

Bind Mount ánh xạ trực tiếp một file hoặc thư mục trên host vào container. Bind Mount đặc biệt hữu ích trong development khi source code trên host cần xuất hiện ngay trong container.
tmpfs lưu dữ liệu trong RAM của Docker host thay vì ghi xuống disk.
Dữ liệu không tồn tại lâu dài và sẽ mất khi container dừng hoặc restart. Vì vậy tmpfs phù hợp với:
tmpfs không phải giải pháp persistent storage.
Đây là hai khái niệm rất dễ bị nhầm lẫn.
Tiêu chí | Docker Volume | Bind Mount |
| Storage | Docker quản lý | Path do người dùng chọn trên host |
| Phụ thuộc host filesystem | Thấp hơn | Cao |
| Docker CLI quản lý | Có | Không theo mô hình Volume |
| Persistent | Có | Có |
| Host truy cập trực tiếp | Không phải mục tiêu chính | Có |
| Tái sử dụng | Dễ bằng tên volume | Phụ thuộc path |
| Use case | Database, persistent app data | Source code, config, file cần host truy cập |
Nguồn ban đầu nhận định Docker Volume “generally better I/O” so với Bind Mount. Cách diễn đạt này dễ gây hiểu nhầm.
Điểm chính xác hơn là Volume thường có lợi thế hiệu năng so với ghi dữ liệu trực tiếp vào writable container layer, vì không cần đi qua storage driver để quản lý union filesystem.
Không nên khẳng định Volume luôn nhanh hơn Bind Mount trong mọi môi trường. Hiệu năng thực tế còn phụ thuộc hệ điều hành, Docker Desktop/Engine, filesystem, loại storage và workload.
docker volume create my-dataNếu cần thêm label:
docker volume create \
--label environment=production \
my-dataLabel giúp phân loại và quản trị volume thuận tiện hơn. Nguồn gốc cũng đề xuất sử dụng naming và labeling rõ ràng khi quản lý nhiều volume.
docker volume lsdocker volume inspect my-dataCó thể kiểm tra:
docker run -d \
-v my-data:/app/data \
nginxCú pháp gồm:
volume-name:container-pathdocker run -d \
--mount type=volume,source=my-data,target=/app/data \
nginx--mount có cú pháp dài hơn nhưng rõ ràng hơn khi cần khai báo nhiều tùy chọn.
Docker cũng có thể tự tạo named volume nếu tên được chỉ định trong docker run nhưng volume đó chưa tồn tại.
Có thể sử dụng:
docker system df -vđể xem chi tiết dung lượng mà image, container và volume đang sử dụng.
docker volume rm my-dataDocker không cho xóa volume nếu volume vẫn đang được container sử dụng theo cách thông thường.
Có thể chạy:
docker volume pruneMột điểm quan trọng cần sửa so với nguồn gốc: docker volume prune không mặc định xóa tất cả named volume không sử dụng.
Theo Docker CLI hiện tại, mặc định lệnh trên chỉ dọn các anonymous local volume không được container nào tham chiếu.
Muốn bao gồm cả unused named volume:
docker volume prune --allhoặc:
docker volume prune -aCần kiểm tra kỹ dữ liệu trước khi thực hiện vì volume bị xóa có thể chứa dữ liệu không thể phục hồi nếu chưa backup.
Mặc định Docker thường sử dụng:
local
làm volume driver.
Volume driver quyết định cách và vị trí dữ liệu của volume được lưu trữ. Ngoài local storage, Docker có thể tích hợp các driver hoặc storage backend khác để hỗ trợ những kiến trúc như:
Điều này đặc biệt hữu ích khi persistent data cần tồn tại độc lập không chỉ với container mà còn với một Docker host cụ thể.
Nguồn gốc sử dụng flocker làm ví dụ volume driver. Ví dụ này không nên tiếp tục sử dụng trong một bài hướng dẫn Docker hiện tại; thay vào đó nên mô tả volume driver theo cơ chế chung hoặc sử dụng storage driver thực tế đang được hệ thống triển khai.
Một container có thể nhìn thấy volume nhưng không có quyền ghi vào thư mục được mount.
Nguyên nhân thường liên quan đến:
Không nên khắc phục một cách mặc định bằng chmod 777. Thay vào đó cần xác định user đang chạy application và gán ownership/permission phù hợp.
Ví dụ:
-v /home/user/data:/data
đây là Bind Mount.
Trong khi:
-v app-data:/data
là Named Volume.
Sự khác biệt nằm ở thành phần bên trái dấu :: một bên là host path, một bên là volume name.
Database, log hoặc dữ liệu người dùng có thể khiến volume tăng dung lượng liên tục.
Có thể kiểm tra bằng:
docker system df -v
và kết hợp chính sách retention, backup, monitoring phù hợp.
Volume không phải backup. Khi volume bị xóa hoặc storage bên dưới gặp sự cố, dữ liệu vẫn có thể mất.
Đối với production, cần có cơ chế:
Docker Volume phù hợp khi dữ liệu được container tạo hoặc sử dụng nhưng cần tồn tại độc lập với container.
Các use case phổ biến gồm:

Không. Volume vẫn tồn tại. Trên thực tế, writable layer của chính container cũng không bị xóa chỉ vì container bị stop. Sự khác biệt quan trọng của volume thể hiện rõ khi container bị remove.
Thông thường không. Volume có lifecycle tách biệt và cần được xóa riêng. Anonymous volume có một số ngoại lệ khi sử dụng docker run --rm.
Docker daemon quản lý vị trí lưu trữ volume. Với Docker Engine trên Linux, Mountpoint thường có thể nằm dưới /var/lib/docker/volumes/, nhưng không nên trực tiếp chỉnh sửa dữ liệu tại đây.
Volume được Docker quản lý, còn Bind Mount ánh xạ trực tiếp một đường dẫn trên host vào container. Volume phù hợp hơn cho persistent application data; Bind Mount hữu ích khi host cũng cần trực tiếp truy cập các file.
Có. Tuy nhiên, khả năng nhiều container đọc hoặc ghi dữ liệu đồng thời còn phụ thuộc application, filesystem và volume driver.
Không. Volume cung cấp persistence, còn backup tạo bản sao dữ liệu để phục hồi khi dữ liệu gốc bị mất, hỏng hoặc bị xóa.
Docker Volume giúp lưu trữ dữ liệu độc lập với vòng đời của container, đặc biệt hữu ích với database, dữ liệu ứng dụng và những workload cần persistent storage. Volume được Docker quản lý, có thể tạo, mount, kiểm tra, tái sử dụng và xóa bằng Docker CLI hoặc cấu hình trực tiếp trong Docker Compose.
Khi triển khai thực tế, cần phân biệt rõ Volume với Bind Mount và tmpfs, ưu tiên Named Volume cho dữ liệu cần quản lý lâu dài, đồng thời kết hợp backup, giám sát dung lượng và kiểm soát quyền truy cập.
