【Docker】部署Elasticsearch与Kibana完全指南


问题背景

Elasticsearch 和 Kibana 是强大的数据存储、搜索和可视化工具,但传统部署方式复杂且依赖较多。使用 Docker 容器化技术可以大幅简化部署流程,提高环境一致性。本文将详细介绍如何使用 Docker 部署 Elasticsearch 和 Kibana,包括单节点部署、集群配置、安全设置以及常见问题解决方案。

1. 环境准备

1.1 系统要求

  • Docker Engine 19.03+
  • Docker Compose 1.25+(可选,用于多容器编排)
  • 至少 4GB 可用内存(生产环境建议 8GB+)
  • 足够的磁盘空间(建议 20GB+)

1.2 系统参数调整

在 Linux 系统上,需要调整一些系统参数以确保 Elasticsearch 正常运行:

# 临时调整(重启后失效)
sysctl -w vm.max_map_count=262144

# 永久调整
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p

2. 单节点部署

2.1 使用 Docker 命令部署 Elasticsearch

# 创建网络
docker network create elastic

# 创建数据目录
mkdir -p /data/elasticsearch/data

# 设置目录权限
chmod 777 /data/elasticsearch/data

# 运行 Elasticsearch 容器
docker run -d \
  --name elasticsearch \
  --net elastic \
  -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
  -v /data/elasticsearch/data:/usr/share/elasticsearch/data \
  elasticsearch:8.11.1

2.2 部署 Kibana

# 运行 Kibana 容器
docker run -d \
  --name kibana \
  --net elastic \
  -p 5601:5601 \
  -e "ELASTICSEARCH_HOSTS=http://elasticsearch:9200" \
  kibana:8.11.1

2.3 验证部署

# 检查 Elasticsearch 是否正常运行
curl http://localhost:9200

# 访问 Kibana
# 在浏览器中打开 http://localhost:5601

3. 使用 Docker Compose 部署

3.1 创建 docker-compose.yml 文件

version: '3'
services:
  elasticsearch:
    image: elasticsearch:8.11.1
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - xpack.security.enabled=true
      - ELASTIC_PASSWORD=changeme
    volumes:
      - es_data:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"
      - "9300:9300"
    networks:
      - elastic
    restart: unless-stopped

  kibana:
    image: kibana:8.11.1
    container_name: kibana
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTICSEARCH_PASSWORD=changeme
    ports:
      - "5601:5601"
    networks:
      - elastic
    depends_on:
      - elasticsearch
    restart: unless-stopped

networks:
  elastic:
    driver: bridge

volumes:
  es_data:
    driver: local

3.2 启动服务

docker-compose up -d

4. Elasticsearch 配置详解

4.1 内存配置

Elasticsearch 是内存密集型应用,合理配置内存对性能至关重要:

environment:
  - ES_JAVA_OPTS=-Xms1g -Xmx1g  # 设置JVM堆内存大小

4.2 集群配置

部署 Elasticsearch 集群:

version: '3'
services:
  es01:
    image: elasticsearch:8.11.1
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    volumes:
      - es01_data:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"
    networks:
      - elastic
    ulimits:
      memlock:
        soft: -1
        hard: -1

  es02:
    image: elasticsearch:8.11.1
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    volumes:
      - es02_data:/usr/share/elasticsearch/data
    networks:
      - elastic
    ulimits:
      memlock:
        soft: -1
        hard: -1

  es03:
    image: elasticsearch:8.11.1
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    volumes:
      - es03_data:/usr/share/elasticsearch/data
    networks:
      - elastic
    ulimits:
      memlock:
        soft: -1
        hard: -1

  kibana:
    image: kibana:8.11.1
    container_name: kibana
    environment:
      - ELASTICSEARCH_HOSTS=http://es01:9200
    ports:
      - "5601:5601"
    networks:
      - elastic
    depends_on:
      - es01

networks:
  elastic:
    driver: bridge

volumes:
  es01_data:
    driver: local
  es02_data:
    driver: local
  es03_data:
    driver: local

4.3 安全配置

启用 X-Pack 安全功能:

environment:
  - xpack.security.enabled=true
  - ELASTIC_PASSWORD=your_secure_password
  - xpack.security.transport.ssl.enabled=true
  - xpack.security.transport.ssl.verification_mode=certificate
  - xpack.security.transport.ssl.keystore.path=/usr/share/elasticsearch/config/elastic-certificates.p12
  - xpack.security.transport.ssl.truststore.path=/usr/share/elasticsearch/config/elastic-certificates.p12

4.4 日志配置

配置 Elasticsearch 日志:

environment:
  - logger.level=INFO
  - logger.discovery=DEBUG

5. Kibana 配置详解

5.1 基本配置

environment:
  - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
  - SERVER_NAME=kibana
  - SERVER_HOST=0.0.0.0
  - ELASTICSEARCH_USERNAME=elastic
  - ELASTICSEARCH_PASSWORD=your_secure_password

5.2 插件配置

预装插件的 Kibana 配置:

FROM kibana:8.11.1
RUN bin/kibana-plugin install plugin_name

6. 数据持久化

6.1 使用命名卷

volumes:
  - es_data:/usr/share/elasticsearch/data

6.2 使用绑定挂载

volumes:
  - /path/on/host:/usr/share/elasticsearch/data

7. 常见问题与解决方案

7.1 内存不足

问题:Elasticsearch 容器启动失败,日志显示内存不足。

解决方案

  1. 增加主机内存
  2. 调整 ES_JAVA_OPTS 参数,减少内存分配
  3. 检查系统其他进程占用

7.2 权限问题

问题:数据目录权限错误

解决方案

chown -R 1000:1000 /path/to/elasticsearch/data

7.3 集群无法形成

问题:节点无法发现彼此

解决方案

  1. 检查网络配置
  2. 确保 discovery.seed_hosts 配置正确
  3. 验证所有节点使用相同的 cluster.name

7.4 Kibana 无法连接 Elasticsearch

问题:Kibana 页面显示无法连接到 Elasticsearch

解决方案

  1. 确保 Elasticsearch 已启动并正常运行
  2. 检查 ELASTICSEARCH_HOSTS 配置是否正确
  3. 如果启用了安全功能,验证用户名和密码是否正确

8. 性能优化

8.1 JVM 堆大小调整

environment:
  - ES_JAVA_OPTS=-Xms2g -Xmx2g

8.2 索引性能优化

PUT /my_index
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1,
    "refresh_interval": "30s"
  }
}

8.3 系统级优化

# 增加文件描述符限制
ulimit -n 65535

# 禁用交换分区
swapoff -a

9. 监控与维护

9.1 使用 Metricbeat 监控

metricbeat:
  image: docker.elastic.co/beats/metricbeat:8.11.1
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock:ro
    - ./metricbeat.yml:/usr/share/metricbeat/metricbeat.yml:ro
  networks:
    - elastic
  depends_on:
    - elasticsearch
    - kibana

9.2 备份与恢复

使用 Elasticsearch 快照功能:

# 注册快照仓库
PUT /_snapshot/my_backup
{
  "type": "fs",
  "settings": {
    "location": "/usr/share/elasticsearch/data/snapshots"
  }
}

# 创建快照
PUT /_snapshot/my_backup/snapshot_1

# 恢复快照
POST /_snapshot/my_backup/snapshot_1/_restore

10. 生产环境最佳实践

  1. 高可用性:部署至少三个主节点,确保集群稳定性
  2. 安全性:启用 X-Pack 安全功能,设置强密码,使用 TLS/SSL 加密
  3. 资源隔离:为 Elasticsearch 节点分配足够且独立的资源
  4. 监控:实施全面的监控策略,及时发现潜在问题
  5. 备份:定期备份数据,测试恢复流程
  6. 日志管理:配置适当的日志轮转策略,避免磁盘空间耗尽
  7. 网络隔离:使用专用网络,限制外部访问

总结

通过 Docker 部署 Elasticsearch 和 Kibana 可以大幅简化安装和配置过程,提高环境一致性和可移植性。本文详细介绍了从单节点部署到集群配置的完整流程,涵盖了安全设置、性能优化和常见问题解决方案。通过遵循这些最佳实践,您可以构建一个稳定、高效、安全的 Elasticsearch


希望这篇文章能帮助您了解Docker部署Elasticsearch 和 Kibana的问题。如果您有任何问题,欢迎在评论区讨论!


文章作者: lucky845
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 lucky845 !
评论
  目录