Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于服务发现的Docker DNS,用于解析Windows容器´;s的名称地址不一致_Windows_Docker_Docker Compose_Service Discovery_Windows Container - Fatal编程技术网

用于服务发现的Docker DNS,用于解析Windows容器´;s的名称地址不一致

用于服务发现的Docker DNS,用于解析Windows容器´;s的名称地址不一致,windows,docker,docker-compose,service-discovery,windows-container,Windows,Docker,Docker Compose,Service Discovery,Windows Container,与我一起工作,我想超越只运行一个应用程序的Docker容器。如标题“Docker Compose and Service Discovery”下的中所述: Docker的内置功能是服务发现,它处理服务 容器和服务的注册和名称到IP(DNS)映射; 通过服务发现,所有容器端点都可以 按名称(容器名称或服务名称)相互查找 而且,由于允许您输入它的yaml文件,因此这些文件应该可以通过这些名称发现(例如pingable)(请务必提醒用户)。这提供了一个完整的示例,其中包含服务web和db的完整源代码以

与我一起工作,我想超越只运行一个应用程序的Docker容器。如标题“Docker Compose and Service Discovery”下的中所述:

Docker的内置功能是服务发现,它处理服务 容器和服务的注册和名称到IP(DNS)映射; 通过服务发现,所有容器端点都可以 按名称(容器名称或服务名称)相互查找

而且,由于允许您输入它的yaml文件,因此这些文件应该可以通过这些名称发现(例如pingable)(请务必提醒用户)。这提供了一个完整的示例,其中包含服务
web
db
的完整源代码以及所需的

我的问题是:Docker windows容器只是有时会“找到”彼此,有时根本不会。我用docker inspect检查了它们,别名
db
web
都在那里。但是,当我将powershell放入一个容器(例如,通过
docker exec-it myapps\u web\u 1 powershell
)并尝试执行
ping db
时,这只会偶尔起作用

让我在这里澄清一下(因为文档不是这样):对于非docker compose场景,这个问题也是一样的。在构建时,如果没有docker compose服务,问题也会出现,而只是简单的旧容器名称

对这种奇怪的行为有什么想法吗?对我来说,随着越来越多的应用程序投入使用,这种情况会变得更糟。有关更多详细信息,请看一看,我有一个示例项目,其中包含Spring Boot&Spring Cloud Eureka/Zuul和4 docker compose服务,其中weatherbackend和weatherbackend second易于扩展-例如,通过
docker compose scale weatherbackend=3

我的版本是基于最新版本的via构建的。必要的Windows功能和Docker/Docker组合安装


由于没有解决此问题的方法,Docker Windows容器在客户处几乎无法使用

经过一两周的努力,我终于找到了解决办法。从阅读这篇文章开始,我发现了一个链接,其中一位作者将该解决方案记录为副业,并将其命名为:

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
(要了解DockerFile中Powershell命令的执行方式,请查看)


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

我发现我需要在端口1888中打开TCP以使DNS立即工作。在没有打开此端口的情况下,每次更改DNS时(也是在第一次swarm安装期间),我都必须连接到容器(在我的情况下是windows)并在PowerShell Clear DnsClientCache中执行。

这并不能解决我的问题。我正在运行最新的windows server容器,该容器已经设置了该注册表值,但我仍然发现dns在更改后解析为错误的ip。是否有其他解决方案?能否提供有关设置的更多详细信息?是否要使用Docker Compose?“docker inspect containerId”的输出是什么?我在这里为我的博客文章做了一个完整的例子:-也许这个例子也有帮助,或者设置一个示例项目来显示你的错误?!这解决了我家用电脑(Win 10)上的问题,但我的工作笔记本电脑根本无法通过别名解析服务。我过得去。我猜这取决于我的笔记本电脑是如何配置的。任何人都知道从哪里开始查找问题,因为问题可能是我的电脑,而不是docker。依赖于以非100%可理解的方式配置的东西(例如,通过公司中的其他人,如系统管理员),通常会导致查找错误的大量时间损失。我喜欢在Vagrant中使用虚拟化层的想法,并在诸如Ansible之类的资源调配工具的帮助下,使用Packer安装Windows 10/Server 2016,理想情况下可销毁,100%可自动替换。如果你想这样做,我在博客上写过,包括这里的howto(不需要SpringBoot进行设置)