![Контейнер Docker не регистрирует имя хоста в docker-internal DNS](https://rvso.com/image/776313/%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%20Docker%20%D0%BD%D0%B5%20%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D1%83%D0%B5%D1%82%20%D0%B8%D0%BC%D1%8F%20%D1%85%D0%BE%D1%81%D1%82%D0%B0%20%D0%B2%20docker-internal%20DNS.png)
Я использую Docker для реализации сервиса Nextcloud. Для этого я использую официальный образ nextcloud-apache, обратный прокси Nginx, certbot и MariaDB. Ничего особенного, на самом деле.
Мой экземпляр docker работает в режиме swarm. Все контейнеры работают вместе с менеджером на одном хосте с одной репликой для каждой службы, стандартные оверлейные сети. Swarm запускается с использованием стандартного файла compose.
Моя установка работала стабильно много месяцев, пока вчера вечером она не сломалась по непонятной причине. Насколько я вижу, не было никаких обновлений или перезапусков, ни для ОС (Ubuntu Server LTS), ни для Docker-CE, ни для любого из образов (я делаю все обновления вручную через регулярные промежутки времени, и я определенно не делал их в 4 утра вчера вечером). Я отследил причину до контейнера Nextcloud (но я думаю, что это проблема Docker, поэтому мой вопрос здесь...):
В журнале обратного прокси-сервера Nginx есть следующая строка:
2022/04/06 20:16:45 [error] 10#10: *3 nextcloud-app could not be resolved (3: Host not found), client: 10.135.40.1, server: <redacted>, request: "GET / HTTP/1.1", host: "<redacted>"
Nginx не может разрешить внутренний сервер и возвращает клиенту ошибку 502/Bad Gateway.
Я проверил, и имя хоста для контейнера Nextcloud ("nextcloud-app") действительно не зарегистрировано в docker-internal DNS (доступно по адресу 127.0.0.11 в каждом контейнере). Я могу войти в любой из контейнеров и отправить DNS-запрос (после запуска after apt-get update && apt-get install iputils-ping dnsutils
внутри контейнера(ов)), имя "nextcloud-app" нигде не разрешается. Пример:
root@nextcloud-app:/var/www/html# nslookup nextcloud-app
Server: 127.0.0.11
Address: 127.0.0.11#53
** server can't find nextcloud-app: NXDOMAIN
Все остальные имена контейнеров разрешаются так, как и должны. Разрешение внешних адресов также работает. "nextcloud-app" — этотольконеразрешимое имя контейнера.
Однако яможетping к контейнеру nextcloud-app и из него напрямую с использованием внутренних IP-адресов docker. Связь есть, только разрешение DNS не работает.
Я понятия не имею, как это отлаживать дальше. Я не трогал свой файл compose.yml неделю. Насколько мне известно, ничего не изменилось. Но настройка перестала работать в одночасье.
Как заставить контейнер Nextcloud зарегистрировать собственное имя хоста на внутреннем DNS-сервере docker? Любые предложения приветствуются.
решение1
Я нашел решение. Этот ответ для бедняги, который, возможно, столкнется с той же проблемой в будущем.
Оказалось, что проблема была не в докере. Nextcloud перешел в режим обслуживания ночью (по неизвестным пока причинам, придется разбираться дальше). Каким-то образом образ докера Nextcloud не смог зарегистрироваться в DNS Docker (из-за ошибки в образе?) в режиме обслуживания, и ситуация зашла в тупик: нет разрешения DNS, нет доступа к Nextcloud через обратный прокси-сервер --> не замечаем, что Nextcloud находится в режиме обслуживания --> остаемся в режиме обслуживания навсегда, нет разрешения DNS, ...
Если бы я только подумал проверить, находится ли Nextcloud в режиме обслуживания, это могло бы сэкономить мне несколько часов отладки и чесания головы. Вывести Nextcloud из режима обслуживания было/есть делом нескольких минут. Чувствую себя немного глупо прямо сейчас. ;-)