4

我已经使用 docker compose 设置了 elasticsearch 和 kibana。elasticsearch部署在:localhost:9200而 kibana 部署在localhost:5601

尝试使用 docker run 部署 metricbeat 时出现以下错误:

$ 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:
4

1 回答 1

6

docker-compose首先通过添加默认 docker 网络的名称来编辑您的文件:

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时,您提供以下 envar:

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

我将从第二个开始。使用docker run命令,当您启动时metricbeat,您是在告诉容器它可以访问弹性搜索localhost:9200。因此,当容器启动时,它将访问端口 9200 上的 localhost,期望找到elasticsearch正在运行。但是,由于容器是具有自己的网络层的主机隔离进程,因此localhost解析为容器本身,而不是您期望的 docker 主机。

关于kibana主机的设置,您首先应该了解它是如何docker-compose工作的。默认情况下,当您执行时docker-compose up,会创建一个 docker 网络,并将 yml 文件中定义的所有服务添加到该网络中。在这个网络中,只有,服务可以通过它们的服务名称访问。对于您的情况,根据 yml 文件中的定义,它们的名称为elasticsearch, kibana

因此,为了metricbeat容器能够与elasticsearch容器通信kibana,应该将其添加到同一个 docker 网络中。这可以通过在命令上设置--network标志来实现。docker run

另一种方法是使用网络模式 host与您的容器共享 docker 主机的网络,但我不建议这样做。

参考:

码头工人撰写

码头运行

于 2019-12-13T12:58:09.977 回答