You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 09:40:25