node.js - Docker 容器里无法连接其他容器运行的 Redis

 追风神驹体育专营_462 发布于 2022-10-31 21:16

log

Error: Redis connection to redis:6379 failed - connect ECONNREFUSED 221.179.46.194:6379
    at Object.exports._errnoException (util.js:1022:11)
    at exports._exceptionWithHostPort (util.js:1045:20)
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1087:14)

ping

/ # ping mysql
PING mysql (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.101 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.097 ms
64 bytes from 172.19.0.2: seq=2 ttl=64 time=0.100 ms
^C
--- mysql ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.097/0.099/0.101 ms
/ # ping redis
PING redis (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.069 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.134 ms
64 bytes from 172.19.0.3: seq=2 ttl=64 time=0.112 ms
^C
--- redis ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.069/0.105/0.134 ms
/ # 

docker-compose

    redis:
      image: redis
    what:
      image: daocloud.io/who/what
      restart: always
      depends_on:
        - mysql
        - redis
2 个回答
  • 找到原因了

    1. 这里变动了hostname要另外注入 https://github.com/mcollina/m...
      server.js

    原本的写法

    persistence: {
      factory: mosca.persistence.Redis,
      url: config.redis.host.concat(':').concat(config.redis.port) // 拼接出来不合法的参数redis:6379
    }

    更正

    persistence: {
      factory: mosca.persistence.Redis,
      host: 'your redis host',
      port: 'your redis port'
    }
    1. persistance的构造方法
      lib/persistence/redis.js

    var Redis = require("ioredis");
    RedisPersistence.prototype._buildClient = function() {
      var options = this.options.redisOptions || {};
    
      if (this.options.host) {
        options.host = this.options.host;
      }
    
      if (this.options.port) {
        options.port = this.options.port;
      }
    
      if (this.options.db) {
        options.db = this.options.db;
      }
    
      if (this.options.password) {
        options.password = this.options.password;
      }
    
      return new Redis(options);
    };
    1. 这是一个ioredis的API,参考 https://github.com/luin/iored...
      仅仅支持以下参数,并不支持url参数

    var redisOnPort6380 = new Redis(6380);
    var anotherRedis = new Redis(6380, '192.168.100.1');
    var unixSocketRedis = new Redis({ path: '/tmp/echo.sock' });
    var unixSocketRedis2 = new Redis('/tmp/echo.sock');
    var urlRedis = new Redis('redis://user:password@redis-service.com:6379/');
    var urlRedis2 = new Redis('//localhost:6379');
    var authedRedis = new Redis(6380, '192.168.100.1', { password: 'password' });

    就是不知道为什么连接出错不会报错???一直重试到,直接内存爆炸

    2022-10-31 23:24 回答
  • 运行容器时候的命令、端口是怎么映射的。

    2022-10-31 23:24 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有