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

在.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:15:53