Docker上的ElasticSearch – 第二个实例杀死了第一个实例

我试图在同一时间运行ElasticSearch的多个版本,应该很容易。 这是我的命令:

docker run -d --rm -p 9250:9200 -p 9350:9300 --name es_5_3_3_integration -e "xpack.security.enabled=false" docker.elastic.co/elasticsearch/elasticsearch:5.3.3 docker run -d --rm -p 9251:9200 -p 9351:9300 --name es_5_4_3_integration -e "xpack.security.enabled=false" docker.elastic.co/elasticsearch/elasticsearch:5.4.3 

第一个docker开始很好。 第二个docker开始,但是以牺牲第一个docker为代价。 如果我没有-d运行它,我没有得到任何有关为什么docker停下来的信息。

默认情况下,docker上的ES尝试占用2G的内存。 所以2名docker工人正试图占用4G内存,而我的机器却没有。

解决scheme:使用以下开关将每个ES实例尝试占用的内存量限制为-e ES_JAVA_OPTS="-Xms200m -Xmx200m"

完整的4个并发docker的工作命令:

 docker run -d --rm -p 9250:9200 -p 9350:9300 --name es_5_3_3_integration -e "xpack.security.enabled=false" -e ES_JAVA_OPTS="-Xms200m -Xmx200m" docker.elastic.co/elasticsearch/elasticsearch:5.3.3 docker run -d --rm -p 9251:9200 -p 9351:9300 --name es_5_4_3_integration -e "xpack.security.enabled=false" -e ES_JAVA_OPTS="-Xms200m -Xmx200m" docker.elastic.co/elasticsearch/elasticsearch:5.4.3 docker run -d --rm -p 9252:9200 -p 9352:9300 --name es_5_5_3_integration -e "xpack.security.enabled=false" -e ES_JAVA_OPTS="-Xms200m -Xmx200m" docker.elastic.co/elasticsearch/elasticsearch:5.5.3 docker run -d --rm -p 9253:9200 -p 9353:9300 --name es_5_6_4_integration -e "xpack.security.enabled=false" -e ES_JAVA_OPTS="-Xms200m -Xmx200m" docker.elastic.co/elasticsearch/elasticsearch:5.6.4 

感谢@Val真的在评论中回答了这个问题。

如果这是缺乏内存问题,您可以检查您的容器是否OOMKILLED ( OOM )。

首先检查容器的退出代码是否是137 =(128 + 9)容器收到一个SIGKILL。
你可以用docker ps -a或者test来testing它

 docker inspect --format='{{.State.ExitCode}}' $INSTANCE_ID 

然后你可以检查容器的状态:

 docker inspect --format='{{.State.OOMKilled}}' $INSTANCE_ID 

如果它返回true,这是一个OOM问题。

进一步的细节在https://docs.docker.com/engine/reference/run/#user-memory-constraints
摘录:

默认情况下,如果发生内存不足(OOM)错误,内核将杀死容器中的进程。 要更改此行为,请使用–oom-kill-disable选项。 只有在您还设置了-m / – memory选项的容器上禁用OOM杀手。 如果未设置-m标志,则可能导致主机内存不足,并要求杀死主机的系统进程以释放内存。