Docker Volume & NFS: Giải pháp ‘cứu cánh’ cho dữ liệu Multi-Host

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

Quick Start: Mount nhanh Volume NFS trong 5 phút

Muốn chia sẻ dữ liệu giữa các máy chủ mà không cần cài thêm plugin bên thứ ba? Bạn có thể tận dụng ngay driver local có sẵn của Docker. Dưới đây là mẫu docker-compose.yml để bạn triển khai ngay lập tức.

version: "3.8"

services:
  web:
    image: nginx:alpine
    volumes:
      - nfs_data:/usr/share/nginx/html

volumes:
  nfs_data:
    driver: local
    driver_opts:
      type: nfs
      o: "addr=192.168.1.100,nolock,soft,rw,nfsvers=4"
      device: ":/mnt/shared_folder"

Lưu ý các thông số quan trọng:

  • addr=192.168.1.100: Địa chỉ IP tĩnh của máy chủ NFS.
  • device: ":/mnt/shared_folder": Đường dẫn tuyệt đối đến thư mục đã share.
  • nfsvers=4: Ép Docker dùng phiên bản NFSv4 để tăng tính ổn định và bảo mật.

Tại sao lại dùng NFS? Bài học từ sự cố “bay màu” 50GB dữ liệu

Hồi mới triển khai Docker Swarm cho một dự án thương mại điện tử, mình từng hí hửng chạy cụm 3 nodes. Mọi thứ vận hành trơn tru cho đến khi một node vật lý bị sập nguồn đột ngột. Docker tự động đẩy container sang node khác nhưng toàn bộ 50GB ảnh sản phẩm biến mất sạch. Lý do đơn giản: dữ liệu đang nằm ở ổ cứng cục bộ của node cũ.

Sai lầm này giúp mình rút ra bài học: Local Volume chính là rào cản lớn nhất của tính sẵn sàng cao (High Availability).

Để dữ liệu có thể “nhảy” theo container, bạn cần một bộ lưu trữ tập trung. Thay vì chọn các hệ thống phức tạp như GlusterFS hay Ceph vốn tốn nhiều RAM, NFS vẫn là lựa chọn hàng đầu cho các dự án vừa và nhỏ. Nó nhẹ, dễ cài và đáp ứng tốt khoảng 80% nhu cầu lưu trữ file thông thường.

Các bước triển khai thực tế

Bước 1: Thiết lập NFS Server (Máy chủ lưu trữ)

Hãy chọn một máy chủ có ổ cứng dư dả để làm nơi chứa data. Trên Ubuntu, bạn thực hiện cài đặt môi trường như sau:

sudo apt update && sudo apt install nfs-kernel-server -y

# Tạo không gian lưu trữ
sudo mkdir -p /mnt/docker_share
sudo chown nobody:nogroup /mnt/docker_share
sudo chmod 777 /mnt/docker_share

Mở file /etc/exports và thêm dòng cấu hình sau để cấp quyền cho các máy con (Nodes):

/mnt/docker_share 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)

Chạy lệnh sudo exportfs -a để áp dụng cấu hình mới mà không cần khởi động lại toàn bộ server.

Bước 2: Chuẩn bị cho các Docker Nodes (NFS Client)

Đây là lỗi “vỡ lòng” khiến nhiều bạn loay hoay cả ngày. Docker sẽ báo lỗi “protocol not supported” nếu máy host thiếu thư viện điều khiển NFS.

Bạn bắt buộc phải cài gói nfs-common trên mọi node tham gia vào cụm Docker:

sudo apt update && sudo apt install nfs-common -y

Bước 3: Triển khai thực tế với Docker Swarm

Trong môi trường Swarm, NFS giúp container duy trì trạng thái dữ liệu dù nó được schedule ở bất kỳ đâu. Đây là cách mình cấu hình cho một cụm WordPress cần chia sẻ thư mục wp-content:

volumes:
  wp_uploads:
    driver: local
    driver_opts:
      type: nfs
      o: "addr=10.0.0.50,nolock,soft,rw"
      device: ":/mnt/nfs/wp_data"

Kinh nghiệm tối ưu và Xử lý lỗi

1. Giải quyết bài toán Permission (Quyền hạn)

NFS thường gặp rắc rối khi UID (User ID) giữa máy khách và máy chủ không khớp nhau. Nếu container chạy web với user www-data (UID 33) nhưng thư mục trên server thuộc về root, bạn sẽ bị lỗi “Permission Denied”.

Mẹo nhỏ: Sử dụng option no_root_squash giúp user root từ container có quyền tương đương trên server. Nếu ưu tiên bảo mật cao hơn, bạn nên đồng bộ chính xác UID/GID của user trong container với thư mục trên máy chủ NFS.

2. Các tham số mount nên thuộc lòng

  • soft: Giúp container không bị treo cứng (hang) nếu server NFS đột ngột mất kết nối.
  • nolock: Cần thiết khi bạn chạy các ứng dụng cũ hoặc cần tối ưu tốc độ ghi file qua mạng.
  • timeo=14: Thiết lập thời gian timeout (tính bằng deciseconds) trước khi thực hiện gửi lại yêu cầu.

Lời khuyên thực chiến: Đừng lạm dụng NFS

NFS rất tiện nhưng không phải là “liều thuốc vạn năng”. Qua nhiều dự án, mình đúc kết được 3 lưu ý sống còn:

  • Né Database nặng: Với các DB có tần suất đọc ghi (IOPS) cao như PostgreSQL hay MySQL quy mô lớn, NFS sẽ là nút thắt cổ chai khiến hệ thống chậm chạp. Hãy ưu tiên dùng replication thay vì share ổ đĩa.
  • Ưu tiên băng thông: Hãy đảm bảo các node kết nối qua switch 1Gbps. Trên hạ tầng 100Mbps, việc khởi động một container có volume lớn sẽ trở thành thảm họa về tốc độ.
  • Giám sát chặt chẽ: Nếu server NFS sập, toàn bộ cluster của bạn sẽ tê liệt. Hãy cài đặt cảnh báo (Alerting) cho con server này trước khi quá muộn.

Làm chủ Docker Volume với NFS sẽ giúp hạ tầng của bạn linh hoạt hơn rất nhiều. Chúc các bạn triển khai hệ thống ổn định!

Share: