在Windows 10上使用Desktop Docker运行Elasticsearch时,可能会遇到以下报错:
node validation exception
[1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch.
bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
这篇文章将介绍三种解决这个问题的方法。首先需要了解Desktop Docker的工作原理。
Desktop Docker与WSL子系统
Desktop Docker依赖于Windows的WSL(Windows Subsystem for Linux)子系统,以便在Windows环境中运行Linux容器。可以在命令提示符(CMD)窗口中使用以下命令查询当前的WSL子系统:
wsl --list
这将显示出如下结果:
docker-desktop-data (默认)
docker-desktop
docker-desktop-data
- 作用:该子系统负责存储Docker的持久化数据,包括镜像、容器、卷、网络等。这些数据在容器停止或重新启动后仍然保留,确保数据不会丢失。
docker-desktop
- 作用:该子系统是Docker引擎运行的环境,它包含了所有必要的工具和服务,以便在Windows上运行Docker容器。通过这个子系统,Docker可以在Windows系统上执行Linux容器。
解决报错的方法
为了解决Elasticsearch的启动报错,我们需要调整Docker子系统的虚拟内存映射计数。以下是三种解决方法:
方法一:修改/proc/sys/vm/max_map_count
文件
- 打开命令提示符(CMD)或PowerShell。
- 切换到
docker-desktop
子系统:
wsl -d docker-desktop
解释:
wsl -d docker-desktop
:该命令用于启动并切换到指定的WSL子系统(在这里是docker-desktop
),使我们能够在该子系统中执行命令。
- 在
docker-desktop
子系统中运行以下命令:
echo 262144 >> /proc/sys/vm/max_map_count
解释:
echo 262144 >> /proc/sys/vm/max_map_count
:该命令将值262144
写入/proc/sys/vm/max_map_count
文件中。/proc/sys/vm/max_map_count
文件指定了系统允许的最大虚拟内存区域数。默认值为65530,而Elasticsearch要求至少为262144。通过修改这个值,我们可以满足Elasticsearch的启动要求。
为什么是/proc/sys/vm/max_map_count
路径
在Linux系统中,/proc
文件系统提供了一种机制,允许内核和进程间进行通信,/proc/sys
目录包含了可以通过sysctl接口动态修改的内核参数。vm.max_map_count
是一个内核参数,它控制单个进程可以拥有的最大虚拟内存区域数。通过调整这个参数,可以满足特定应用程序(如Elasticsearch)的资源需求。
方法二:使用sysctl命令临时修改
- 打开命令提示符(CMD)或PowerShell。
- 切换到
docker-desktop
子系统:
wsl -d docker-desktop
- 在
docker-desktop
子系统中运行以下命令:
sysctl -w vm.max_map_count=262144
解释:
sysctl -w vm.max_map_count=262144
:该命令临时将vm.max_map_count
的值设置为262144
。这种修改方式在系统重启后会失效,需要重新设置。
方法三:永久修改sysctl配置文件
- 打开命令提示符(CMD)或PowerShell。
- 切换到
docker-desktop
子系统:
wsl -d docker-desktop
- 在
docker-desktop
子系统中编辑/etc/sysctl.conf
文件:
vi /etc/sysctl.conf
解释:
vi /etc/sysctl.conf
:该命令使用vi编辑器打开/etc/sysctl.conf
文件。
- 按下键盘的
i
键进入编辑模式,然后在文件末尾添加:
vm.max_map_count=262144
-
长按
Shift
并快速按两下z
(即Shift + zz
)保存并退出。 -
使用以下命令检查修改是否成功:
grep vm.max_map_count /etc/sysctl.conf
解释:
grep vm.max_map_count /etc/sysctl.conf
:该命令用于查看/etc/sysctl.conf
文件中是否包含vm.max_map_count=262144
配置,确认修改是否成功。