Docker上的java.net.UnknownHostException
我正在尝试为ZooKeeper创建docker容器,并在集群模式下配置它们(完整代码为和) 容器基于Alpine Linux(Docker Hub上的Alpine:3.2),但我要描述的问题也发生在官方Java容器(Java:7)上 我使用以下命令启动群集:Docker上的java.net.UnknownHostException,java,dns,docker,Java,Dns,Docker,我正在尝试为ZooKeeper创建docker容器,并在集群模式下配置它们(完整代码为和) 容器基于Alpine Linux(Docker Hub上的Alpine: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 do
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
(它们在docker hub上提供,您可以试用)
如果在启动第二个和第三个容器之前等待一段时间,那么主机名zk2
和zk3
被放入/etc/hosts
太晚了(docker),Java无法找到它们:我在zk1
的日志中为zk2
和zk3
找到了Java.net.UnknownHostException
我在web上发现需要禁用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
它将DNS TTL属性(networkaddress.cache.TTL
)设置为10
秒
变量networkaddress.cache.negative.ttl
已设置为其默认值(10
)
行为没有改变。我反复得到很多java.net.UnknownHostException
问题的原因是什么?我通过切换到Oracle JRE 8并在Dockerfile中使用以下黑客程序,成功地解决了DNS问题:
RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf
我在上创建了一个工作的Java 8 docker容器(代码处于打开状态)。在我的例子中,Java应用程序在docker中运行时出现了
Java.net.UnknownHostException
故障。原因是我使用了--network=none
docker标志(通过dhcp和管道获取ip/主机名)。在这种情况下,docker不会像这样自动添加到/etc/hosts
条目中
127.0.0.1 15e326aecf84
而getCanonicalHostName()
Java函数引发了此异常
可能的解决办法:
- 通过
参数docker run
--hostname=your hostname.com
- 切换到docker管理的网络配置
networkaddress.cache.negative.ttl,并将其显式设置为默认值(10)。