Docker Compose部署xpack安全版Elastic Stack时Kibana连接ES失败
问题排查:Docker Compose 部署下 Kibana 无法连接 Elasticsearch
你的配置存在3个核心问题,直接导致Kibana连接失败:
- Kibana 7.x版本读取Elasticsearch地址的正确配置项为
ELASTICSEARCH_HOSTS,且要求传入JSON数组格式值,你写的ELASTICSEARCH_URL/ELASTICSEARCH_HOST是旧版本废弃配置,Kibana未读取到自定义地址时会默认请求http://elasticsearch:9200,和你日志里的报错地址完全对应 - 开启xpack安全认证的单节点Elasticsearch缺少集群初始化配置,启动后会卡在主节点选举流程,HTTP服务长时间无法就绪;原配置的
depends_on仅等待容器启动,不会校验服务是否可用,Kibana启动时ES还没对外提供服务 mediatrexample.api服务仅加入mediatrexample网络,而Elasticsearch归属elk_stack网络,跨网络下配置的links规则不生效,后续Serilog写入ES也会失败;另外Redis配置了密码但启动命令未加认证参数,后续API连接Redis也会报错
修正后的Docker Compose配置
以下配置已修复所有问题,同时给所有依赖服务加了健康检查,避免服务启动顺序导致的连接异常:
version: '3.4' networks: mediatrexample: driver: bridge elk_stack: driver: bridge services: pgsql_image: image: postgres:latest container_name: postgersql_db restart: always environment: POSTGRES_USER: "postgres" POSTGRES_PASSWORD: "123456" POSTGRES_DB: "ecommerce" ports: - 5432:5432 networks: - mediatrexample healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5 redis_image: image: 'redis:latest' container_name: redis_db restart: always ports: - '6379:6379' command: [ "redis-server", "--requirepass", "RRnFPZ93tjBHB9W62p" ] networks: - mediatrexample healthcheck: test: ["CMD", "redis-cli", "-a", "RRnFPZ93tjBHB9W62p", "ping"] interval: 5s timeout: 5s retries: 5 elastic_image: image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2 container_name: elk_elastic environment: - node.name=elastic01 - cluster.name=es-docker-cluster - xpack.security.enabled=true - xpack.security.audit.enabled=true - discovery.type=single-node - discovery.seed_hosts=elastic_image - cluster.initial_master_nodes=elastic01 - ELASTIC_PASSWORD=DkIedPPSCb - ES_JAVA_OPTS=-Xms512m -Xmx512m networks: - elk_stack ports: - 9200:9200 healthcheck: test: ["CMD-SHELL", "curl -u elastic:DkIedPPSCb -f http://localhost:9200/_cluster/health?wait_for_status=yellow || exit 1"] interval: 10s timeout: 10s retries: 20 start_period: 30s kibana_image: image: docker.elastic.co/kibana/kibana:7.5.2 container_name: elk_kibana environment: - ELASTICSEARCH_HOSTS=["http://elastic_image:9200"] - ELASTICSEARCH_USERNAME=elastic - ELASTICSEARCH_PASSWORD=DkIedPPSCb networks: - elk_stack depends_on: elastic_image: condition: service_healthy ports: - 5601:5601 healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:5601/api/status || exit 1"] interval: 10s timeout: 10s retries: 20 start_period: 30s mediatrexample.api: image: ${DOCKER_REGISTRY-}mediatrexampleapi container_name: mediatr_example depends_on: pgsql_image: condition: service_healthy redis_image: condition: service_healthy elastic_image: condition: service_healthy kibana_image: condition: service_healthy build: context: . dockerfile: MediatrExample.API/Dockerfile networks: - mediatrexample - elk_stack environment: - CONNECTIONSTRINGS__NpgSQLConnection=User ID=postgres;Password=123456;Host=pgsql_image;Port=5432;Database=ecommerce - Redis__Host=redis_image - Redis__Port=6379 - Redis__Password=RRnFPZ93tjBHB9W62p - Serilog__WriteTo__0__Args__nodeUris=http://elastic:DkIedPPSCb@elastic_image:9200
部署操作步骤
- 执行
docker compose down -v清理之前残留的故障容器、无效网络 - 替换配置后执行
docker compose up -d启动所有服务 - 等待1-2分钟让Elasticsearch完成初始化,访问
http://localhost:5601输入账号elastic、密码DkIedPPSCb即可正常登录Kibana
内容的提问来源于stack exchange,提问作者filiphasan
相关产品推荐
相关产品推荐

