我使用 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 地址与 nextcloud-app 容器进行 ping 操作。连接在那里,只有 DNS 解析失败。
我不知道如何进一步调试。我一周没有碰我的 compose.yml 文件。据我所知,一切都没有改变。然而,该设置在一夜之间停止工作。
如何强制 Nextcloud 容器在 docker-internal DNS 上注册自己的主机名?任何建议表示赞赏。
我找到了解决方案。这个答案是为将来可能面临同样问题的可怜人准备的。
事实证明,这毕竟不是 docker 问题。Nextcloud 在夜间进入了维护模式(原因仍然未知,接下来将不得不进行调查)。当处于维护模式并且情况陷入僵局时,Nextcloud docker 镜像无法在 Docker 的 DNS 中注册自己(因为镜像中的错误?):没有 DNS 解析,无法通过反向代理访问 Nextcloud --> 没有注意到 Nextcloud处于维护模式 --> 一直处于维护模式,没有 DNS 解析,...
如果我想检查一下 Nextcloud 是否处于维护模式,它本可以为我节省几个小时的调试和头疼的时间。让 Nextcloud 退出维护模式只需几分钟。现在感觉有点傻。;-)