如何使用 docker 将 metricbeat 连接到 elasticsearch 和 kibana
How to connect metricbeat to elasticsearch and kibana with docker
我已经使用 docker compose 设置了 elasticsearch 和 kibana。 elasticsearch 部署在:localhost:9200
而 kibana 部署在 localhost:5601
尝试使用 docker 运行 部署 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:
首先编辑您的 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
时,您提供以下 envars:
setup.kibana.host=kibana:5601
output.elasticsearch.hosts=["localhost:9200"]
我将从第二个开始。使用 docker run
命令,当您启动 metricbeat
时,您是在告诉容器它可以访问 localhost:9200
上的弹性搜索。所以当容器启动时,它将访问端口 9200 上的本地主机,期望找到 elasticsearch
运行。但是,由于容器是一个主机隔离进程,有自己的网络层,localhost
解析为 容器本身 ,而不是你的 docker 主机期待。
关于kibana
主机的设置,首先要了解docker-compose
的工作原理。默认情况下,当您执行 docker-compose up
时,会创建一个 docker 网络,并将 yml 文件中定义的所有服务添加到该网络。在 此网络内且仅 ,服务可通过其服务名称访问。对于您的情况,如 yml 文件中所定义,它们的名称将是 elasticsearch
、kibana
.
所以为了 metricbeat
容器能够与 elasticsearch
和 kibana
容器通信,它应该被添加到同一个 docker 网络。这可以通过在 docker run
命令上设置 --network
标志来实现。
另一种方法是使用 network mode host 与您的容器共享 docker 主机的网络,但我不推荐这样做。
参考文献:
我已经使用 docker compose 设置了 elasticsearch 和 kibana。 elasticsearch 部署在:localhost:9200
而 kibana 部署在 localhost:5601
尝试使用 docker 运行 部署 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:
首先编辑您的 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
时,您提供以下 envars:
setup.kibana.host=kibana:5601
output.elasticsearch.hosts=["localhost:9200"]
我将从第二个开始。使用 docker run
命令,当您启动 metricbeat
时,您是在告诉容器它可以访问 localhost:9200
上的弹性搜索。所以当容器启动时,它将访问端口 9200 上的本地主机,期望找到 elasticsearch
运行。但是,由于容器是一个主机隔离进程,有自己的网络层,localhost
解析为 容器本身 ,而不是你的 docker 主机期待。
关于kibana
主机的设置,首先要了解docker-compose
的工作原理。默认情况下,当您执行 docker-compose up
时,会创建一个 docker 网络,并将 yml 文件中定义的所有服务添加到该网络。在 此网络内且仅 ,服务可通过其服务名称访问。对于您的情况,如 yml 文件中所定义,它们的名称将是 elasticsearch
、kibana
.
所以为了 metricbeat
容器能够与 elasticsearch
和 kibana
容器通信,它应该被添加到同一个 docker 网络。这可以通过在 docker run
命令上设置 --network
标志来实现。
另一种方法是使用 network mode host 与您的容器共享 docker 主机的网络,但我不推荐这样做。
参考文献: