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: 2g
volumes:
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/