Вопрос или проблема
Я пытаюсь использовать NFS-том в окружении Docker Swarm. Вот мой композ:
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" указывает на то, что контейнеры не могут установить соединение с NFS-сервером. Давайте рассмотрим несколько шагов для устранения этой проблемы.
Шаги по устранению проблемы:
-
Проверка доступа к NFS-серверу:
Убедитесь, что все узлы кластера Docker Swarm могут подключаться к NFS-серверу. Выполните командуshowmount -e <адрес NFS-сервера>
на каждом узле, чтобы проверить, доступны ли экспортируемые ресурсы. -
Использование IP-адреса:
Убедитесь, что в конфигурации Docker Compose вместо<redacted>
у вас указан корректный IP-адрес NFS-сервера. Попробуйте использовать явный IP-адрес вместо его DNS-имени, чтобы исключить возможные проблемы с разрешением имени. -
Файловые права на NFS-сервере:
Проверьте, что пользователь (или UID) под которым работает контейнер, имеет соответствующие права на доступ к каталогу/docker/storage/links
на NFS-сервере. Вы можете временно настроить права доступа на NFS-сервер на777
для тестирования. -
Проверка конфигурации NFS:
Проверьте конфигурацию NFS-сервера, в частности параметры в/etc/exports
. Убедитесь, что клиентские узлы (IP-адреса) имеют разрешение на доступ и корректно настроены в файле.Например, запись в
/etc/exports
может выглядеть следующим образом:/docker/storage/links *(rw,sync,no_subtree_check,no_root_squash)
-
Проверка параметров фаервола:
Убедитесь, что фаервол не блокирует порты 111 и 2049 как для TCP, так и для UDP на NFS-сервере. Проверьте настройки фаервола и если необходимо, временно отключите его для тестирования. -
Обновление Docker Compose:
Возможно, вам стоит попробовать обновить Docker и Docker Compose до последних стабильных версий, так как проблемы могут быть исправлены в более поздних версиях. -
Отладка в Docker Swarm:
Попробуйте запустить контейнеры с NFS-томом в режиме--privileged
(только для тестирования). Это поможет выявить, связана ли проблема с привилегиями:docker service create --name <service_name> --mode replicated --replicas 1 --mount type=volume,source=data_links,target=/path/in/container --privileged <image_name>
-
Логи и диагностика:
Изучите логи на всех узлах Swarm для выявления дополнительных сообщений об ошибках, которые могут помочь в диагностике. Используйтеdocker service logs <service_name>
.
Если вышеуказанные шаги не помогли, пожалуйста, предоставьте дополнительную информацию о конфигурации вашего NFS-сервера и узлов Swarm. Это поможет более точно диагностировать проблему.