目 录CONTENT

文章目录

【入门篇】2.使用Docker安装Elasticsearch和Kibana

冰点
2023-01-03 / 0 评论 / 0 点赞 / 19 阅读 / 14568 字

使用Docker安装Elastic Stack组件可以大幅简化部署流程

一、环境准备

  1. 安装Docker

    • Linux(CentOS 7):

      sudo yum install -y docker
      sudo systemctl start docker
      sudo systemctl enable docker
      
    • Windows/Mac:
      下载并安装Docker Desktop,确保启用Linux容器支持。

  2. 安装Docker Compose

    sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    

二、单节点部署(开发测试环境)

unsetunset1. 创建Docker Compose配置文件unsetunset

在任意目录下创建docker-compose.yml文件,内容如下:

services:
  elasticsearch:
    image: elasticsearch:7.17.10
    container_name: es-single
    environment:
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"  # 调整内存大小
      - ELASTIC_PASSWORD=admin  # 设置密码(7.17+版本需要)
    volumes:
      - es_data:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - es-network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9200"]
      interval: 30s
      timeout: 10s
      retries: 3

  kibana:
    image: kibana:7.17.10
    container_name: kibana-single
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - ELASTICSEARCH_USER=elastic
      - ELASTICSEARCH_PASSWORD=admin
    ports:
      - 5601:5601
    depends_on:
      elasticsearch:
        condition: service_healthy
    networks:
      - es-network

volumes:
  es_data:

networks:
  es-network:
unsetunset2. 启动服务unsetunset
docker-compose up -d
unsetunset3. 验证安装unsetunset
  • 访问Elasticsearch:http://localhost:9200,使用账号elastic和密码admin(7.17+版本需认证)。

  • 访问Kibana:http://localhost:5601,首次登录使用相同账号密码。

三、集群部署(生产环境示例)

unsetunset1. 集群架构说明unsetunset
  • 3节点Elasticsearch集群(1主2从)

  • 单节点Kibana(可扩展为集群)

  • 使用Docker Swarm或Compose管理服务

unsetunset2. Docker Compose配置文件unsetunset
services:
  es-master:
    image: elasticsearch:7.17.10
    container_name: es-master
    environment:
      - cluster.name=es-cluster
      - node.name=es-master
      - node.master=true
      - node.data=true
      - discovery.seed_hosts=es-slave1,es-slave2
      - cluster.initial_master_nodes=es-master
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
      - ELASTIC_PASSWORD=admin
    volumes:
      - es_master_data:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - es-network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9200"]
      interval: 30s
      timeout: 10s
      retries: 3

  es-slave1:
    image: elasticsearch:7.17.10
    container_name: es-slave1
    environment:
      - cluster.name=es-cluster
      - node.name=es-slave1
      - node.master=false
      - node.data=true
      - discovery.seed_hosts=es-master,es-slave2
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
      - ELASTIC_PASSWORD=admin
    volumes:
      - es_slave1_data:/usr/share/elasticsearch/data
    networks:
      - es-network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9200"]
      interval: 30s
      timeout: 10s
      retries: 3

  es-slave2:
    image: elasticsearch:7.17.10
    container_name: es-slave2
    environment:
      - cluster.name=es-cluster
      - node.name=es-slave2
      - node.master=false
      - node.data=true
      - discovery.seed_hosts=es-master,es-slave1
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
      - ELASTIC_PASSWORD=admin
    volumes:
      - es_slave2_data:/usr/share/elasticsearch/data
    networks:
      - es-network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9200"]
      interval: 30s
      timeout: 10s
      retries: 3

  kibana:
    image: kibana:7.17.10
    container_name: kibana-cluster
    environment:
      - ELASTICSEARCH_HOSTS=http://es-master:9200,http://es-slave1:9200,http://es-slave2:9200
      - ELASTICSEARCH_USER=elastic
      - ELASTICSEARCH_PASSWORD=admin
    ports:
      - 5601:5601
    depends_on:
      es-master:
        condition: service_healthy
      es-slave1:
        condition: service_healthy
      es-slave2:
        condition: service_healthy
    networks:
      - es-network

volumes:
  es_master_data:
  es_slave1_data:
  es_slave2_data:

networks:
  es-network:
    driver: bridge
unsetunset3. 启动集群unsetunset
docker-compose up -d
unsetunset4. 验证集群状态unsetunset
  • 访问Kibana的Stack Management > Cluster Overview,查看节点健康状态。

  • 使用Elasticsearch API查看集群状态:

    curl -u elastic:admin http://localhost:9200/_cluster/health?pretty
    

    正常情况下应返回status: "green"或status: "yellow"(无副本时)。

四、高级配置与优化

  1. 持久化存储

    • 上述配置已通过volumes声明数据卷,Docker会自动管理数据持久化。

    • 生产环境建议将数据卷挂载到本地磁盘:

      volumes:
        - /data/elasticsearch/master:/usr/share/elasticsearch/data  # 本地路径替换
      
  2. 内存优化

    • Elasticsearch默认分配2GB内存,可通过ES_JAVA_OPTS调整,但需遵循"不超过物理内存50%"且"不超过32GB"的原则(避免超出JVM堆内存寻址效率峰值)。

  3. 安全配置

    • 启用TLS加密:

      1. 生成证书:docker run --rm elasticsearch:7.17.10 bin/elasticsearch-certutil cert -out /tmp/elastic-certificates.p12 -pass ""

      2. 挂载证书到容器并配置elasticsearch.yml:

        xpack.security.enabled: true
        xpack.security.transport.ssl.enabled: true
        xpack.security.transport.ssl.verification_mode: certificate
        xpack.security.transport.ssl.keystore.path: /path/to/elastic-certificates.p12
        xpack.security.transport.ssl.truststore.path: /path/to/elastic-certificates.p12
        
    • 配置Kibana访问认证:

      xpack.security.enabled: true
      xpack.security.http.ssl.enabled: true
      xpack.security.http.ssl.keystore.path: /path/to/elastic-certificates.p12
      xpack.security.http.ssl.truststore.path: /path/to/elastic-certificates.p12
      
  4. 性能调优

    • 调整Docker资源限制(避免OOM):

      resources:
        limits:
          memory: 4g
        reservations:
          memory: 2g
      
    • 启用Elasticsearch节点角色分离(master/data/ingest):

      node.master: true  # 仅主节点
      node.data: true    # 数据节点
      node.ingest: true  #  ingest节点
      

五、常见问题与解决方案

  1. 端口冲突

    • 检查本地9200/5601端口是否被占用,修改docker-compose.yml中的ports映射(如9201:9200)。

  2. 内存不足

    • Linux系统需调整vm.max_map_count(Elasticsearch要求至少262144):

      sudo sysctl -w vm.max_map_count=262144
      
    • 或在Docker Compose中添加内核参数:

      sysctls:
        - vm.max_map_count=262144
      
  3. Kibana连接失败

    • 确认elasticsearch.hosts配置是否正确(使用服务名而非IP,如http://elasticsearch:9200)。

    • 检查Elasticsearch密码是否正确(7.17+版本需配置ELASTIC_PASSWORD)。

  4. 集群脑裂

    • 确保discovery.seed_hosts配置正确,生产环境建议至少3个主节点。

0

评论区