【问题标题】:Docker internal DNS Slow to resolve internal service namesDocker 内部 DNS 解析内部服务名称很慢
【发布时间】:2020-07-30 09:09:24
【问题描述】:

张贴这个经验(问题)以防其他人遇到同样的情况......

使用多个私有 REST-API(在 python/Flask 中)进行多容器 Docker-Compose 部署。 系统部署在 Ubuntu VM 主机上,并且运行了数周没有出现任何问题。 (这是一个内部演示设置)

主 GUI 突然变得几乎没有响应。每个 API 调用都花费了很长时间,以至于导致随机超时,使其无法使用。 调查显示,当一个容器尝试调用另一个容器中的 API 时,API 调用最多需要 10 秒。

罪魁祸首是主机上的 /etc/resolv.conf 文件。 DevOps 已更改所有主机以在 resolv.conf 中包含一个搜索行,该搜索行在重新启动时被 Docker 容器拾取。 这会导致每个内部 API 调用尝试通过搜索找不到服务名称的位置、超时,然后尝试下一个位置来解析服务名称。

违规resolv.conf:

    search local.company.com company.com
    nameserver 127.0.0.11
    options ndots:2

这导致尝试连接到 http://my-service:12345/api/v1/health 被尝试为 my-service.local.company.com (timeout) my-service.company.com (timeout) 最后只是 my-service (API 成功)。

下面列出的有效答案。

【问题讨论】:

标签: docker docker-compose dns


【解决方案1】:

编辑:回答我自己的问题,谢谢克里斯。 :)

为了解决这个问题,我创建了 resolv.conf 文件的本地干净版本:

nameserver 127.0.0.11
options ndots:0

然后我在容器条目中创建了一个卷,以便 docker-compose 挂载 ./resolv.conf:/etc/resolv.conf。这覆盖了从主机继承的 resolve.conf,所有内部服务名称现在可以快速解析,没有超时或延迟。

my-service:
  image: foo:latest
  container_name: "priv_api" 
  volumes:
    # Force the container to use the clean file instead of inherited.
    - ./resolv.conf:/etc/resolv.conf
  networks:
    - nodeapp-network

这个 bug 的有趣之处在于发现更改是在 2 周前对主机进行的,并且在重新启动之前不会影响 docker 容器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多