Cơ chế lưu trữ dữ liệu bền vững trong Docker
Trong môi trường container, hệ thống tệp tin mặc định chỉ tồn tại tương ứng với vòng đời của container. Khi container bị xóa, mọi thay đổi sẽ mất vĩnh viễn. Để khắc phục vấn đề này, Docker cung cấp cơ chế gắn kết thư mục giữa máy chủ host và container, cho phép đồng bộ và bảo toàn dữ liệu độc lập với chu kỳ sống của container.
Phân loại phương thức gắn kết
Có hai cách tiếp cận chính khi sử dụng cờ -v hoặc --volume:
- Bind Mounts (Gắn kết đường dẫn tuyệt đối): Chỉ định trực tiếp đường dẫn trên máy host và đường dẫn bên trong container. Phương thức này ghi đè nội dung thư mục gốc của container tại điểm gắn kết.
- Named Volumes (Tên miền dữ liệu): Sử dụng tên biểu tượng do Docker quản lý. Docker sẽ tự động tạo và duy trì vùng lưu trữ này tại đường dẫn mặc định của hệ thống (thường là
/var/lib/docker/volumes/).
Thiết lập và Vận hành Named Volumes
Named volumes là lựa chọn tối ưu cho việc lưu trữ sản phẩm nhờ khả năng quản lý tập trung và tính bền vững cao. Quy trình làm việc thường bao gồm các bước sau:
1. Khởi tạo vùng lưu trữ
docker volume create repo_media_store
Lệnh trên khai báo một khối dữ liệu có tên. Nếu bỏ qua bước này, Docker sẽ tự động sinh volume khi lần đầu container yêu cầu.
2. Kiểm tra và Giám sát
# Liệt kê toàn bộ volume đang tồn tại
docker volume ls
# Xem cấu hình chi tiết của một volume cụ thể
docker volume inspect repo_media_store
3. Ánh xạ vào Container
Giả sử chúng ta triển khai một dịch vụ web sử dụng Nginx. Thay vì lưu trữ trực tiếp trong layer ảo, ta gắn volume vào thư mục gốc của web server:
docker run -d \
--name service-frontend-01 \
-p 8080:80 \
-v repo_media_store:/usr/share/nginx/html \
nginx:alpine
Khi container khởi động, Docker sẽ sao chép dữ liệu mặc định của image vào volume (nếu volume còn trống). Mọi chỉnh sửa sau đó được ghi trực tiếp vào vùng lưu trữ này.
4. Tính bền vững và Chia sẻ
Khác với bind mounts, named volumes không làm mất dữ liệu mặc định của image. Hơn nữa, nhiều container có thể đồng thời ánh xạ đến cùng một volume, tạo thành kiến trúc chia sẻ tài nguyên tập trung. Ngay cả khi container bị dừng hoặc xóa hẳn, dữ liệu trong volume vẫn nguyên vẹn trên hệ thống host.
Áp dụng Bind Mounts (Đường dẫn tuyệt đối)
Phương thức này phù hợp cho môi trường phát triển khi cần đồng bộ mã nguồn realtime. Cú pháp yêu cầu đường dẫn host trước, đường dẫn container sau:
docker run -d \
--name dev-nginx-node \
-p 3000:80 \
-v /home/user/projects/web_app:/var/www/app \
node:18-slim
Cần lưu ý đặc điểm quan trọng: nếu thư mục chỉ định trên host đã tồn tại và chứa file, toàn bộ nội dung của thư mục đích trong container sẽ bị ẩn đi. Điều này giúp developer tập trung vào code mà không bị ảnh hưởng bởi cấu trúc mặc định của image.
Vệ sinh và Giải phóng tài nguyên
Vì Docker không tự động xóa volume khi container kết thúc (để tránh mất dữ liệu), quản trị viên cần chủ động thu dọn nếu không còn nhu cầu sử dụng:
# Dừng và gỡ bỏ container
docker stop service-frontend-01
docker rm service-frontend-01
# Xóa vĩnh viễn vùng lưu trữ dữ liệu
docker volume rm repo_media_store
Nếu chỉ xóa container mà bỏ qua lệnh remove volume, tài nguyên disk sẽ tiếp tục chiếm dụng trên host. Việc kết hợp đúng quy trình quản lý vòng đời container và volume là yếu tố then chốt để tối ưu hiệu năng hệ thống.