Quản lý dữ liệu bền vững với Docker Volumes và Bind Mounts
Hướng dẫn Docker Volumes và Bind Mounts với cú pháp --mount, lifecycle, permissions, backup/restore, Docker Compose, bảo mật và các lỗi phổ biến.
ShanverseCập nhật 8 phút đọc— lượt xemĐang tải lượt xem
Docker
Deployment
Vì sao Container cần storage bên ngoài?
Container được thiết kế để có thể thay thế:
Mermaid
Loading diagram…
Nếu database ghi vào writable layer, dữ liệu có thể biến mất khi Container bị remove. Docker cung cấp ba kiểu mount chính:
Named/anonymous Volume: Docker quản lý vị trí lưu.
Bind Mount: ánh xạ trực tiếp đường dẫn host.
tmpfs Mount: dữ liệu trong memory, không bền vững.
Volume và Bind Mount khác nhau thế nào?
Quy tắc nhanh:
Bình luận
Dữ liệu ứng dụng cần persistence → ưu tiên named Volume.
Source code/config cần sửa trực tiếp từ host → dùng Bind Mount.
Secret/temp data không cần lưu xuống disk → cân nhắc tmpfs.
Tạo và dùng Named Volume
Mount vào PostgreSQL:
Xóa rồi tạo lại Container:
Dữ liệu vẫn nằm trong postgres-data.
--mount và -v
Hai cách sau gần tương đương:
--mount dài hơn nhưng rõ từng trường và dễ review. Với Bind Mount, nó cũng thường báo lỗi nếu source path không tồn tại, thay vì có hành vi tạo directory ngoài ý muốn như một số trường hợp dùng -v.
Named Volume và Anonymous Volume
Named Volume:
Anonymous Volume:
Anonymous Volume nhận tên/ID tự sinh và dễ bị bỏ quên. Dùng named Volume cho dữ liệu cần quản lý rõ ràng.
Liệt kê Volume không còn Container tham chiếu:
Dọn Volume không dùng:
Đây là thao tác phá hủy. Luôn kiểm tra backup và danh sách trước khi xác nhận.
Bind Mount cho development
Mount source code hiện tại:
Thay đổi file trên host xuất hiện ngay trong Container. Điều này phù hợp cho:
Hot reload.
Chạy test trong runtime chuẩn hóa.
Mount config local.
Tooling cần thao tác repository.
Bind Mount phụ thuộc đường dẫn host và không phù hợp để đóng gói deployment portable.
Read-only Mount
Không cho Container sửa source/config:
Volume read-only:
Read-only giảm khả năng sửa nhầm nhưng không thay thế permission, user non-root và các lớp bảo mật khác.
Mount che nội dung có sẵn trong Image
Nếu Image có file tại /app, mount vào cùng target sẽ che nội dung đó trong Container:
File trong Image chưa bị xóa; nó chỉ bị mount che. Đây là nguyên nhân phổ biến khiến node_modules hoặc artifact build “biến mất”.
Một pattern development:
Cần hiểu dependency nằm ở đâu để tránh khác biệt host/container.
Quyền file: UID, GID và ownership
Container dùng UID/GID của Linux. User node trong Container có thể không trùng user trên host, dẫn tới:
Kiểm tra:
Giải pháp tùy môi trường:
Chạy process bằng UID/GID phù hợp.
chown directory ở bước khởi tạo có kiểm soát.
Thiết lập ownership đúng trong Image.
Không dùng chmod 777 như cách chữa mặc định.
Ví dụ development:
Image/process phải hỗ trợ UID được truyền vào.
Docker Desktop và hiệu năng
Trên macOS/Windows, Docker thường chạy trong Linux VM. Bind Mount qua ranh giới host–VM có thể chậm hơn native Linux, đặc biệt với nhiều file nhỏ như node_modules.
Tối ưu thường gặp:
Giữ dependency/cache trong named Volume.
Chỉ mount directory cần chỉnh sửa.
Dùng .dockerignore cho build context.
Đo hiệu năng thay vì áp dụng mẹo máy móc.
Hành vi path, permission và file watching có thể khác giữa OS; CI giúp phát hiện khác biệt.
Volume với Docker Compose
Compose tạo tên Volume theo project theo mặc định. Kiểm tra tên thật:
docker compose down thường giữ named volumes. Lệnh sau xóa cả Volume của project:
Backup và Restore Volume
Volume không phải backup. Nó vẫn có thể hỏng, bị xóa hoặc mất cùng host.
Ví dụ backup file-level cho dữ liệu phù hợp:
Restore vào Volume mới:
Với database đang chạy, copy file thô có thể không nhất quán. Ưu tiên database-native backup như pg_dump, snapshot có quiesce, hoặc dịch vụ backup hỗ trợ consistency. Luôn thử restore định kỳ.
tmpfs cho dữ liệu tạm
Dữ liệu không được persist sau khi Container dừng và tiêu thụ memory. Phù hợp cho một số temporary data nhạy cảm, nhưng vẫn cần kiểm soát quyền và giới hạn tài nguyên.
Bảo mật Bind Mount
Bind Mount có thể cho process trong Container sửa filesystem host:
Mount rộng như trên có rủi ro rất cao. Nguyên tắc:
Chỉ mount directory tối thiểu.
Dùng readonly khi có thể.
Không mount Docker socket tùy tiện.
Chạy non-root.
Không mount home directory hoặc credential store nếu không cần.
Chỉ chạy Image đáng tin cậy.
Mount /var/run/docker.sock thường trao quyền điều khiển Docker host ở mức rất cao; coi đây là quyền đặc biệt, không phải socket bình thường.
Debug Mount
Xem mount của Container:
Hoặc:
Kiểm tra bên trong:
Checklist khi dữ liệu “mất”:
Container có mount đúng target không?
Có tạo nhầm anonymous Volume không?
Compose project name có đổi không?
Bind source path có đúng absolute path không?
Mount có che file trong Image không?
Process có ghi sang directory khác không?
UID/GID có quyền đọc/ghi không?
Có chạy down -v, prune hoặc rm -v không?
Anti-patterns phổ biến
Lưu database trong writable layer
Container bị xóa là dữ liệu mất. Dùng Volume hoặc managed database.
Dùng Bind Mount production phụ thuộc path local
Deployment trở nên khó tái hiện. Ưu tiên Volume, storage driver hoặc dịch vụ storage phù hợp.
Nghĩ Volume tự backup
Persistence và backup là hai bài toán khác nhau.
chmod 777 để sửa permission
Cách này mở quyền quá rộng và che giấu sai UID/GID.
Xóa Volume bằng prune không kiểm tra
Dangling không có nghĩa dữ liệu vô giá trị.
Checklist production
Mọi dữ liệu cần persistence đã nằm ngoài writable layer.
Named Volume/storage được đặt tên rõ ràng.
Mount chỉ bao phủ path tối thiểu.
Read-only được dùng khi có thể.
UID/GID và ownership đã kiểm thử.
Không mount Docker socket nếu không thật sự cần.
Backup tự động và restore test hoạt động.
Database có chiến lược consistency riêng.
Disk capacity, inode và I/O được monitor.
Encryption và access control phù hợp.
Quy trình prune/down có guardrail.
Tổng kết
Volume phù hợp cho dữ liệu ứng dụng cần tồn tại độc lập với Container.
Bind Mount phù hợp khi Container cần đọc/sửa file cụ thể trên host, nhất là development.
tmpfs dành cho dữ liệu tạm không cần persist.
Mount có thể che file sẵn có trong Image.
Permission phụ thuộc UID/GID, không chỉ tên user.
Persistence không đồng nghĩa backup.
Mục lục(23)
Codeplain text
1Permission denied2File do root sở hữu trên host3Application không ghi được vào Volume
Hướng dẫn tự động deploy ứng dụng Docker lên VPS Ubuntu và cloud providers bằng GitHub Actions: AWS ECS/App Runner/EC2, Vercel, Render, secrets, healthcheck, rollback và zero-downtime strategy.
Hướng dẫn Docker Networks toàn diện: bridge, host, none, overlay, service discovery, port publishing, Compose network segmentation, internal networks, bảo mật và debug kết nối.