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 端口映射到的主机。