Docker 用于服务发现的 DNS 解析 Windows 容器的名称地址不能始终如一地工作

Docker DNS for Service Discovery to resolve Windows Container´s address by name does not work consistently

在标题下与 Docker Windows Containers I want to go beyond only one Docker container running a App. As described in the Microsoft docs 合作 "Docker Compose and Service Discovery":

Built in to Docker is Service Discovery, which handles service registration and name to IP (DNS) mapping for containers and services; with service discovery, it is possible for all container endpoints to discover each other by name (either container name, or service name).

而且因为 docker-compose lets you define services in it´s yaml files, these should be discoverable (e.g. pingable) by there names (be sure to remind the ). This blog post by Microsoft provides a complete example with the service web and db including full source with the needed docker-compose.yml in the GitHub repo.

我的问题是: Docker windows 容器 "find" 彼此 有时,有时不完全。我用 docker inspect <container-id> 检查了它们,别名 dbweb 在那里。但是当我 powershell 进入一个容器(例如通过 docker exec -it myapps_web_1 powershell 进入一个 web 容器)并尝试做一个 ping db 这只是偶尔有效 .

让我在这里说清楚(因为恕我直言,文档不是):对于非 docker-compose 场景,这个问题是相同的。构建一个 example app without compose,没有 docker-compose 服务也出现问题,但只是普通的旧容器名称!

对这种奇怪的行为有什么想法吗? 对我来说,随着更多应用程序的出现,这种情况会变得更糟。有关更多详细信息,请查看 https://github.com/jonashackt/spring-cloud-netflix-docker,其中我有一个示例项目,其中包含 Spring Boot & Spring Cloud Eureka/Zuul 和 4 个 docker-compose 服务,其中weatherbackend 和 weatherbackend-second 很容易扩展——例如通过 docker compose scale weatherbackend=3.

我的Windows Vagrant box is build via packer.io and is based on the latest Windows Server 2016 Evalutation ISO. The necessary Windows Features and Docker/docker-compose installation is done with Ansible.

由于没有解决此问题,Docker Windows 容器对我们客户而言几乎无法使用。

在尝试解决这个问题一两周后,我终于找到了解决方案。从阅读这篇 docker/for-win/issues/500, I found a link to this multicontainer example application source 开始,其中一位作者将解决方案记录为副业,并将其命名为:

Temporary workaround for Windows DNS client weirdness

将以下内容放入您的 Docker 文件中将解决 DNS 问题:

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]
RUN set-itemproperty -path 'HKLM:\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters' -Name ServerPriorityTimeLimit -Value 0 -Type DWord

(要了解如何在 Docker 文件中执行 Powershell 命令,请查看 Dockerfile reference

问题也是 discussed here,解决方案有望在官方 Docker 图像(或至少在文档中)中找到。

我发现我需要在端口 1888 中打开 TCP 以使 DNS 立即工作。如果没有打开这个端口,我必须连接到容器(windows 在我的例子中)并在每次 DNS 更改时(也在第一次群设置期间)在 PowerShell Clear-DnsClientCache 中执行。