在 docker 个容器中配置 ELK 集群

Configure an ELK cluster in docker containers

我正在尝试使用 2 个 docker 容器配置 ELK 集群。

我正在使用以下图片:

我已经用 docker-compose 为该图像创建了 2 个 docker 容器;每个都在独立模式下完美运行。

我想link 2个ELK节点之间的方式创建集群,但我还没有找到合适的解决方案。 container1 中的 Elasticsearch 节点不与 container2.

中的 Elasticsearch 节点通信

这是两个 docker-compose.yml:

容器 1:

version: '2'
services:
  elasticsearch01:
    image: sebp/elk:es241_l240_k461
    ports:
      - "5601:5601"
      - "9200:9200"
      - "9300:9300"
      - "5044:5044"
    volumes:
      - /opt/ELK1/logstash/conf.d:/etc/logstash/conf.d
    privileged: true

容器 2:

version: '2'
services:
  elasticsearch02:
    image: sebp/elk:es241_l240_k461
    ports:
      - "5602:5601"
      - "9201:9200"
      - "9301:9300"
      - "5045:5044"
    volumes:
      - /opt/ELK2/logstash/conf.d:/etc/logstash/conf.d
    privileged: true

我已经以这种方式在 docker 容器中配置了 elasticsearch.yml

容器 1 中的节点:

cluster.name: elasticsearchcluster
node.name: node1
network.host: 0.0.0.0
network.bind_host: 0.0.0.0
discovery.zen.ping.unicast.hosts: ["127.0.0.1", "172.21.0.2"]
discovery.zen.minimum_master_nodes: 1

容器 2 中的节点:

cluster.name: elasticsearchcluster
node.name: node2
network.host: 0.0.0.0
network.bind_host: 0.0.0.0
discovery.zen.ping.unicast.hosts: ["127.0.0.1", "172.22.0.2"]
discovery.zen.minimum_master_nodes: 1

关键是discovery.zen.ping.unicast.hosts参数:我没有真实的IP地址,因为是docker容器

我试过docker inspect elasticsearch01,我有以下"IPAddress"属性:

    "NetworkSettings": {
        ...
        "Networks": {
            "ELK1_default": {
                ...
                "Gateway": "172.22.0.1",
                "IPAddress": "172.22.0.2",
                ...
            }
        }
    }

但是如果我设置了那个 IP 地址,它就不起作用了。

如何正确配置集群?

编辑

尝试主机 ip 地址和端口,节点 1 启动,节点 2 失败,没有错误。

discovery.zen.ping.unicast.hosts: ["127.0.0.1", "192.168.0.1:9300"] -> OK
discovery.zen.ping.unicast.hosts: ["127.0.0.1", "192.168.0.2:9300"] -> FAILS with no errors

除了使用带有 ELK 堆栈的准备好的 docker 文件,您还可以这样做:

version: '3'

services:

  elasticsearch:
    image: elasticsearch:2.4.1
    ports:
      - 9200:9200
    networks:
      - elk

  elasticsearch_slave:
    image: elasticsearch:2.4.1
    networks:
      - elk
    depends_on:
      - elasticsearch
    command: elasticsearch --discovery.zen.ping.unicast.hosts=elasticsearch

  logstash:
    image: logstash:2.3.3
    hostname: logstash
    networks:
      - elk
    volumes:
      - ./logstash.conf:/config/logstash.conf
    depends_on:
      - elasticsearch
    ports:
      - 5044:5044
    command: logstash -f /config/logstash.conf

  kibana:
    image: kibana:4.5.1
    hostname: kibana
    networks:
      - elk
    depends_on:
      - elasticsearch
      - logstash
    ports:
      - 5601:5601

networks:

  elk:
    driver: bridge

使用 docker-compose up -d 启动图像后,您可以使用以下命令扩展从站 docker-compose scale elasticsearch_slave=5

完成后 - 您将拥有 5 个从属节点 + 客户端节点,它们打开端口 9200 作为整个集群的网关。

例如,在这样做之后,http://localhost:9200/_cat/nodes?v 显示如下:

感谢 Evaldas Buinauskas,我找到了堆栈的解决方案!

首先,我们只需要一个docker-compose.yml。 在该文件中,我们需要配置两个服务(每个容器创建一个),以及一个网络在两个服务之间共享。

这是新的 docker-compose.yml:

version: '2'
services:
  elk1:
    environment:
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms2048m -Xmx2048m"
    image: sebp/elk:es241_l240_k461
    networks:
      - elk_net
    ports:
      - "5601:5601"
      - "9200:9200"
      - "9300:9300"
      - "5044:5044" 
    volumes:
      - /opt/elk/logstash/conf.d:/etc/logstash/conf.d
    privileged: true
  elk2:
    environment:
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms2048m -Xmx2048m"
    image: sebp/elk:es241_l240_k461
    networks:
      - elk_net
    ports:
      - "5602:5601"
      - "9201:9200"
      - "9301:9300"
      - "5045:5044"
    depends_on:
      - elk1  
    volumes:
      - /opt/elk/logstash/conf.d:/etc/logstash/conf.d
    privileged: true  
networks:
  elk_net:
    driver: bridge

命令 docker-compose up 将创建 3 个元素:

  1. 容器elk1
  2. 容器elk2
  3. 网络elk_net

使用 docker network inspect elk_net 命令我们可以查看分配给 2 个容器的 (docker) 个 IP 地址。

elasticsearch.yml 个文件必须配置如下:

cluster.name: elasticsearchcluster
node.name: node1
network.host: 0.0.0.0
network.bind_host: 0.0.0.0
network.publish_host: ${IP_ADDRESS_ELK1}
discovery.zen.ping.unicast.hosts: ["${IP_ADDRESS_ELK2}"]
discovery.zen.minimum_master_nodes: 1

cluster.name: elasticsearchcluster
node.name: node2
network.host: 0.0.0.0
network.bind_host: 0.0.0.0
network.publish_host: ${IP_ADDRESS_ELK2}
discovery.zen.ping.unicast.hosts: ["${IP_ADDRESS_ELK1}"]
discovery.zen.minimum_master_nodes: 1

使用此配置,集群完美运行:两个节点正确合并,Http 到达每个 elasticsearch 服务器 returns 保存在 2 个节点中的所有文档。