Персистентное хранение данных в Docker Swarm: сетевые тома NFS и GlusterFS
- Потеря данных при миграции контейнера (task reschedule) с одной ноды кластера Swarm на другую.
- Локальные bind-mounts не синхронизируются между серверами кластера.
- Ошибка монтирования
volume driver not foundили таймауты сетевых блокировок RPC.
1. Установка NFS-клиентов на все узлы Swarm кластера
# Ubuntu / Debian
apt-get install -y nfs-common
# RHEL / Rocky Linux
dnf install -y nfs-utils2. Создание сетевого NFS тома через Docker CLI
docker volume create --driver local \
--opt type=nfs \
--opt o=addr=192.168.1.50,rw,nfsvers=4,noatime,rsize=1048576,wsize=1048576,hard,timeo=600 \
--opt device=:/srv/nfs/shared_data \
swarm_nfs_storage3. Использование NFS томов в Docker Stack (Compose v3)
Определите сетевой том в файле stack.yml:
version: "3.8"
services:
app:
image: wordpress:latest
deploy:
replicas: 2
volumes:
- persistent_data:/var/www/html/wp-content
volumes:
persistent_data:
driver: local
driver_opts:
type: "nfs"
o: "addr=192.168.1.50,rw,nfsvers=4,nolock,soft"
device: ":/srv/nfs/wp_content"4. Проверка монтирования на нодах кластера
docker volume inspect swarm_nfs_storage
# Тестовая проверка записи
docker run --rm -v swarm_nfs_storage:/mnt alpine touch /mnt/cluster_test.tmp Частые вопросы (FAQ)
Почему при использовании NFS базы данных (PostgreSQL/MySQL) могут повреждаться?
NFS не гарантирует полную поддержку POSIX fcntl/flock файловых блокировок и fsync транзакций при высокой частоте случайной записи. Базы данных на сетевых хранилищах требуют специализированных драйверов (Ceph RBD, Longhorn, Portworx).
Каковы преимущества опций rsize и wsize в 1048576?
Они увеличивают размер буфера передачи пакетов NFS до 1MB, что кардинально повышает скорость последовательного чтения и записи по 10G/40G сетям.