Вопрос или проблема
Я пытаюсь использовать NFS-том в среде Docker Swarm. Вот мой compose:
volumes:
data_links:
driver: local
driver_opts:
type: "nfs"
o: "nfsvers=4,addr=<скрыто>,rw"
device: ":/docker/storage/links"
Но когда я пытаюсь развернуть это, я вижу в docker inspect:
"Err": "не удалось наполнить том: ошибка при монтировании тома '/var/lib/docker/volumes/links_data_links/_data': не удалось смонтировать локальный том: mount :/docker/storage/links:/var/lib/docker/volumes/links_data_links/_data, data: addr=<скрыто>: соединение отклонено",
Все управляющие и рабочие узлы имеют установленный nfs-common
, и mount
этого NFS-хранилища работает на каждом узле.
Если я разверну контейнер Docker с Ubuntu, установлю там nfs-common
и попытаюсь смонтировать, у меня возникают проблемы с привилегиями. Я читал, что мне не нужен флаг привилегий для NFS-общего доступа.
Если я попробую сделать telnet на порты 111 и 2049 NFS-сервера, оба ответа (просто для теста соединения). Оба порта доступны через фаервол по TCP и UDP.
Если я запускаю это от имени root, у меня та же проблема с Docker Swarm.
Если я просто выполняю “docker compose up”, монтирование возможно.
(Я уже пробовал “type: “nfsv4″” и т.д. в docker-compose)
Только в Swarm я получаю соединение отклонено
Ответ или решение
Проблема с подключением NFS в Docker Swarm может возникать по нескольким причинам. Давайте рассмотрим возможные решения вашей проблемы с ошибкой "connection refused".
1. Проверка конфигурации NFS-сервера
Убедитесь, что ваш NFS-сервер правильно настроен и доступен для всех узлов Docker Swarm. Проверьте файл /etc/exports
, чтобы убедиться, что разрешены подключения от всех необходимых IP-адресов и что доступные каталоги экспортируются корректно. Примерная запись в файле /etc/exports
может выглядеть так:
/docker/storage/links *(rw,sync,no_subtree_check,no_root_squash)
После изменения файла /etc/exports
, не забудьте выполнить команду:
exportfs -ra
2. Проверка сетевых настроек
Поскольку вы можете использовать telnet
для подключения к портам 111 и 2049, это означает, что сеть настроена правильно. Однако всегда хорошо проверять наличие правил брандмауэра или других сетевых политик, которые могут препятствовать подключению. Убедитесь, что на всех узлах Swarm разрешены исходящие и входящие соединения к NFS-серверу.
3. Перепроверка указания устройства в объеме
Ваше определение тома выглядит корректно, однако убедитесь, что вы используете правильный адрес NFS-сервера и что он доступен с каждого узла в кластере. Убедитесь, что addr=<redacted>
заменено на фактический IP-адрес вашего NFS-сервера.
4. Использование Docker Swarm и NFS
Docker Swarm может вести себя иначе, чем стандартный Docker, особенно когда дело касается управления томами. Подключение NFS не всегда работает так же, как в стандартном режиме. Поскольку вы можете успешно подключиться к NFS в обычном Docker с помощью docker compose up
, но не в Swarm, это может быть связано с тем, что Swarm использует разные механизмы для управления томами.
5. Доступ к NFS: привилегии и права
Проблемы с правами доступа могут возникать из-за того, что контейнеры, запущенные в Swarm, могут работать с другими пользовательскими ID и могут сталкиваться с ограничениями по доступу к файлам NFS. Попробуйте настроить монтирование с использованием параметров, позволяющих не ограничивать доступ root (например, без no_root_squash
). Также убедитесь, что UID и GID пользователя внутри контейнера совпадают с правами на NFS-сервере.
6. Служебные контейнеры
Если проблема продолжает существовать, попробуйте запустить служебный контейнер для отладки. Например, вы можете запустить контейнер с nfs-common
и попытаться примонтировать том непосредственно для проверки конфигурации.
docker service create --name nfs-debug --mode global --pid host --privileged ubuntu:latest /bin/bash
В этом контейнере вы сможете выполнить проверку соединения и наладить требуемые зависимости.
Заключение
После выполнения всех этих шагов попробуйте снова запустить ваше приложение в Docker Swarm. Если ошибка "connection refused" по-прежнему возникает, попробуйте просмотреть журналы как на сервере NFS, так и на узлах Swarm, чтобы выявить конкретные ошибки или предупреждения. Важно подробно документировать все изменения и тесты, которые вы проводите, чтобы лучше понять, где именно может быть проблема.