本地调试Elasticsearch日志正常,Docker部署DotNet API无法连接
问题分析与解决方案
核心问题:网络隔离
你的dotnet.monitoring.api容器未加入es-net自定义网络,而elasticsearch和kibana都部署在该网络内。Docker容器仅能在同一网络下通过服务名(如elasticsearch)互相访问,不在同一网络的容器无法解析该服务名,直接导致连接失败。
其他潜在问题
- Elasticsearch环境变量错误:
cluster.name-es-docker-cluster缺少等号,正确写法应为cluster.name=es-docker-cluster,否则集群名称配置不生效。 - Elasticsearch数据卷路径拼写错误:
/urs/share/elasticsearch/data应为/usr/share/elasticsearch/data,路径错误会导致ES无法持久化数据,甚至启动失败。 - 服务就绪依赖问题:
depends_on仅保证容器启动顺序,不确保Elasticsearch完全启动就绪。需添加健康检查,确保API服务在ES就绪后再启动。
修改后的完整docker-compose.yml
version: '3.4' services: productdb: container_name: productdb environment: SA_PASSWORD: "SwN12345678" ACCEPT_EULA: "Y" restart: always ports: - "1433:1433" networks: - es-net elasticsearch: container_name: elasticsearch environment: - node.name=elasticsearch - cluster.name=es-docker-cluster # 修复等号缺失问题 - xpack.security.enabled=false - "discovery.type=single-node" networks: - es-net volumes: - data01:/usr/share/elasticsearch/data # 修复路径拼写错误 ports: - 9200:9200 healthcheck: # 添加健康检查,确保ES就绪 test: ["CMD-SHELL", "curl -f http://localhost:9200/_cluster/health || exit 1"] interval: 10s timeout: 10s retries: 5 kibana: container_name: kibana environment: - ELASTICSEARCH_URL=http://elasticsearch:9200 - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 networks: - es-net depends_on: elasticsearch: condition: service_healthy # 依赖ES健康状态 ports: - 5601:5601 dotnet.monitoring.api: container_name: dotnet.monitoring.api environment: - ASPNETCORE_ENVIRONMENT=Development - "ElasticConfiguration:Url=http://elasticsearch:9200/" - "ConnectionStrings:Product=server=productdb;Database=ProductDb;User Id=sa;Password=SampleP@&&W0rd;TrustServerCertificate=True;" depends_on: productdb: condition: service_started elasticsearch: condition: service_healthy # 依赖ES健康状态,避免提前启动 ports: - "8001:80" networks: - es-net # 加入es-net网络,解决服务名解析问题 volumes: data01: driver: local networks: es-net: driver: bridge
验证步骤
- 停止并清理现有容器:
docker-compose down -v - 重新启动服务:
docker-compose up -d - 查看API容器日志:
docker logs dotnet.monitoring.api,确认是否成功连接Elasticsearch - 访问Kibana(http://localhost:5601),检查ES连接状态是否正常
内容的提问来源于stack exchange,提问作者Sanjyot Agureddy
相关产品推荐
相关产品推荐

