You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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后失效)

  1. 进入Docker Desktop的虚拟机:
    docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
    
  2. 在虚拟机内设置参数:
    sysctl -w vm.max_map_count=262144
    
  3. 退出虚拟机,重启OpenSearch容器即可。

方式2:永久生效(重启Docker Desktop后保持)

  1. 在主机上创建或编辑~/.docker/daemon.json文件,添加以下内容:
    {
      "sysctls": {
        "vm.max_map_count": "262144"
      }
    }
    
  2. 保存文件后,重启Docker Desktop服务:
    systemctl restart docker-desktop
    
  3. 再次启动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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:00:15