Packetbeat 无法连接到 elasticsearch docker
Packetbeat not able to connect to elasticsearch docker
我正在尝试 docker 化我需要使用的所有弹性服务。 docker-compose 文件如下所示
version: '3'
services:
redis:
build: ./docker/redis
postgresql:
build: ./docker/postgresql
ports:
- "5433:5432"
env_file:
- .env
graphql:
build: .
command: npm run start
volumes:
- ./logs/:/usr/app/logs/
ports:
- "3000:3000"
env_file:
- .env
depends_on:
- "redis"
- "postgresql"
links:
- "redis"
- "postgresql"
elasticsearch:
build: ./docker/elasticsearch
container_name: elasticsearch
networks:
- elastic
ports:
- "9200:9200"
depends_on:
- "graphql"
links:
- "kibana"
kibana:
build: ./docker/kibana
container_name: kibana
ports:
- "5601:5601"
depends_on:
- "graphql"
networks:
- elastic
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200
metricbeat:
build: ./docker/metricbeat
depends_on:
- "graphql"
- "elasticsearch"
- "kibana"
volumes:
- /proc:/hostfs/proc:ro
- /sys/fs/cgroup:/hostfs/sys/fs/cgroup:ro
- /:/hostfs:ro
networks:
- elastic
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200
command:
- "-system.hostfs=/hostfs"
packetbeat:
build: ./docker/packetbeat
depends_on:
- "graphql"
- "elasticsearch"
- "kibana"
cap_add:
- NET_ADMIN
networks:
- elastic
environment:
- ELASTICSEARCH_URL=http://127.0.0.1:9200
logstash:
build: ./docker/logstash
ports:
- "9600:9600"
volumes:
- ./logs:/usr/logs
depends_on:
- "graphql"
- "elasticsearch"
- "kibana"
networks:
- elastic
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200
networks:
elastic:
driver: bridge
现在一切正常,但问题是 packetbeat 仅在其自己的 docker 容器内捕获网络。在弹性文档参考中 - https://www.elastic.co/guide/en/beats/packetbeat/master/running-on-docker.html
它说我需要启用 'host' 网络,以便将所有始发和到达的网络捕获到物理主机。但是,由于我已将网络配置为 -elastic
,因此我无法向 packetbeat 添加额外的主机网络接口。如果我删除 -elastic
网络并添加 -host
网络,我将无法连接到 elasticsearch,因为 DNS elasticsearch 不再存在于不同的网络中。我该如何克服这个问题?
这是一个非常常见的问题,docker 的良好隔离会妨碍您。例如,当使用收集主机指标的 Prometheus node_exporter 时,也会发生同样的情况,当 运行 在无法访问主机网络的容器中时,这也是非常无用的。
正如您已经提到的,不可能同时使用 network_mode: host
和 docker networks
。因此,对于您的用例,您可以拥有 packetbeat 容器 运行 主机网络,而不是将其附加到 docker 网络。因此,您无法再通过 http://elasticsearch:9200
将其连接到 elasticsearch 实例,因此您需要将此配置值替换为您已在 elasticsearch 服务中配置为映射端口的 http://your-host-ip:9200
。可能 http://127.0.0.1
也可以在 运行 和 network_mode: host
时工作,因为这应该是主机网络中的 localhost
- 因此 elasticsearch 端口映射到的主机。
我正在尝试 docker 化我需要使用的所有弹性服务。 docker-compose 文件如下所示
version: '3'
services:
redis:
build: ./docker/redis
postgresql:
build: ./docker/postgresql
ports:
- "5433:5432"
env_file:
- .env
graphql:
build: .
command: npm run start
volumes:
- ./logs/:/usr/app/logs/
ports:
- "3000:3000"
env_file:
- .env
depends_on:
- "redis"
- "postgresql"
links:
- "redis"
- "postgresql"
elasticsearch:
build: ./docker/elasticsearch
container_name: elasticsearch
networks:
- elastic
ports:
- "9200:9200"
depends_on:
- "graphql"
links:
- "kibana"
kibana:
build: ./docker/kibana
container_name: kibana
ports:
- "5601:5601"
depends_on:
- "graphql"
networks:
- elastic
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200
metricbeat:
build: ./docker/metricbeat
depends_on:
- "graphql"
- "elasticsearch"
- "kibana"
volumes:
- /proc:/hostfs/proc:ro
- /sys/fs/cgroup:/hostfs/sys/fs/cgroup:ro
- /:/hostfs:ro
networks:
- elastic
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200
command:
- "-system.hostfs=/hostfs"
packetbeat:
build: ./docker/packetbeat
depends_on:
- "graphql"
- "elasticsearch"
- "kibana"
cap_add:
- NET_ADMIN
networks:
- elastic
environment:
- ELASTICSEARCH_URL=http://127.0.0.1:9200
logstash:
build: ./docker/logstash
ports:
- "9600:9600"
volumes:
- ./logs:/usr/logs
depends_on:
- "graphql"
- "elasticsearch"
- "kibana"
networks:
- elastic
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200
networks:
elastic:
driver: bridge
现在一切正常,但问题是 packetbeat 仅在其自己的 docker 容器内捕获网络。在弹性文档参考中 - https://www.elastic.co/guide/en/beats/packetbeat/master/running-on-docker.html
它说我需要启用 'host' 网络,以便将所有始发和到达的网络捕获到物理主机。但是,由于我已将网络配置为 -elastic
,因此我无法向 packetbeat 添加额外的主机网络接口。如果我删除 -elastic
网络并添加 -host
网络,我将无法连接到 elasticsearch,因为 DNS elasticsearch 不再存在于不同的网络中。我该如何克服这个问题?
这是一个非常常见的问题,docker 的良好隔离会妨碍您。例如,当使用收集主机指标的 Prometheus node_exporter 时,也会发生同样的情况,当 运行 在无法访问主机网络的容器中时,这也是非常无用的。
正如您已经提到的,不可能同时使用 network_mode: host
和 docker networks
。因此,对于您的用例,您可以拥有 packetbeat 容器 运行 主机网络,而不是将其附加到 docker 网络。因此,您无法再通过 http://elasticsearch:9200
将其连接到 elasticsearch 实例,因此您需要将此配置值替换为您已在 elasticsearch 服务中配置为映射端口的 http://your-host-ip:9200
。可能 http://127.0.0.1
也可以在 运行 和 network_mode: host
时工作,因为这应该是主机网络中的 localhost
- 因此 elasticsearch 端口映射到的主机。