弹性搜索在Windows Docker镜像中的vm.max_map_count限制

38

我对Docker和Elasticsearch很陌生。 我使用Windows 7电脑。我使用docker-compose up命令来启动Docker容器。我的yml文件如下:


elasticsearch:
  image: elasticsearch:5.1.1
  environment:
    ES_JAVA_OPTS: "-Xms1g -Xmx1g"

连同其他相关的图像一起。
我正在使用Docker启动elasticsearch图像,但这样做时我会收到以下错误:

[36melasticsearch_1   |←[0m ERROR: bootstrap checks failed
[36melasticsearch_1   |←[0m max virtual memory areas vm.max_map_count [65530]  is too low, increase to at least [262144]
[36melasticsearch_1   |←[0m [2017-02-08T11:06:51,752][INFO ][o.e.n.Node

我在谷歌上搜索解决方法,到处都建议使用sudo sysctl vm.max_map_count=262144,但在Windows中,sysctl不可用。没有给出关于Windows的明确步骤。

我的机器上有其他Docker镜像正在运行,所以Docker是可以工作的。

有人能给一些线索来解决这个问题吗?


1
感谢您提出这个问题。我在下面的建议中找到了答案。如果您选择正确答案,您可能会在未来节省其他人的时间。 - Steve Tomlin
13个回答

122

我已经卡在这个问题上好几个月了,解决方法是在cmd.exe上执行以下命令(如果cmd不起作用,请尝试Powershell或Bash),如官方的Elasticsearch文档中所述

1) wsl -d docker-desktop
2) sysctl -w vm.max_map_count=262144

现在,您已经准备好开始使用Elasticsearch了!


4
救了我!唯一的问题是,在CMD中运行它没用,但在PowerShell中运行就解决了这个问题。 - Talkhak1313
1
救了我..谢谢 - Sunny Tambi
如果 wsl -d docker-desktop 命令不能进入 docker-desktop 子系统,执行第二个命令时会提示找不到 sysctl。此时,请尝试在 Docker Desktop 应用程序中取消选中“使用基于 WSL 2 的引擎”,然后再次选中它。 - Yuefeng Li
1
非常感谢,省了我几个小时的搜索时间。 - Asaad Mamoun

21

目前,根据这个问题,使其工作的方法是通过在其中输入wsl -d docker-desktopsysctl -w vm.max_map_count=262144

一些人通过使用echo "vm.max_map_count = 262144" > /etc/sysctl.d/99-docker-desktop.confecho -e "\nvm.max_map_count = 262144\n" >> /etc/sysctl.d/00-alpine.conf来使其持久化,但这些方法都无法解决我的问题。


1
这对我有用,因为docker-machine ssh不是一个选项。 - Severin
1
是的,我忘了提到,因为我正在处理WSL,所以“docker-machine ssh”也不是一个选项! - João Ciocca
1
好的回答,人们常常忘记并非每个人都想使用不同的发行版。我使用带有WSL 2的Docker-Desktop,并使用Debian。 - Trevor
2
请使用以下命令:wsl -d docker-desktop echo 262144 >> /proc/sys/vm/max_map_count - Josh
干得好!100% 工作正常。 - user2447290

9

关闭 Docker 后,使用 wsl --shutdown 命令关闭 WSL2,然后启动 Docker。 - Max

8

Elasticsearch已经解决了这个问题。

我在Win 10 Pro版本10.0.19042.685上使用ES 7.10,在Docker Engine v20.10.0上也可正常运行。

问题出现在主机Linux机器(WSL2)上,而不是容器中。

请参见Windows与Docker Desktop WSL 2后端部分: https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#_set_vm_max_map_count_to_at_least_262144

-d发行版(例如非Ubuntu)。

wsl -d docker-desktop
sysctl -w vm.max_map_count=262144

之后,我的3个节点集群的docker-compose启动成功。


2
嗨,回答不错,但有没有办法让这个变得永久?似乎我总是不得不这样做。 - Joe Yahchouchi

6
您可以使用以下命令设置vm.max_map_count:
docker-machine ssh
sudo sysctl -w vm.max_map_count=262144

如果您通过SSH进入docker-machine,则此方法有效。我在Windows 7上使用Docker toolbox(遗留要求)执行此操作。 - Namphibian
如果我的机器没有docker-machine命令,那么出了什么问题? - Jolta

3

我尝试了所有的方法,但都没能解决问题... 然而我用这种方式最终设置成功了。

  1. 创建一个批处理文件比如 (set_vm_max.bat)
  2. 在文件中写入命令 "wsl -ddocker-desktop sysctl -w vm.max_map_count=262144"
  3. 现在需要将文件复制到启动位置,按下 "Windows + R"
  4. 输入 "shell:startup" 并按下 Enter.
  5. 将你刚刚创建的文件复制到启动位置。

验证它是否有效:

  1. 重新启动
  2. wsl -d docker-desktop
  3. cat /proc/sys/vm/max_map_count

2

2
您在正常或生产模式下启动了Elasticsearch,从版本5开始包含引导检查,如果它们失败,Elasticsearch将无法启动。

https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html

然而,你可以在Windows上运行开发模式,只会出现警告。尝试运行弹性本身的镜像即可。

docker run -p 9200:9200 -e "http.host=0.0.0.0" \
 -e "transport.host=127.0.0.1" \
 docker.elastic.co/elasticsearch/elasticsearch:5.2.0

https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html


1

由于我对Docker还很陌生,所以对基础知识感到困惑。现在我已经找到了解决方案。 在安装在Windows上的Docker中,创建了一个Oracle VM Linux盒子。我打开了它,然后添加了sudo sysctl vm.max_map_count=262144,问题就解决了。


你是从哪里找到那个的? - João Ciocca

1

无意中发现了更简单的解决方案,适用于wsl2用户,在您的默认wsl2分发shell中运行以下命令即可:

sudo sysctl -w vm.max_map_count=262144

例如:

enter image description here


如何打开这样的 shell? - Luk Aron
@Luck-Aron 如果你指的是shell,那就是Windows终端;如果你指的是信息,那就安装并运行neofetch吧。 - Jay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接