> 技术文档 > Docker 部署 Elasticsearch遇到问题和解决办法_error: elasticsearch exited unexpectedly, with exi

Docker 部署 Elasticsearch遇到问题和解决办法_error: elasticsearch exited unexpectedly, with exi



Docker 部署 Elasticsearch


使用 Docker 部署 Elasticsearch 的一般步骤包括:

  1. 拉取 Elasticsearch 镜像:

    docker pull elasticsearch:8.13.2
  2. 直接运行(不推荐)或使用 Docker Compose(推荐):

    • Docker 运行方式(仅测试):

      docker run -d --name elasticsearch -p 9200:9200 -e \"discovery.type=single-node\" elasticsearch:8.13.2
    • 使用 Docker Compose 可配置更多参数,便于管理(见后文示例)。


使用以下命令查看所有容器(包括停止的):

docker ps -a

如果容器已经停止,可使用以下命令重启:

docker start <container_id>

若想容器异常退出后自动重启,可以添加自动重启策略:

docker run --restart=always ...

Elasticsearch 容器退出可能有以下原因:

  • 容器内存不足
  • vm.max_map_count 未设置
  • 配置错误
  • Elasticsearch 进程被系统杀死

建议执行以下命令查看详细日志:

docker logs <container_id>

ERROR: Elasticsearch died while starting up, with exit code 137

退出码 137 表示 Elasticsearch 被操作系统强制终止(通常是 OOM,即内存溢出)。建议:

  • 增加容器可用内存
  • 设置 JVM 堆内存大小
  • 增加主机 swap 或释放内存

查看内存信息如下,交换分区为 0,内存基本充足

total used free shared buff/cache available内存: 62Gi 39Gi 22Gi 359Mi 1.3Gi 22Gi交换: 8.0Gi 8.0Gi 0.0Ki

虽然物理内存充足,但 swap 已全部使用完,可能导致内存压力过大时系统直接杀掉进程。建议:

  • 清理系统资源

  • 增加 swap 分区容量

  • 降低 JVM 堆内存配置,如:

    ES_JAVA_OPTS: \"-Xms1g -Xmx1g\"

删除某个容器并使用 docker-compose.yml 部署 Elasticsearch?

  1. 删除容器:
docker rm elasticsearch
  1. 编写 docker-compose.yml 示例:
version: \'3.8\'services: elasticsearch: image: elasticsearch:8.13.2 container_name: elasticsearch environment: - discovery.type=single-node - ES_JAVA_OPTS=-Xms1g -Xmx1g ports: - \"9200:9200\" volumes: - esdata:/usr/share/elasticsearch/data ulimits: memlock: soft: -1 hard: -1 mem_limit: 2gvolumes: esdata:
  1. 启动服务:
docker compose up -d

使用 nano 粘贴内容格式混乱怎么办?

回答:

YAML 对缩进很敏感,在 nano 粘贴时容易出问题。建议:

  • 使用 vimscpVSCode Remote SSH 编辑

  • 若必须使用 nano,可分段粘贴,或者:

    cat > docker-compose.yml# 粘贴全部内容# 然后按 Ctrl + D 保存退出

使用 scp 上传文件失败的可能原因与解决方法

scp docker-compose.yml username@your-server-ip:/home/username/

提示错误:

scp: /home/username/xxx/docker-compose.yml: Permission denied

分析与解决:

  • 目录不存在或无权限写入:

    1. 登录远程主机:

      ssh username@your-server-ip
    2. 创建目录并赋权限:

      mkdir -p ~/xxx
  • 或者直接上传到主目录:

    scp docker-compose.yml username@your-server-ip:~

上传后再手动移动文件:

mv ~/docker-compose.yml ~/xxx/

节能知识