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
解决方案
- 移除RedisHost的HTTP前缀
Redis使用TCP协议而非HTTP,RedisHost只需设置为容器名redis即可,不需要http://前缀。修改appsettings.json:
"RedisHost": "redis"
检查Redis配置的绑定地址
确保redis.conf中的bind配置为0.0.0.0,允许所有IP访问。如果绑定的是127.0.0.1,Redis容器只会监听本地回环地址,其他容器无法连接。添加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" // 建议从配置文件或环境变量读取 };
- 统一Redis配置方式
当前代码同时使用AddStackExchangeRedisCache和手动注册IConnectionMultiplexer,建议保持统一。可以直接通过配置字符串整合所有参数:
builder.Services.AddStackExchangeRedisCache(options => { options.Configuration = $"{appServicesSettings.RedisHost}:{appServicesSettings.RedisPort},password=Teste@123,abortConnect=false"; options.InstanceName = "SampleInstance"; });
这种方式无需手动创建ConnectionMultiplexer,AddStackExchangeRedisCache会自动处理连接逻辑。
- 验证Docker网络连通性
Docker Compose默认会为所有服务创建共享网络,执行docker exec api ping redis测试容器间连通性。如果不通,检查是否自定义了网络配置,确保api和redis服务在同一网络中。
内容的提问来源于stack exchange,提问作者CerraossoUC
相关产品推荐
相关产品推荐

