Docker 容器未在 docker-internal DNS 中注册主机名

Docker 容器未在 docker-internal DNS 中注册主机名

我使用 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”是仅有的无法解析的容器名称。

但是,我直接使用 docker-internal IP 地址 ping nextcloud-app 容器。连接正常,只是 DNS 解析失败。

我不知道如何进一步调试。我已经一周没有动过我的 compose.yml 文件了。据我所知,什么都没有改变。然而,安装程序在一夜之间停止了工作。

如何强制 Nextcloud 容器在 docker-internal DNS 上注册其自己的主机名?欢迎提出任何建议。

答案1

我找到了解决方案。这个答案是为那些将来可能面临同样问题的可怜人准备的。

事实证明,这根本不是 docker 的问题。Nextcloud 在夜间进入维护模式(原因尚不清楚,下一步必须调查)。在维护模式下,Nextcloud docker 镜像不知何故无法在 Docker 的 DNS 中注册自己(因为镜像中有错误?),情况陷入僵局:没有 DNS 解析,无法通过反向代理访问 Nextcloud --> 没有注意到 Nextcloud 处于维护模式 --> 永远处于维护模式,没有 DNS 解析,...

如果我早想到检查 Nextcloud 是否处于维护模式,我就可以省下几个小时的调试和思考时间。让 Nextcloud 退出维护模式只需几分钟。现在感觉有点愚蠢。;-)

相关内容