Сам Swarm Mode не робить нічого іншого з томами, він запускає будь-яку команду монтування обсягу, яку ви надаєте на вузлі, де запущений контейнер. Якщо ваше підключення тому є локальним для цього вузла, тоді ваші дані будуть зберігатися локально на цьому вузлі. Немає вбудованої функціональності для автоматичного переміщення даних між вузлами.
Є кілька рішень для розподіленого сховища на основі програмного забезпечення, таких як GlusterFS, і Docker має таке, що називається Infinit, яке ще не є GA, а розробка, яке відійшло на другий план інтеграції Kubernetes в EE.
Типовий результат - вам або потрібно керувати реплікацією сховища у вашому додатку (наприклад, etcd та інші алгоритми, засновані на плотах), або ви виконуєте монтування на зовнішній системі зберігання (сподіваємось, із власною HA). Встановлення зовнішньої системи зберігання даних має два варіанти - блочний або файловий. Блокове зберігання даних (наприклад, EBS), як правило, має більш високу продуктивність, але обмежується лише монтажем на одному вузлі. Для цього вам, як правило, знадобиться сторонній драйвер плагіна тому, щоб надати вашому докерному вузлу доступ до цього блочного сховища. Файлове сховище (наприклад, EFS) має нижчу продуктивність, але є більш портативним і може одночасно встановлюватися на декількох вузлах, що корисно для реплікаційної служби.
Найпоширенішим мережевим сховищем на основі файлів є NFS (це той самий протокол, що використовується EFS). І ви можете змонтувати це без будь-яких сторонніх драйверів плагінів. На жаль, названий "локальний" драйвер плагіна тому, з яким постачається докер, дає вам можливість передавати будь-які потрібні значення команді монтування за допомогою параметрів драйвера, і, не маючи жодних параметрів, він за замовчуванням зберігає томи в каталозі докера / var / lib / докер / томи. За допомогою опцій ви можете передавати йому параметри NFS, і він навіть виконуватиме пошук DNS для імені хосту NFS (те, що у вас зазвичай немає з NFS). Ось приклад різних способів монтування файлової системи NFS за допомогою локального драйвера томів:
# 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"
...
Якщо ви використовуєте приклад композиційного файлу в кінці, зверніть увагу, що зміни в томі (наприклад, оновлення шляху або адреси сервера) не відображаються в існуючих іменованих томах, доки вони існують. Вам потрібно або перейменувати свій том, або видалити його, щоб дозволити рою відтворити його з новими значеннями.
Інша поширена проблема, яку я бачу в більшості випадків використання NFS, - це ввімкнення "кореневого сквошу" на сервері. Це призводить до проблем з дозволами, коли контейнери, що працюють як root, намагаються записати файли в том. У вас також є подібні проблеми з дозволами UID / GID, де контейнер UID / GID - це той, якому потрібні дозволи для запису в том, що може зажадати права власності на каталоги та дозволів на сервері NFS.