【问题标题】:ElasticSearch on docker - 2nd instance kills the first instancedocker 上的 ElasticSearch - 第二个实例杀死第一个实例
【发布时间】:2017-11-29 06:06:12
【问题描述】:

我正在尝试同时运行多个版本的 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 的情况下运行它,我不会向 UI 返回任何有关 docker 停止原因的信息。

【问题讨论】:

  • 你给 docker 多少内存? ES 5 默认从 2GB 堆开始(参见 jvm.options),所以如果你的 Docker 没有至少 4GB,第一个实例确实会被杀死。
  • 我没有指定任何自定义内容。
  • 大概就是这样。我如何告诉 docker 只使用 500M 的内存?
  • 我会说,你可能应该在每台服务器上使用少于 2GB 的堆来启动 ES。
  • 你是对的@Val,添加 -e ES_JAVA_OPTS="-Xms200m -Xmx200m" 修复了它。想写一个答案,我会给你积分? :)

标签: docker elasticsearch


【解决方案1】:

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

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

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 在 cmets 中真正回答了这个问题。

【讨论】:

  • 很高兴它为您服务。虽然 ES 只有 200MB 的堆,但你不会走得太远;-)
【解决方案2】:

如果这是内存不足的问题,您可以检查您的容器是否OOMKilled (OOM)。

首先检查容器的退出代码是否为 137 = (128+9) 容器收到了 SIGKILL。
您可以使用docker ps -a 或

进行测试
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 标志不是 设置,这可能会导致主机内存不足并需要 杀死主机的系统进程以释放内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 2018-11-02
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多