部署Django到Azure App Service时Docker容器端口8000无响应报错求助
问题排查及解决方案
核心问题1:挂载卷覆盖容器内代码
你docker-compose.yml里配置的volumes: - .:/image_service是本地开发时用于热重载的配置,部署到Azure App Service时,远程运行环境的当前目录不存在你的项目代码,挂载后会直接覆盖镜像中内置的项目代码,导致Django进程根本无法正常启动,自然无法响应端口探测。
修复方法:删除docker-compose.yml中的volumes配置段。
核心问题2:端口配置冲突
你在Azure门户中同时配置了PORT 80和WEBSITES_PORT 8000,Azure App Service的健康检查逻辑会优先读取PORT环境变量的取值作为探测端口,而你容器内的Django服务实际监听的是8000端口,导致探测目标和实际服务端口不匹配。
修复方法:删除Azure配置中的PORT 80项,仅保留WEBSITES_PORT 8000即可。
可选优化(强烈建议修改)
Django自带的runserver是开发调试用服务器,性能差、稳定性低,不适合生产环境使用,建议替换为生产级WSGI服务器Gunicorn:
- 在项目依赖文件中添加
gunicorn - 修改docker-compose.yml中的command配置:
command: bash -c "python projectile/manage.py makemigrations && python projectile/manage.py migrate && gunicorn projectile.wsgi:application --bind 0.0.0.0:8000 --workers 2"
修改后Docker Compose参考配置
version: '3' services: web: build: . command: bash -c "python projectile/manage.py makemigrations && python projectile/manage.py migrate && gunicorn projectile.wsgi:application --bind 0.0.0.0:8000 --workers 2" container_name: image_service ports: - "8000:8000"
补充检查项
确认Django项目settings.py中的ALLOWED_HOSTS配置包含你的Azure App Service域名(比如xxx.azurewebsites.net),或者临时设为ALLOWED_HOSTS = ["*"]测试,避免Django拦截请求导致探测失败。
内容的提问来源于stack exchange,提问作者allinws
相关产品推荐
相关产品推荐

