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

时间:2017-03-27 08:23:27

标签: windows docker docker-compose service-discovery windows-container

使用Docker Windows Containers我想超越一个运行App的Docker容器。如标题“Docker Compose and Service Discovery”下的Microsoft docs中所述:

  

内置于Docker的是服务发现,它处理服务   容器和服务的IP(DNS)映射的注册和名称;   通过服务发现,所有容器端点都可以   通过名称(容器名称或服务名称)发现彼此。

由于docker-compose允许您在其yaml文件中define services,因此这些名称应该是可发现的(例如pingable)(请务必提醒difference between services and containers in docker-compose)。此blog post by Microsoft提供了服务webdb的完整示例,其中包含所需docker-compose.yml in the GitHub repo的完整来源。

我的问题是: Docker窗口容器有时会“找到”彼此,有时根本不会“找到”。我使用docker inspect <container-id>进行了检查,其中包含别名dbweb。但是,当我将一个容器(例如,通过docker exec -it myapps_web_1 powershell放入一个网络容器)并尝试执行ping db 时,这只能偶尔使用

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

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

我的Windows Vagrant box是通过packer.io构建的,基于最新的Windows Server 2016 Evalutation ISO。必要的Windows功能和Docker / docker-compose安装is done with Ansible

无法解决此问题,Docker Windows容器在客户中变得几乎无法使用。

2 个答案:

答案 0 :(得分:1)

经过一两个星期试图解决这个问题,我终于找到了解决方案。从阅读此docker/for-win/issues/500开始,我找到了这个multicontainer example application source的链接,其中一位作者将该解决方案记录为副业,并将其命名为:

  

Windows DNS客户端怪异的临时解决方法

将以下内容放入Dockerfile将解决DNS问题:

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

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

问题也是discussed here,解决方案有望进入官方Docker镜像(或至少进入文档)。

答案 1 :(得分:0)

我发现我需要在端口 1888 中打开TCP才能使DNS立即工作。在没有打开此端口的情况下,每次DNS更改时(同样在第一次群集设置期间),我都必须连接到容器(在我的情况下为Windows)并在PowerShell Clear-DnsClientCache中执行。