Elasticsearch in Docker container cluster Elasticsearch in Docker container cluster docker docker

Elasticsearch in Docker container cluster


I was able to get clustering working using unicast across two docker hosts. I just happen to be using the ehazlett/elasticsearch image, but I do not think this should matter all that much. The really important bit seems to be setting the network.publish_host setting to a public or routable IP its docker host.

Configuration


docker-host-01

eth0: 192.168.1.10Docker version 1.4.1, build 5bc2ff8/1.4.1

docker-host-02

eth0: 192.168.1.20Docker version 1.4.1, build 5bc2ff8/1.4.1

Building the Cluster


On Docker Host 01

docker run -d \  -p 9200:9200 \  -p 9300:9300 \  ehazlett/elasticsearch \  --cluster.name=unicast \  --network.publish_host=192.168.1.10 \  --discovery.zen.ping.multicast.enabled=false \  --discovery.zen.ping.unicast.hosts=192.168.1.20 \  --discovery.zen.ping.timeout=3s \  --discovery.zen.minimum_master_nodes=1

On Docker Host 02

docker run -d \  -p 9200:9200 \  -p 9300:9300 \  ehazlett/elasticsearch \  --cluster.name=unicast \  --network.publish_host=192.168.1.20 \  --discovery.zen.ping.multicast.enabled=false \  --discovery.zen.ping.unicast.hosts=192.168.1.10 \  --discovery.zen.ping.timeout=3s \  --discovery.zen.minimum_master_nodes=1


Using docker-compose is much easier than running it manually in command line:

elasticsearch_master:    image: elasticsearch:latest    command: "elasticsearch -Des.cluster.name=workagram -Des.node.master=true -Des.node.data=false"    environment:       - ES_HEAP_SIZE=512m    ports:      - "9200:9200"      - "9300:9300"elasticsearch1:    image: elasticsearch:latest    command: "elasticsearch -Des.cluster.name=workagram -Des.discovery.zen.ping.unicast.hosts=elasticsearch_master"    links:      - elasticsearch_master    volumes:      - "/opt/elasticsearch/data"    environment:       - ES_HEAP_SIZE=512melasticsearch2:    image: elasticsearch:latest    command: "elasticsearch -Des.cluster.name=workagram -Des.discovery.zen.ping.unicast.hosts=elasticsearch_master"    links:      - elasticsearch_master    volumes:      - "/opt/elasticsearch/data"    environment:       - ES_HEAP_SIZE=512m


You should be able to communicate the two containers running in different hosts as far as the host machines are accessible between them in the ports needed. I think your problem is that you are trying to use ElasticSearch multicast discovery, but if then you need to expose also port 54328 of the containers. If it doesn't work you can also try to configure ElasticSearch using unicast, setting adequately the machines IP's in your elasticsearch.yml.