加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Docker上的java.net.UnknownHostException

发布时间:2020-12-16 03:39:45 所属栏目:安全 来源:网络整理
导读:我正在尝试为ZooKeeper创建docker容器并在集群模式下配置它们(完整代码是here和here). 容器基于Alpine Linux(高山:Docker Hub上的3.2),但我要描述的问题也发生在官方Java容器(java:7)上. 我使用以下命令启动集群: docker run -d -h zk1 --name zk1 dockmo

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

容器基于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,zk3
docker run -d -h zk3 --name zk3 dockmob/zookeeper -s zk1,zk3

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

如果我在启动第二个和第三个容器之前等待一段时间,那么主机名zk2和zk3放在/ etc / hosts中太晚了(通过docker),Java无法找到它们:我得到java.net.UnknownHostException in zk1和zk3的zk1日志.

我在网上发现我需要禁用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.

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

最佳答案
在我的情况下(java应用程序在docker中运行时失败了java.net.UnknownHostException),原因是我使用了–network = none docker flag(通过dhcp和pipework获取ip / hostname).在这种情况下,docker不会自动添加到/ etc / hosts条目中

127.0.0.1 15e326aecf84

而getCanonicalHostName()Java函数抛出了这个异常.

可能的解决方案:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读