Docker 部署 Elasticsearch遇到问题和解决办法_error: elasticsearch exited unexpectedly, with exi
Docker 部署 Elasticsearch
使用 Docker 部署 Elasticsearch 的一般步骤包括:
-
拉取 Elasticsearch 镜像:
docker pull elasticsearch:8.13.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?
- 删除容器:
docker rm elasticsearch
- 编写
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:
- 启动服务:
docker compose up -d
使用 nano 粘贴内容格式混乱怎么办?
回答:
YAML 对缩进很敏感,在 nano
粘贴时容易出问题。建议:
-
使用
vim
、scp
或VSCode 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
分析与解决:
-
目录不存在或无权限写入:
-
登录远程主机:
ssh username@your-server-ip
-
创建目录并赋权限:
mkdir -p ~/xxx
-
-
或者直接上传到主目录:
scp docker-compose.yml username@your-server-ip:~
上传后再手动移动文件:
mv ~/docker-compose.yml ~/xxx/
节能知识