Ubuntu 22.04 Docker部署OpenSearch遇vm.max_map_count配置失效问题
问题
我在Ubuntu 22.04上用Docker部署OpenSearch时,启动容器出现错误:
vm.max_map_count is set, but still get error: vm.max_map_count [65530] is too low, increase to at least [262144]
但我已经执行了以下操作:
- 在
/etc/sysctl.conf中添加vm.max_map_count=262144 - 用sudo执行
sysctl -w vm.max_map_count=262144 - 用sudo执行
sysctl -p - 用sudo执行
sysctl vm.max_map_count,返回结果为vm.max_map_count = 262144
为什么OpenSearch识别不了我设置的vm.max_map_count?它获取的数值来自哪里?
补充信息
我的docker-compose配置文件opensearch.yaml内容如下:
version: '3' services: opensearch-node1: # 这也是容器在Docker网络内的主机名(即https://opensearch-node1/) image: opensearchproject/opensearch:latest # 使用最新镜像,可修改为指定版本 container_name: opensearch-library environment: - cluster.name=library # 集群名称 - node.name=opensearch-library-node1 # 该容器内运行的节点名称 - discovery.seed_hosts=opensearch-library-node1 # 发现集群时要查找的节点 - cluster.initial_cluster_manager_nodes=opensearch-library-node1 # 有资格作为集群管理器的节点 - bootstrap.memory_lock=true # 禁用JVM堆内存交换 - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" # 设置JVM堆内存最小和最大值,至少为系统RAM的50% ulimits: memlock: soft: -1 # 设置内存锁定为无限制(无软限制或硬限制) hard: -1 nofile: soft: 65536 # opensearch用户的最大打开文件数,至少设为65536 hard: 65536 volumes: - opensearch-library-data1:/home/martin/sixteenTB/librarysearch # 创建名为opensearch-data1的卷并挂载到容器 ports: - 9200:9200 # REST API端口 - 9600:9600 # 性能分析器端口 networks: - opensearch-net # 所有容器加入同一个Docker桥接网络 opensearch-dashboards: image: opensearchproject/opensearch-dashboards:latest # 确保opensearch-dashboards版本与其他节点的opensearch版本匹配 container_name: opensearch-dashboards ports: - 5601:5601 # 将主机端口5601映射到容器端口5601 expose: - "5601" # 暴露端口5601用于Web访问OpenSearch Dashboards environment: OPENSEARCH_HOSTS: '["https://opensearch-node1:9200"]' # 定义OpenSearch Dashboards要查询的OpenSearch节点 networks: - opensearch-net volumes: opensearch-library-data1: networks: opensearch-net:
补充信息2
我意识到自己用的是Docker Desktop。是不是每个容器都运行在独立VM里?怎么在这些VM内配置这个内核参数?
解答
原因分析
你在主机Ubuntu上设置的vm.max_map_count对Docker Desktop不生效,因为Docker Desktop在Ubuntu上是通过独立的Linux虚拟机运行容器的,而非直接使用主机内核。容器实际读取的是这个虚拟机的内核参数,而非你主机的设置,所以会显示数值为65530。
解决方案
方式1:临时生效(重启Docker Desktop后失效)
- 进入Docker Desktop的虚拟机:
docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh - 在虚拟机内设置参数:
sysctl -w vm.max_map_count=262144 - 退出虚拟机,重启OpenSearch容器即可。
方式2:永久生效(重启Docker Desktop后保持)
- 在主机上创建或编辑
~/.docker/daemon.json文件,添加以下内容:{ "sysctls": { "vm.max_map_count": "262144" } } - 保存文件后,重启Docker Desktop服务:
systemctl restart docker-desktop - 再次启动OpenSearch容器,参数会自动应用到Docker的虚拟机中。
方式3:在docker-compose中直接指定(仅对当前容器生效)
可以在opensearch-node1服务的配置中添加sysctls字段,强制设置该参数:
services: opensearch-node1: # 其他配置不变 sysctls: - vm.max_map_count=262144
修改后重新执行docker-compose up -d即可。
内容的提问来源于stack exchange,提问作者Martin Eve
相关产品推荐
相关产品推荐

