Docker Compose运行的.NET应用如何配置Redis端口实现正常访问?
核心原因
Docker Compose 启动的.NET应用容器与单独通过docker run创建的Redis容器不在同一网络环境,导致.NET容器内的localhost指向容器自身而非宿主机,无法访问宿主机映射的5005端口。
解决办法(按推荐程度排序)
1. 将Redis容器加入Docker Compose的自定义网络(快速适配现有部署)
第一步:查看Docker Compose应用的网络名称
执行命令:docker network ls找到对应项目的网络,名称通常为
[你的项目名]_default。第二步:将Redis容器连接到该网络
执行命令(替换[compose-network-name]为实际网络名):docker network connect [compose-network-name] mtg-redis第三步:修改.NET应用的连接字符串
将appsettings.json中的Redis连接字符串从localhost:5005改为mtg-redis:6379——同一网络内可直接通过容器名访问,且使用Redis容器的内部端口6379(无需宿主机映射端口)。第四步:重启.NET应用容器
执行命令(替换[app-container-name]为你的应用容器名):docker restart [app-container-name]
2. 将Redis纳入Docker Compose统一管理(推荐生产环境使用)
修改docker-compose.yml,添加Redis服务配置,让两个容器自动处于同一网络:
services: redis: image: redis container_name: mtg-redis ports: - "5005:6379" # 保留宿主机映射端口,方便外部调试 dotnet-app: build: . # 你的.NET应用构建配置 ports: - "5002:8081" depends_on: - redis # 确保应用启动前Redis已就绪
然后修改appsettings.json的连接字符串为redis:6379,重新启动所有服务:
docker-compose up -d --build
3. 让.NET应用容器使用宿主机网络(仅临时测试用,不推荐生产)
在docker-compose.yml的应用服务中添加network_mode: host,此时容器内的localhost等同于宿主机,可直接使用localhost:5005连接:
services: dotnet-app: build: . network_mode: host # 注意:此时ports映射无需配置,因为共享宿主机网络
这种方式会破坏容器的网络隔离性,仅适合临时验证问题。
验证方法
修改完成后,可在.NET应用容器内执行ping命令测试Redis连通性:
docker exec -it [app-container-name] ping mtg-redis
如果能正常ping通,再测试缓存调用即可。
内容的提问来源于stack exchange,提问作者Hurrmer

