在.NET项目中使用Docker Compose运行Dapr Sidecar遇到问题
Docker Compose运行Dapr+ASP.NET Core Web API问题解决
背景
我创建了一个ASP.NET Core 8 Web API项目,添加了DAPR Client和DAPR.ASPNETCORE包,并编写了PingController。本地使用以下命令运行时一切正常:
dapr run --app-id web4 --app-port 5001 --dapr-http-port 5002 -- dotnet run --urls http://+:5001
- Web服务Swagger正常运行
- Dapr Dashboard(默认8080端口)能看到Sidecar运行
- 调用
GET http://localhost:5002/v1.0/invoke/web4/method/Ping返回pong
尝试用docker-compose运行时,相关配置文件如下:
Program.cs
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers().AddDapr(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseCloudEvents(); app.MapSubscribeHandler(); app.UseAuthorization(); app.MapControllers(); app.Run();
PingController.cs
using Microsoft.AspNetCore.Mvc; namespace WebApplication4.Controllers { [ApiController] [Route("[controller]")] public class PingController : ControllerBase { [HttpGet] public IActionResult Get() { return Ok("pong"); } } }
docker-compose.yml
services: webapplication4: image: ${DOCKER_REGISTRY-}webapplication4 build: context: . dockerfile: WebApplication4/Dockerfile ports: - "5000:5001" volumes: - ./aspnet/https:/https:ro networks: - webapp-network webapplication4-api-dapr: image: "daprio/daprd:latest" command: ["./daprd", "--app-id", "web4", "--app-port", "5001", "--app-protocol", "http", "--dapr-http-port", "6001" ] ports: - "6000:6001" depends_on: - webapplication4 volumes: - ./aspnet/https:/https:ro networks: - webapp-network dapr-dashboard: image: "daprio/dashboard:latest" command: dapr run && dapr dashboard --port 8080 ports: - "8989:8080" networks: - webapp-network networks: webapp-network: driver: bridge
docker-compose.override.yml
services: webapplication4: environment: - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_HTTP_PORTS=5000 - ASPNETCORE_HTTPS_PORTS=6000 ports: - "5000" - "6000" volumes: - ${APPDATA}/Microsoft/UserSecrets:/home/app/.microsoft/usersecrets:ro - ${APPDATA}/ASP.NET/Https:/home/app/.aspnet/https:ro
问题与现象
使用docker-compose启动后,所有服务均运行,但出现以下问题:
- Web服务Swagger运行在随机端口(如56005)而非配置的5000端口,每次启动端口不同,但服务可访问
- Dapr Dashboard通过本地8989端口可访问,但未显示Sidecar运行
- 调用
GET http://localhost:6000/v1.0/invoke/web4/method/Ping收到错误:
{ "errorCode": "ERR_DIRECT_INVOKE", "message": "failed to invoke, id: web4, err: Get \"http://127.0.0.1:5001/Ping\": dial tcp 127.0.0.1:5001: connect: connection refused" }
解决方案
1. 修复Web服务端口随机问题
问题出在docker-compose.override.yml的配置冲突:
- 该文件中
ports配置为动态映射(- "5000"),会覆盖主文件的固定端口映射 - 环境变量
ASPNETCORE_HTTP_PORTS=5000与主文件中容器内部端口5001不匹配
修改docker-compose.override.yml,统一端口配置:
services: webapplication4: environment: - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_HTTP_PORTS=5001 # 和主文件中app-port保持一致 - ASPNETCORE_HTTPS_PORTS=5002 ports: - "5000:5001" # 固定宿主机5000映射容器5001 - "5002:5002" volumes: - ${APPDATA}/Microsoft/UserSecrets:/home/app/.microsoft/usersecrets:ro - ${APPDATA}/ASP.NET/Https:/home/app/.aspnet/https:ro
或者直接删除docker-compose.override.yml中的ports节点,让主文件的固定映射生效,同时调整环境变量中的端口与主文件容器端口匹配。
2. 修复Sidecar调用Web服务失败问题
问题根源:Docker Compose网络中,Sidecar默认用127.0.0.1访问应用,但该地址指向Sidecar自身容器,无法访问Web服务容器。
修改docker-compose.yml中Sidecar的配置,添加--app-address参数指定Web服务的compose服务名:
webapplication4-api-dapr: image: "daprio/daprd:latest" command: ["./daprd", "--app-id", "web4", "--app-address", "webapplication4", # 指定Web服务的容器服务名 "--app-port", "5001", "--app-protocol", "http", "--dapr-http-port", "6001" ] ports: - "6000:6001" depends_on: - webapplication4 volumes: - ./aspnet/https:/https:ro networks: - webapp-network
3. 修复Dapr Dashboard无法显示Sidecar问题
问题根源:Dashboard启动命令错误,且未指定连接的Sidecar端口。
修改docker-compose.yml中Dashboard的配置:
dapr-dashboard: image: "daprio/dashboard:latest" command: ["dapr", "dashboard", "--port", "8080", "--dapr-http-port", "6001"] # 指定Sidecar的HTTP端口 ports: - "8989:8080" depends_on: - webapplication4-api-dapr networks: - webapp-network
通过--dapr-http-port指定Sidecar的HTTP端口,让Dashboard能发现并连接到Sidecar。
内容的提问来源于stack exchange,提问作者Fenil Patel
相关产品推荐
相关产品推荐

