Bản thân Swarm Mode không làm bất kỳ điều gì khác biệt với volume, nó chạy bất kỳ lệnh mount volume nào bạn cung cấp trên nút nơi vùng chứa đang chạy. Nếu khối lượng gắn kết của bạn là cục bộ cho nút đó, thì dữ liệu của bạn sẽ được lưu cục bộ trên nút đó. Không có chức năng tích hợp để di chuyển dữ liệu giữa các nút tự động.
Có một số giải pháp lưu trữ phân tán dựa trên phần mềm như GlusterFS và Docker có một giải pháp được gọi là Infinit chưa phải là GA và việc phát triển dựa trên đó đã đặt chỗ dựa cho tích hợp Kubernetes trong EE.
Kết quả điển hình là bạn cần quản lý sao chép bộ nhớ trong ứng dụng của mình (ví dụ: etcd và các thuật toán dựa trên bè khác) hoặc bạn thực hiện gắn kết của mình trên hệ thống lưu trữ bên ngoài (hy vọng với HA của riêng nó). Gắn hệ thống lưu trữ bên ngoài có hai tùy chọn, khối hoặc dựa trên tệp. Lưu trữ dựa trên khối (ví dụ EBS) thường đi kèm với hiệu suất cao hơn, nhưng bị giới hạn là chỉ được gắn trên một nút duy nhất. Đối với điều này, bạn thường sẽ cần trình điều khiển plugin khối lượng của bên thứ ba để cấp cho nút docker của bạn quyền truy cập vào bộ nhớ khối đó. Lưu trữ dựa trên tệp (ví dụ: EFS) có hiệu suất thấp hơn, nhưng di động hơn và có thể được gắn đồng thời trên nhiều nút, điều này rất hữu ích cho một dịch vụ sao chép.
Lưu trữ mạng dựa trên tệp phổ biến nhất là NFS (đây là cùng một giao thức được EFS sử dụng). Và bạn có thể gắn kết mà không cần bất kỳ trình điều khiển plugin nào của bên thứ ba. Thật không may, trình điều khiển plugin khối lượng "cục bộ" có tên là docker cung cấp cho bạn tùy chọn để chuyển bất kỳ giá trị nào bạn muốn vào lệnh mount với tùy chọn trình điều khiển và không có tùy chọn, nó mặc định lưu trữ khối lượng trong thư mục docker / var / lib / docker / khối lượng. Với các tùy chọn, bạn có thể chuyển cho nó các tham số NFS và thậm chí nó sẽ thực hiện tra cứu DNS trên tên máy chủ NFS (thông thường bạn không có với NFS). Dưới đây là ví dụ về các cách khác nhau để gắn kết hệ thống tệp NFS bằng trình điều khiển âm lượng cục bộ:
# create a reusable volume
$ docker volume create --driver local \
--opt type=nfs \
--opt o=nfsvers=4,addr=192.168.1.1,rw \
--opt device=:/path/to/dir \
foo
# or from the docker run command
$ docker run -it --rm \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=192.168.1.1\",volume-opt=device=:/host/path \
foo
# or to create a service
$ docker service create \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=192.168.1.1\",volume-opt=device=:/host/path \
foo
# inside a docker-compose file
...
volumes:
nfs-data:
driver: local
driver_opts:
type: nfs
o: nfsvers=4,addr=192.168.1.1,rw
device: ":/path/to/dir"
...
Nếu bạn sử dụng ví dụ về tệp soạn ở cuối, hãy lưu ý rằng các thay đổi đối với một ổ (ví dụ: cập nhật đường dẫn hoặc địa chỉ máy chủ) không được phản ánh trong các ổ có tên hiện có miễn là chúng tồn tại. Bạn cần đổi tên hoặc xóa ổ đĩa của mình để cho phép bầy đàn tạo lại nó với các giá trị mới.
Vấn đề phổ biến khác mà tôi thấy trong hầu hết việc sử dụng NFS là "bí rễ" đang được bật trên máy chủ. Điều này dẫn đến các vấn đề về quyền khi các vùng chứa đang chạy dưới dạng root cố gắng ghi tệp vào ổ đĩa. Bạn cũng gặp các vấn đề tương tự về quyền UID / GID trong đó vùng chứa UID / GID là vùng cần có quyền để ghi vào ổ đĩa, điều này có thể yêu cầu quyền sở hữu thư mục và quyền được điều chỉnh trên máy chủ NFS.