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

ASP.NET Core容器无法与Redis容器通信问题求助

问题:ASP.NET Core 8容器无法通过容器名连接Redis容器

我基于ASP.NET Core 8开发Redis缓存演示程序,本地用localhost:6379连接Redis完全正常,但ASP.NET Core容器运行时,尝试通过容器名http://redis:6379连接Redis容器,出现以下错误:

UnableToConnect on http://redis:6379/Interactive, Initializing/NotStarted


Docker Compose配置

api:
    image: api:latest
    container_name: api
    build:
        context: ../src/api
        dockerfile: ./Dockerfile
    ports:
        - "5168:5168"
    environment:
        - aspnetcore_environment=Production
        - aspnetcore_urls=http://+:5168
        
        
redis:
    image: redis:latest
    container_name: redis
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - ./volumes/redis.data:/usr/share/root/redis
      - ./volumes/redis.conf:/usr/share/redis/redis.conf
    environment:
      - REDIS_PASSWORD=Teste@123
      - REDIS_PORT=6379
      - REDIS_DATABASES=16   
    command: [ "redis-server", "/usr/share/redis/redis.conf"]

Program.cs代码

var redisOptions = new ConfigurationOptions
{
    EndPoints = { { appServicesSettings.RedisHost, appServicesSettings.RedisPort } },
    AbortOnConnectFail = false,
    DefaultDatabase = 0,
    ConnectTimeout = 15000,
    SyncTimeout = 15000
};

builder.Services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = appServicesSettings.Redis;
    options.InstanceName = "SampleInstance";
});

builder.Services.AddSingleton<IConnectionMultiplexer>(ConnectionMultiplexer.Connect(redisOptions));

appsettings.json配置

"AppServicesSettings": {
    "RedisLocal": "localhost:6379",
    "RedisHost": "http://redis",
    "RedisPort": 6379
}

使用的包版本

Microsoft.Extensions.Caching.StackExchangeRedis" Version="8.0.4

解决方案

  1. 移除RedisHost的HTTP前缀
    Redis使用TCP协议而非HTTP,RedisHost只需设置为容器名redis即可,不需要http://前缀。修改appsettings.json:
"RedisHost": "redis"
  1. 检查Redis配置的绑定地址
    确保redis.conf中的bind配置为0.0.0.0,允许所有IP访问。如果绑定的是127.0.0.1,Redis容器只会监听本地回环地址,其他容器无法连接。

  2. 添加Redis密码认证
    你的Redis设置了密码Teste@123,但当前配置未传入该参数,需要补充到ConfigurationOptions中:

var redisOptions = new ConfigurationOptions
{
    EndPoints = { { appServicesSettings.RedisHost, appServicesSettings.RedisPort } },
    AbortOnConnectFail = false,
    DefaultDatabase = 0,
    ConnectTimeout = 15000,
    SyncTimeout = 15000,
    Password = "Teste@123" // 建议从配置文件或环境变量读取
};
  1. 统一Redis配置方式
    当前代码同时使用AddStackExchangeRedisCache和手动注册IConnectionMultiplexer,建议保持统一。可以直接通过配置字符串整合所有参数:
builder.Services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = $"{appServicesSettings.RedisHost}:{appServicesSettings.RedisPort},password=Teste@123,abortConnect=false";
    options.InstanceName = "SampleInstance";
});

这种方式无需手动创建ConnectionMultiplexer,AddStackExchangeRedisCache会自动处理连接逻辑。

  1. 验证Docker网络连通性
    Docker Compose默认会为所有服务创建共享网络,执行docker exec api ping redis测试容器间连通性。如果不通,检查是否自定义了网络配置,确保api和redis服务在同一网络中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:45:10