Windows下Docker部署Redis遇网络连接被拒绝错误求助
解决Docker Redis连接被拒绝的问题
一、检查Docker Redis容器的端口映射
- 运行容器时必须显式映射6379端口到主机,执行以下命令创建容器:
docker run -d -p 6379:6379 --name redis redis:latest - 验证端口映射:执行
docker ps查看容器的PORTS列,确认存在0.0.0.0:6379->6379/tcp或[::]:6379->6379/tcp的映射记录 - 若已运行的容器未配置端口映射,需删除容器后重新创建(这是最直接的修复方式)
二、修改Redis配置允许外部访问
官方Redis镜像默认仅绑定容器内部的127.0.0.1,主机无法直接访问,需调整配置:
- 启动容器时直接指定参数(推荐):
其中docker run -d -p 6379:6379 --name redis redis:latest redis-server --bind 0.0.0.0 --requirepass pass--bind 0.0.0.0允许所有IP访问,--requirepass pass设置认证密码(与代码中的密码保持一致) - 或自定义配置文件挂载:
创建redis.conf文件,添加以下内容:
再通过挂载配置文件启动容器:bind 0.0.0.0 requirepass passdocker run -d -p 6379:6379 -v ./redis.conf:/usr/local/etc/redis/redis.conf --name redis redis:latest redis-server /usr/local/etc/redis/redis.conf
三、修正Dart代码中的问题
1. 修复AUTH命令格式
Redis的AUTH命令默认不需要用户名,代码中多余的default参数会导致认证失败,修改后:
await command.send_object(['AUTH', 'pass']);
2. 优化连接复用与错误处理
避免每次请求新建连接,同时区分连接错误和认证错误:
final conn = RedisConnection(); Handler middleware(Handler handler) { return (context) async { Response response; try { final command = await conn.connect('localhost', 6379); try { // 修正后的AUTH命令 await command.send_object(['AUTH', 'pass']); response = await handler.use(provider<Command>((_) => command)).call(context); } catch (authErr) { await command.close(); // 认证失败关闭连接 response = Response.json( body: {'success': false, 'message': 'Redis认证失败: ${authErr.toString()}'}, ); } } catch (connErr) { response = Response.json( body: {'success': false, 'message': 'Redis连接失败: ${connErr.toString()}'}, ); } return response; }; }
四、检查Windows防火墙设置
- 确保Windows防火墙允许Docker Desktop的网络请求,可暂时关闭防火墙测试(测试完成后恢复开启)
- 排查是否有安全软件拦截6379端口的连接请求
内容的提问来源于stack exchange,提问作者Anmol Singh
相关产品推荐
相关产品推荐

