我正在尝试为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)
(它们可以在码头集线器上使用,您可以试用它们).
如果我开始了第二和第三容器之前等待一段时间,然后在主机名zk2和zk3放入/etc/hosts太晚(由码头工人)和Java是无法找到他们:我得到java.net.UnknownHostException在日志zk1两个zk2和zk3.
我在网上发现我需要禁用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反复得到很多.
可能是问题的原因是什么?
在我的情况下,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我通过切换到 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上)。
| 归档时间: |
|
| 查看次数: |
15462 次 |
| 最近记录: |