Docker上的java.net.UnknownHostException

Nic*_*aro 6 java dns docker

我正在尝试为ZooKeeper创建docker容器并在集群模式下配置它们(完整代码在这里这里).

容器基于Alpine Linux(高山:Docker Hub上的3.2),但我要描述的问题也发生在官方Java容器(java:7)上.

我使用以下命令启动集群:

docker run -d -h zk1 --name zk1 dockmob/zookeeper -s zk1,zk2,zk3
# wait some time ...
docker run -d -h zk2 --name zk2 dockmob/zookeeper -s zk1,zk2,zk3
docker run -d -h zk3 --name zk3 dockmob/zookeeper -s zk1,zk2,zk3
Run Code Online (Sandbox Code Playgroud)

(它们可以在码头集线器上使用,您可以试用它们).

如果我开始了第二和第三容器之前等待一段时间,然后在主机名zk2zk3放入/etc/hosts太晚(由码头工人)和Java是无法找到他们:我得到java.net.UnknownHostException在日志zk1两个zk2zk3.

我在网上发现我需要禁用JVM DNS缓存以刷新主机名,因此我在其中引入了以下命令Dockerfile以更新java.security设置:

RUN grep '^networkaddress.cache.ttl=' /usr/lib/jvm/java-1.7-openjdk/jre/lib/security/java.security || echo 'networkaddress.cache.ttl=10' >> /usr/lib/jvm/java-1.7-openjdk/jre/lib/security/java.security
Run Code Online (Sandbox Code Playgroud)

它将DNS TTL属性(networkaddress.cache.ttl)设置为10秒.

该变量networkaddress.cache.negative.ttl已设置为其默认值(10).

行为不会改变.我java.net.UnknownHostException反复得到很多.

可能是问题的原因是什么?

Dmi*_*san 5

在我的情况下,Java应用程序java.net.UnknownHostException在docker中运行时失败。原因是我使用了--network=nonedocker标志(通过dhcp和管道工作获取IP /主机名)。在这种情况下,泊坞窗不会/etc/hosts

127.0.0.1 15e326aecf84

getCanonicalHostName()Java函数抛出该异常。

可能的解决方案:

  • /etc/hosts通过docker run参数将主机名条目添加到文件--hostname=your-hostname.com
  • 切换到Docker管理的网络配置


Nic*_*aro 1

我通过切换到 Oracle JRE 8 并在 Dockerfile 中使用以下 hack 设法摆脱了 DNS 问题:

RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf
Run Code Online (Sandbox Code Playgroud)

我在Docker Hub上创建了一个可用的 Java 8 docker 容器(代码位于github上)。