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

Azure上Docker Compose部署的Web应用无法访问问题排查

问题:Azure部署Docker多容器应用后出现502错误

本地可成功构建、运行应用并通过http://localhost:5000访问,但部署到Azure后无法访问,访问https://myapp.azurewebsites.net/时出现502 - Web server received an invalid response while acting as a gateway or proxy server.错误。

Docker Compose配置

version: '3'
services:
  redis:
    image: redis:alpine
    ports:
      - "6379:6379"
  web:
    build: .
    image: myappregistry.azurecr.io/myapp:latest
    ports:
      - "5000:5000"

Azure部署日志

2019-03-30 13:25:51.864 INFO - 启动多容器应用,配置内容同上
2019-03-30 13:25:54.668 INFO - 执行docker pull redis:alpine命令
2019-03-30 13:25:57.223 INFO - docker pull返回STDOUT>> alpine: Pulling from library/redis
Digest: sha256:a228f66132cd46a53fd818443c42458af5d6a3e1231df25184304b8e732e51c4
Status: Image is up to date for redis:alpine
2019-03-30 13:25:57.245 INFO - 启动站点容器
2019-03-30 13:25:57.247 INFO - 执行命令:docker run -d -p 19446:6379 --name myapp003_redis_0 -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=false -e WEBSITES_PORT=5000 -e WEBSITE_SITE_NAME=myapp003 -e WEBSITE_AUTH_ENABLED=False -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_INSTANCE_ID=c04d15b1b0966eeeb73c65719c2b7ecac5f6223333efd04b1712f559b5660459 redis:alpine
2019-03-30 13:25:57.249 INFO - 此容器未启用日志记录,请访问https://aka.ms/linux-diagnostics启用日志以查看容器日志
2019-03-30 13:25:58.084 INFO - 启动站点容器
2019-03-30 13:25:58.086 INFO - 执行命令:docker run -d -p 0:5000 --name myapp003_web_0 -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=false -e WEBSITES_PORT=5000 -e WEBSITE_SITE_NAME=myapp003 -e WEBSITE_AUTH_ENABLED=False -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_INSTANCE_ID=c04d15b1b0966eeeb73c65719c2b7ecac5f6223333efd04b1712f559b5660459 myappregistry.azurecr.io/myapp:latest
2019-03-30 13:25:58.088 INFO - 此容器未启用日志记录,请访问https://aka.ms/linux-diagnostics启用日志以查看容器日志

注:已在Azure Web应用的“Application Settings”中设置WEBSITES_PORT值为5000。


回答

结合你的配置和日志,这个502错误核心是Azure的网关无法与你的web容器建立有效连接,以下是几个最可能的原因和解决方法:

1. 应用服务监听地址错误

这是容器部署中最常见的坑:本地运行时服务如果只监听localhost(127.0.0.1),在本地环境没问题,但容器内这样配置的话,外部(包括Azure网关)根本无法访问到服务。

你需要修改应用代码,确保服务绑定到0.0.0.0:5000:

  • 比如Flask应用,启动命令改为:app.run(host='0.0.0.0', port=5000)
  • Django应用则修改settings.py中的ALLOWED_HOSTS包含*,启动时指定--bind 0.0.0.0:5000

2. 多容器网络访问问题

你的web容器需要连接Redis服务,但要确认应用代码中是用redis作为主机名访问,而不是localhost。在Docker Compose的默认网络里,容器可以通过服务名互相访问;如果代码里写的是localhost:6379,容器会尝试访问自身的6379端口,自然连不上Redis,导致服务启动失败或异常,进而返回502。

3. 容器端口配置细节

虽然你设置了WEBSITES_PORT=5000,但还要检查:

  • Dockerfile中是否添加了EXPOSE 5000指令,这能帮助Azure更准确识别容器的服务端口
  • 确认容器内的服务确实在5000端口运行,没有因环境变量或配置错误切换到其他端口

4. 启用容器日志排查

目前你的容器日志未启用,这很难定位容器内部的问题——比如服务是否正常启动?有没有报错?是否存在依赖缺失?开启日志后,你可以直接查看web容器的启动日志,这是排查这类问题最直接有效的方式。

5. 健康检查失败

Azure网关会定期检查服务的健康状态,如果服务启动过慢,或者健康检查端点(默认是根路径/)无法返回200状态码,网关就会返回502。你可以:

  • 测试应用的根路径是否能正常返回响应
  • 如果应用启动需要较长时间,调整Azure的启动等待时间配置

内容的提问来源于stack exchange,提问作者Mike Penrose

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:56:03