容器里的 DNS:为什么宿主机正常,应用却解析失败
同一台服务器上,宿主机能访问网站,容器里的程序却提示域名解析失败,并不矛盾。容器有自己的文件系统与网络配置,需要独立确认解析链路。
从 resolv.conf 开始
先看宿主机的 /etc/resolv.conf,再运行 docker exec 容器名 cat /etc/resolv.conf。这里的 nameserver 指定解析服务器。如果文件没有有效解析器,不同语言运行时可能使用不同的默认行为。
localhost 的含义取决于网络模式
桥接网络里的 127.0.0.1 指向容器自身。把宿主机的本地 DNS 地址照搬进去,经常会失败。host 网络共享宿主机网络空间,但仍要检查容器内的解析配置文件是否有效。
分清 DNS 与 HTTPS 故障
“lookup failed”通常发生在建立连接之前;“certificate verify failed”发生在 TLS 校验阶段;“connection refused”则表示连接目标没有接受请求。把这些错误混为一谈,会导致改错配置。
先验证,再持久化
可以先在容器内做解析与 HTTPS 请求测试。确认可用后,把 DNS 配置写入 Compose,例如:
1 | services: |
这只是格式示例。实际应优先使用所在云平台或网络中可达、可信的解析器;公共 DNS 不一定能解析私有域名。
变更后再做一次完整请求
解析出地址只是第一步,还应确认 TCP、TLS 与应用响应。临时修改容器文件容易在重建后丢失,最终配置应放回部署文件,并保留变更记录。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 SkynetX!