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 地址與 nextcloud-app 容器進行 ping 操作。連接在那裡,只有 DNS 解析失敗。
我不知道如何進一步調試。我一周沒有碰我的 compose.yml 文件。據我所知,一切都沒有改變。然而,該設置在一夜之間停止工作。
如何強制 Nextcloud 容器在 docker-internal DNS 上註冊自己的主機名?任何建議表示讚賞。
我找到了解決方案。這個答案是為將來可能面臨同樣問題的可憐人準備的。
事實證明,這畢竟不是 docker 問題。Nextcloud 在夜間進入了維護模式(原因仍然未知,接下來將不得不進行調查)。不知何故,Nextcloud docker 鏡像在維護模式下無法在 Docker 的 DNS 中註冊自己(因為鏡像中的錯誤?)並且情況陷入僵局:沒有 DNS 解析,無法通過反向代理訪問 Nextcloud –> 沒有註意到 Nextcloud處於維護模式 –> 一直處於維護模式,沒有 DNS 解析,…
如果我想檢查一下 Nextcloud 是否處於維護模式,它本可以為我節省幾個小時的調試和頭疼的時間。讓 Nextcloud 退出維護模式只需幾分鐘。現在感覺有點傻。;-)