java.net.UnknownHostException on Docker

I am trying to create docker containers for ZooKeeper and configure them in cluster mode (full code is here and here).

Containers are based on Alpine Linux (alpine:3.2 on Docker Hub), but the problem that I’m going to describe happens also with the official Java container (java:7).

  • How to get the IP address of the docker host from inside a docker container
  • How can JVMs running inside Bluemix container groups be monitored?
  • Docker force container to specific physical interface
  • Boot2Docker Image (Ubuntu) Download Very Slow on Windows 8.1
  • repo.typesafe.com Moved Temporarily (predicitonio) quick start app
  • kubernetes installation and kube-dns: open /run/flannel/subnet.env: no such file or directory
  • I use the following commands to start the cluster:

    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
    

    (They are available on docker hub, you can try them).

    If I wait some time before starting the second and third containers, then the host names zk2 and zk3 are put in /etc/hosts too late (by docker), and Java is unable to find them: I get java.net.UnknownHostException in the logs of zk1 for both zk2 and zk3.

    I found on the web that I need to disable JVM DNS cache in order to refresh the host names, so I introduced the following command in the Dockerfile in order to update the java.security settings:

    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
    

    It sets the DNS TTL property (networkaddress.cache.ttl) to 10 seconds.

    The variable networkaddress.cache.negative.ttl is already set to its default value (10).

    The behavior does not change. I get lots of java.net.UnknownHostException repeatedly.

    What can be the cause of the problem?

  • Docker web terminal
  • Kubernetes Replication controller deletion
  • Running java command with Docker exec fails with “no such file or directory”
  • How could I bind docker container to specific external interface
  • Crypt32.dll not found for awssdk in .net core running in docker
  • How to create local mirror for ubuntu inside docker container?
  • 2 Solutions collect form web for “java.net.UnknownHostException on Docker”

    I managed to get rid of the DNS issues by switching to Oracle JRE 8 and using the following hack in the Dockerfile:

    RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf
    

    I created a working Java 8 docker container container on Docker Hub (the code is on github).

    In my case (java application was failing with java.net.UnknownHostException when running in docker), the reason was that I used --network=none docker flag (getting ip/hostname via dhcp and pipework). In this case, docker does not add automatically to /etc/hosts entry like

    127.0.0.1 15e326aecf84

    And getCanonicalHostName() Java function threw this exception.

    Possible solutions:

    • add hostname entry to /etc/hosts file via docker run parameter --hosname=your-hostname.com
    • switch to docker-managed network configuration
    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.