当前位置: 首页 > 面试题库 >

Docker上的java.net.UnknownHostException

洪彬
2023-03-14
问题内容

我正在尝试为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 dockmob/zookeeper -s zk1,zk2,zk3
docker run -d -h zk3 --name zk3 dockmob/zookeeper -s zk1,zk2,zk3

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

如果我等待一段时间开始的第二和第三个容器,那么主机名之前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

它将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

我在Docker Hub上创建了一个工作正常的Java 8
docker容器(代码在github上)。



 类似资料:
  • 问题内容: 在Docker网站上,我看到提到“裸机”上的Docker。这是否意味着您可以在没有基础操作系统的硬件上运行Docker? 如果是这样,将如何进行安装/实施? 问题答案: 这有点欺骗性,但是我很确定他们的意思是他们会发行一个Ubuntu发行版,您可以将其安装在未格式化的(无OS)计算机上。话虽如此,我发现的说明假设您将自己找到并安装操作系统: https://docs.docker.co

  • 我只是尝试WSL 2与Docker的Windows和我有一个问题与安装卷: 容器构建和启动良好,我使用docker exec很好地访问它,但是容器中的文件夹没有绑定到我的笔记本电脑文件夹。但是,正确的路径实际上正确地安装在运行的容器上: (这里我在主机上进行pwd,以确定它是否与安装在容器上的内容完全匹配) 这是portainer的屏幕,告诉我容器中安装了什么路径,所有内容都匹配。 我在主机上的应

  • 我有一个centos机器/服务器,我想在其中运行多个docker容器实例,其中有docker-machines和virtualbox驱动程序,用于测试目的。这是可行的吗? 我有一张最新Centos7的docker图像。然后我跑了

  • 问题内容: 最近,我读了一些新闻报道,指出微软正在与Docker合作使Docker在Windows Server上本地运行。 我想问的是,这将允许Windows应用程序在docker容器中运行,还是这是一种运行已经可用的docker映像库(在其中运行linux派生的特定子集)的一种方法Windows不使用VM? 问题答案: 这是关于在Windows主机中运行Windows容器。 Linux的容器仍

  • 我对Java和Spring很陌生。我正在寻找一个容器化的解决方案,它可以监视文件夹,重新构建项目,并利用Spring devols热交换重新加载更改的类。 我进行了搜索,但我一直在寻找生产就绪容器,构建和运行的步骤是分开的。我尝试使用两个不同的容器,一个带有Gradle的容器保持构建(),另一个容器执行构建结果: 它失败了,因为Java在容器中找不到依赖项(Spring、devtools、h2等)

  • 背景: 我已经安装了流浪者和虚拟盒子。我不能改变这个设置,因为它非常微妙和重要。 现在当我在windows 10上安装docker时,docker想启用hyper-v,但现在我无法将我的虚拟机升级为流浪者。 问题: 由于docker on mac使用虚拟盒子驱动程序,有没有解决方案让docker在windows上使用虚拟盒子?