Azure App Service中Docker-Compose部署下Web容器无法连接Elasticsearch
解决Azure App Service中Docker-Compose部署下Web容器与Elasticsearch容器的连接问题
问题背景
在Azure App Service使用Docker-Compose部署时,Web容器无法连接到Elasticsearch容器,索引操作时报错:
elastic_transport.ConnectionError: Connection error caused by: ConnectionError(Connection error caused by: ProtocolError(('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))))
相关配置
Docker-Compose配置
version: '3' services: elasticsearch: image: "elasticsearch:8.2.2" container_name: elasticsearch environment: - discovery.type=single-node - ES_JAVA_OPTS=-Xms1g -Xmx1g - xpack.security.enabled=false - bootstrap.memory_lock=true ulimits: memlock: soft: -1 hard: -1 volumes: - es_config:/usr/share/elasticsearch/config ports: - "9200:9200" networks: - esnet web: image: web:latest ports: - "80:80" links: - elasticsearch depends_on: - elasticsearch environment: ELASTIC_HOST: ${ELASTIC_HOST} networks: - esnet volumes: es_config: driver: azure_file driver_opts: share_name: elasticsearch storage_account_name: storageaccount networks: esnet: driver: bridge
Web应用配置代码
ELASTIC_HOST=http://elasticsearch:9200 client = Elasticsearch(ELASTIC_HOST)
解决方案
1. 解决服务就绪等待问题
depends_on仅保证容器启动顺序,不确保Elasticsearch服务完全就绪。Web容器启动时Elasticsearch可能仍在初始化,需添加启动等待逻辑:
- 在Web应用的启动脚本中加入循环检查,直到Elasticsearch的集群健康状态可用:
until curl -s http://elasticsearch:9200/_cluster/health | grep -q '"status":"green"' || curl -s http://elasticsearch:9200/_cluster/health | grep -q '"status":"yellow"'; do echo "Waiting for Elasticsearch to be ready..." sleep 5 done
2. 排查Azure文件共享权限问题
挂载的Azure文件共享es_config若权限不正确,会导致Elasticsearch无法正常加载配置:
- 确认Azure存储账户的文件共享已授予容器读写权限,建议设置为
Storage File Data SMB Share Contributor级别。 - 临时注释掉volumes配置,使用容器内置配置验证是否为存储挂载导致的问题:
# volumes: # - es_config:/usr/share/elasticsearch/config
3. 验证网络与端口连通性
- 查看Elasticsearch容器日志,确认服务已正常启动并监听9200端口,日志中应有
started相关输出。 - 进入Web容器终端,执行
curl http://elasticsearch:9200测试连接,若无法连通:- 确认两个容器都加入了
esnet网络,Docker-Compose会自动为同一网络内的容器提供DNS解析。
- 确认两个容器都加入了
4. 确认环境变量正确注入
- 进入Web容器终端,执行
echo $ELASTIC_HOST,确保变量值为http://elasticsearch:9200,避免因环境变量未正确设置导致连接地址错误。
5. 调整资源配置适配Azure限制
Azure App Service的容器内存有限,当前Elasticsearch的JVM堆内存设置为1G可能超出资源限制:
- 降低JVM内存配置,例如改为
-Xms512m -Xmx512m。 - 检查应用服务计划的资源配额,确保分配的内存足够支撑两个容器运行。
内容的提问来源于stack exchange,提问作者Olga Riabukha
相关产品推荐
相关产品推荐

