将Docker Compose部署至Azure App Service后多应用端口访问异常求助
问题分析与解决方案
Azure App Service 多容器 Web App 仅对外暴露 80/443 端口,你在 Docker Compose 中指定的 7286、7205 等自定义端口无法直接从外部访问;同时容器内部需通过服务名而非端口/外部域名通信,这是导致你无法访问 API 的核心原因。以下是具体解决步骤:
1. 调整 Docker Compose 配置
移除不必要的对外端口映射,指定主容器并配置内部通信:
version: '3.4' services: appdbtest: container_name: app-dbtest image: mcr.microsoft.com/mssql/server:2019-latest # 数据库仅内部容器访问,无需对外暴露端口(若需外部连接建议用Azure SQL/VNet) environment: - ACCEPT_EULA=Y - SA_PASSWORD=password@12345# web_app: image: testapp00.azurecr.io/web:1.6 ports: - 80:81 # 将外部80端口转发至web_app容器的81端口 environment: - AZURE_WEBAPP_DEFAULT_STATIC_SITE=true # 标记为主容器,接收外部流量 - API_INTERNAL_URL=http://api_app:82 # 传递API内部地址给前端 api_app: image: testapp00.azurecr.io/api:3.1 # 无需对外暴露端口,内部通过服务名api_app访问 depends_on: - appdbtest environment: - DB_HOST=appdbtest - DB_NAME=AssessmentEngineer3Api - DB_SA_PASSWORD=password@12345#
2. 配置前端与反向代理
前端调用 API 时避免硬编码端口/域名,改用相对路径(如 /api/xxx),并在 web_app 中添加反向代理规则,将 API 请求转发至内部容器:
以 ASP.NET Core 为例,在 Program.cs 中添加反向代理:
// 注册反向代理服务 builder.Services.AddReverseProxy() .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")); // 启用反向代理路由 app.MapReverseProxy();
在 web_app 的 appsettings.json 中配置路由规则:
"ReverseProxy": { "Routes": { "api_route": { "ClusterId": "api_cluster", "Match": { "Path": "/api/{**catch-all}" } } }, "Clusters": { "api_cluster": { "Destinations": { "api_destination": { "Address": "http://api_app:82/" } } } } }
3. 补充 App Service 配置
在 Azure 门户的 App Service 应用设置中添加 WEBSITES_PORT=81,明确告知平台将外部流量转发至 web_app 容器的 81 端口。
可选替代方案
若需直接对外暴露 API 服务,可:
- 为 API 单独部署一个 App Service
- 使用 Azure Container Apps(支持多容器多对外端口、自定义路由)
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

