gpt4 book ai didi

Docker 上的 java.net.UnknownHostException

转载 作者:IT老高 更新时间:2023-10-28 21:38:02 27 4
gpt4 key购买 nike

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

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

(它们在 docker hub 上可用,你可以试试)。

如果我在启动第二个和第三个容器之前等待一段时间,然后将主机名 zk2zk3 放入 /etc/hosts 为时已晚(通过 docker),Java 无法找到它们:我在 zk1 的日志中得到 java.net.UnknownHostException 对于两个 zk2zk3.

我在网上发现我需要禁用 JVM DNS 缓存才能刷新主机名,所以我在 Dockerfile 中引入了以下命令以更新 java.安全设置:

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 标志(通过 dhcp 和管道获取 ip/hostname)。在这种情况下,docker 不会自动添加到 /etc/hosts 条目中,例如

127.0.0.1 15e326aecf84

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

可能的解决方案:

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

关于Docker 上的 java.net.UnknownHostException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32537977/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com