【Docker Compose 部署 Elasticsearch 9.1.2】

发布于:2025-08-31 ⋅ 阅读:(35) ⋅ 点赞:(0)

1. 概要

本文适用于:在内网环境下以 Docker Compose 快速搭建 Elasticsearch 9.1.2 的场景(单节点起步、数据/日志挂载到宿主机、关闭不必要的安全配置以便快速验证)。

注意(安全声明):文中提供的关闭认证/关闭 TLS 等设置只适合受控内网或测试环境。生产环境强烈必须开启安全(身份认证、传输加密、访问控制)并采用私钥/证书管理等措施。

2. ES8 vs ES9 — 为什么选择 ES9(关键差异)

以下为面向时间序列日志/大数据保存场景(如 GitHub 日志)时,ES9 相较于 ES8 的主要优势与差异:

主要改进(摘要)

性能与存储效率提升:ES9 基于更新的 Lucene 版本,包含索引压缩与列存储优化,常见查询与聚合在同样硬件下更快、占用更少磁盘。

时间序列增强(TSDS/数据流优化):ES9 在 time-series / data-stream 场景有针对性优化(适合高频写入、按时间查找与 ILM 自动化)。

ILM 更成熟:索引生命周期管理在 ES9 更完善,rollover、forcemerge、shrink、freeze 与 searchable snapshot 的配合更稳定,便于实现热/温/冷/冻结分层。

聚合与查询改进:聚合框架与事件查询(EQL)及聚合性能优化,做 Summary / Transform 或实时聚合时更快速。

Searchable Snapshot 与冷存更灵活:冷数据转为可搜索快照(挂载到对象存储)效率更好,查老数据成本更低。

更少的管理开销(索引数目/元数据):配合 data stream 与 rollover,避免“按天创建巨大索引数”的做法,使长期(20 年)存储的索引元数据可控。

迁移与兼容性注意

ES 的主版本升级(如 8 → 9)可能会有破坏性变更(某些弃用的 API、插件兼容性),升级前需要充分测试并读官方迁移指南。

生产环境升级建议采用:先在测试环境恢复 snapshot,验证 mapping、查询与业务逻辑,再做滚动升级或蓝绿切换。

3. 宿主机准备(必做)

在开始之前,在宿主机上做几项系统配置,避免容器运行时遇到权限或 kernel 限制问题。

3.1 修改 vm.max_map_count

Elasticsearch 要求 vm.max_map_count 足够大:

永久设置

echo 'vm.max_map_count=262144' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

临时设置(重启后失效)

sudo sysctl -w vm.max_map_count=262144

3.2 文件句柄与进程限制(可选,保证更高并发)

可以创建一个 limits 配置文件:

sudo tee /etc/security/limits.d/elasticsearch.conf > /dev/null <<'EOF'
Elasticsearch recommended limits
* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096
EOF

说明:容器内通过 docker-compose 设置的 ulimits 会生效。上面是为系统登陆/服务设置持久 ulimit 的建议。

3.3 创建数据与日志挂载目录并设置权限

本文使用的宿主机目录:/opt/es9/data、/opt/es9/logs。

sudo mkdir -p /opt/es9/data /opt/es9/logs

bitnami/elasticsearch 镜像内部运行 uid=1001 的用户,给出对应权限

sudo chown -R 1001:1001 /opt/es9

4. Docker Compose(单节点,可扩展)

把下面 docker-compose.yml 保存到宿主机(比如 /opt/es9/docker-compose.yml)。该配置:

使用 bitnami/elasticsearch:9.1.2

单节点模式(discovery.type=single-node)

关闭 xpack 安全以便在内网快速验证

数据与日志挂载到宿主机

提供 ulimits 与 ES_JAVA_OPTS

version: '3.8'
services:
  elasticsearch:
    image: bitnami/elasticsearch:9.1.2
    container_name: es9
    environment:
      - discovery.type=single-node          # 单节点模式
      - xpack.security.enabled=false        # 关闭安全认证(仅限内网/测试)
      - xpack.security.http.ssl.enabled=false
      - xpack.security.transport.ssl.enabled=false
      - ES_JAVA_OPTS=-Xms2g -Xmx2g          # 根据宿主机内存调整
      - bootstrap.memory_lock=true
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65535
        hard: 65535
    volumes:
      - /opt/es9/data:/bitnami/elasticsearch/data
      - /opt/es9/logs:/bitnami/elasticsearch/logs
    ports:
      - "9200:9200"
      - "9300:9300"
    restart: unless-stopped

提示:ES_JAVA_OPTS 的值需要和宿主机内存相匹配(推荐把可用内存的一半给 heap,且不超过 31GB)。

5. 启动与测试

启动:

cd /opt/es9
docker-compose up -d

查看容器日志:

docker-compose logs -f elasticsearch

测试 ES 是否可用:

curl http://localhost:9200

期望返回 JSON(包含 version.number: “9.1.2” 等信息)。

6. 挂载路径与镜像内部说明

数据目录(宿主机):/opt/es9/data → 映射到容器 /bitnami/elasticsearch/data。

日志目录(宿主机):/opt/es9/logs → 映射到容器 /bitnami/elasticsearch/logs。

Bitnami 镜像内部以 1001 用户运行(因此需要 chown)。如果使用官方 elasticsearch 镜像,uid/gid 可能不同,请根据镜像文档调整权限。

7. 扩展到多节点(示意)

当你要扩展为真正的集群(多节点)时,需要在每个节点的 compose 中配置如下核心变量(示例片段):

discovery.seed_hosts:用于发现其他 master-eligible 节点

cluster.initial_master_nodes:首次启动时的 master 候选列表

node.name:节点名

示例环境变量(在新增节点服务中加入):

environment:
  - node.name=es9-1
  - discovery.seed_hosts=es9-1,es9-2,es9-3
  - cluster.initial_master_nodes=es9-1,es9-2,es9-3
  - ES_JAVA_OPTS=-Xms4g -Xmx4g

另外:

每个节点应有独立的数据目录(不要把多个节点的数据目录挂载到同一位置),

网络要确保容器之间能互相访问 9300 端口(transport)。

8. 生产建议(不要忽略)

在生产请开启安全:设置 xpack.security.enabled=true、配置 TLS、为内置用户生成密码或使用 Elasticsearch keystore。关闭安全仅限受控测试环境。

备份快照:在长期保存数据场景下,请配置 snapshot repository(S3/MinIO/FS),并定期 snapshot。

ILM 与 Data Streams:如果你保存大量时间序列日志(如每日 GitHub 日志),建议使用 Data Stream + ILM(rollover)来控制 backing index 数量与生命周期。

监控与资源规划:观察 JVM heap usage、GC、IOPS、CPU;为写入高峰准备 buffer。

9. 常见问题排查

容器无法启动 / 集群未形成:检查 vm.max_map_count 是否设置;查看容器日志是否有 permission denied。

权限问题:确保宿主机目录 chown 给容器内运行用户(本示例为 1001)。

内存不足 / OOM:降低 ES_JAVA_OPTS 或扩大宿主机内存;避免把 heap 设得过高(不超过物理内存的一半,且最好 <= 31GB)。

10. 附:快速命令汇总
设置 kernel 参数
echo ‘vm.max_map_count=262144’ | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

创建目录与权限
sudo mkdir -p /opt/es9/data /opt/es9/logs
sudo chown -R 1001:1001 /opt/es9

启动
cd /opt/es9
docker-compose up -d

查看日志
docker-compose logs -f elasticsearch

测试
curl http://localhost:9200


网站公告

今日签到

点亮在社区的每一天
去签到