Как подключить metricbeat к elasticsearch и kibana с помощью docker

Я установил elasticsearch и kibana с помощью docker compose. elasticsearch развернут: localhost:9200, а kibana - localhost:5601

При попытке развернуть metricbeat с помощью docker run возникли следующие ошибки:

$ docker run docker.elastic.co/beats/metricbeat:6.3.2 setup -E setup.kibana.host=kibana:5601 -E output.elasticsearch.hosts=["localhost:9200"]

Exiting: Couldn't connect to any of the configured Elasticsearch hosts. Errors: [Error connection to Elasticsearch http://localhost:9200: Get http://localhost:9200: dial tcp [::1]:9200: connect: cannot assign requested address]

Exiting: Couldn't connect to any of the configured Elasticsearch hosts. Errors: [Error connection to Elasticsearch http://elasticsearch:9200: Get http://elasticsearch:9200: lookup elasticsearch on 192.168.65.1:53: no such host]

Мой docker-compose.yml:

# ./docker-compose.yml

version: "3.7"
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.3.2
    environment:
#      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - elkdata:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"
    restart: always
  kibana:
    image: docker.elastic.co/kibana/kibana:6.3.2
    volumes:
      - kibana:/usr/share/kibana/config
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
    restart: always
volumes:
  elkdata:
  kibana:

person anonymously132526    schedule 13.12.2019    source источник


Ответы (1)


Сначала отредактируйте ваш docker-compose файл, добавив имя для сети докеров по умолчанию:

version: "3.7"
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.3.2
    environment:
#      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - elkdata:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"
    networks:
      - my-network
    restart: always
  kibana:
    image: docker.elastic.co/kibana/kibana:6.3.2
    volumes:
      - kibana:/usr/share/kibana/config
    ports:
      - "5601:5601"
    networks:
      - my-network
    depends_on:
      - elasticsearch
    restart: always
volumes:
  elkdata:
  kibana:
networks:
  my-network:
    name: awesome-name

Выполните docker-compose up, а затем запустите metricbeat с помощью следующей команды:

$ docker run docker.elastic.co/beats/metricbeat:6.3.2 --network=awesome-name setup -E setup.kibana.host=kibana:5601 -E output.elasticsearch.hosts=["elasticsearch:9200"]

Пояснение:

Когда вы пытаетесь развернуть metricbeat, вы предоставляете следующие envars:

  • setup.kibana.host=kibana:5601
  • output.elasticsearch.hosts=["localhost:9200"]

Начну со второго. С помощью команды docker run при запуске metricbeat вы сообщаете контейнеру, что он может получить доступ к эластичному поиску на localhost:9200. Поэтому, когда контейнер запускается, он будет обращаться к локальному хосту через порт 9200, ожидая обнаружить elasticsearch запущенным. Но поскольку контейнер представляет собой изолированный процесс хоста с собственным сетевым уровнем, localhost разрешается в сам контейнер, а не в ваш хост-компьютер докера, как вы ожидали.

Что касается настройки kibana хоста, вы должны сначала понять, как работает docker-compose. По умолчанию, когда вы выполняете docker-compose up, создается сеть докеров, и все службы, определенные в файле yml, добавляются в эту сеть. Внутри этой и только этой сети услуги доступны через их имя. В вашем случае, как определено в файле yml, их имена будут elasticsearch, kibana.

Таким образом, чтобы контейнер metricbeat мог взаимодействовать с контейнерами elasticsearch и kibana, он должен быть добавлен в одну и ту же сеть докеров. Этого можно добиться, установив флаг --network в команде docker run.

Другой подход - совместное использование сети хоста докеров с вашими контейнерами с помощью хост сетевого режима, но я бы не рекомендовал это.

Использованная литература:

Docker compose

запуск докера

person leopal    schedule 13.12.2019
comment
Работал с docker run --network=awesome-name docker.elastic.co/beats/metricbeat:6.3.2 setup -E setup.kibana.host=kibana:5601 -E output.elasticsearch.hosts=["elasticsearch:9200"] - person anonymously132526; 13.12.2019
comment
И с отступом name: awesome-name в docker-compose.yml - person anonymously132526; 13.12.2019
comment
Я исправил проблему с отступом, рад помочь! - person leopal; 13.12.2019