【问题标题】:Redis create client always connecting to 127.0.0.1 even if i specifically change the redis host ipRedis 创建客户端始终连接到 127.0.0.1,即使我专门更改了 redis 主机 ip
【发布时间】:2022-01-04 19:15:08
【问题描述】:

我在尝试将我的应用容器连接到 redis 容器时遇到问题。

不断收到相同的错误 -> 错误:连接 ECONNREFUSED 127.0.0.1:6379

但这只有在我在 docker 容器中运行时才会发生。如果我尝试仅在容器中运行 redis,并且我的本地应用程序似乎一切正常。

这是我连接到 redis 的 .js 代码的一部分:

const express = require('express');
const router = express.Router();
const userService = require('../service/userService')
const constants = require('../helpers/constants')
const redis = require('redis');
const client = redis.createClient(6379, 'redis');
client.connect();


var checkCache = async (req, res, next) => {
    
    const data = await client.get('get-users');
    if(!data){
        next();
    }else{
        client.disconnect();
        return res.status(200).json(JSON.parse(data));
    }
  };


router.get('/users', checkCache, async function (req, res) {
    const users = await userService.getUser();
    client.set('get-users', JSON.stringify(users));
    client.expire('get-users', 60);
    client.disconnect();
    return res.status(200).json(users)

});

我的 docker-compose.yml:

version: '3.2'
services:
  redis:
    container_name: "redis"
    image: redis:latest
    ports:
      - "6379:6379"
    networks:
      node_net:
        ipv4_address: 172.28.1.4
    volumes:
      - $PWD/redis.conf:/usr/local/etc/redis/redis.conf
    command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
  market:
    tty: true
    container_name: "market_place"
    build:
      context: ./
      dockerfile: ./docker/Dockerfile
    volumes:
      - .:/usr/src/app
    networks:
      node_net:
        ipv4_address: 172.28.1.5
    ports:
      - "${MF_PORT:-4000}:4000"
    depends_on:
      - redis
    links:
      - redis
networks:
  node_net:
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16

构建并启动容器后出现的错误如下:

Listening in port 4000
market_place | node:internal/process/promises:246
market_place |           triggerUncaughtException(err, true /* fromPromise */);
market_place |           ^
market_place | 
market_place | Error: connect ECONNREFUSED 127.0.0.1:6379
market_place |     at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1161:16)
market_place | Emitted 'error' event on Commander instance at:
market_place |     at RedisSocket.<anonymous> (/usr/src/app/node_modules/@node-redis/client/dist/lib/client/index.js:332:14)
market_place |     at RedisSocket.emit (node:events:390:28)
market_place |     at RedisSocket._RedisSocket_retryConnection (/usr/src/app/node_modules/@node-redis/client/dist/lib/client/socket.js:146:14)
market_place |     at processTicksAndRejections (node:internal/process/task_queues:96:5)
market_place |     at async RedisSocket._RedisSocket_connect (/usr/src/app/node_modules/@node-redis/client/dist/lib/client/socket.js:113:55)
market_place |     at async Commander.connect (/usr/src/app/node_modules/@node-redis/client/dist/lib/client/index.js:156:9) {
market_place |   errno: -111,
market_place |   code: 'ECONNREFUSED',
market_place |   syscall: 'connect',
market_place |   address: '127.0.0.1',
market_place |   port: 6379
market_place | }
market_place | npm notice 
market_place | npm notice New minor version of npm available! 8.1.2 -> 8.3.0
market_place | npm notice Changelog: https://github.com/npm/cli/releases/tag/v8.3.0
market_place | npm notice Run npm install -g npm@8.3.0 to update!
market_place | npm notice 

有人可以解释为什么即使我的容器 ip 是 172.28.1.4,它仍试图连接到 127.0.0.1 吗?

如果我删除 docker compose 上的网络配置并在本地运行我的代码,我就可以连接并将所有内容保存在 redis 数据库中。

我已经检查了此处发布的其他一些问题,但没有一个问题提出并解决了我的问题。

谢谢!

【问题讨论】:

    标签: javascript docker express docker-compose redis


    【解决方案1】:

    您的代码在创建客户端时未提供 Redis 容器的 IP。试试这个:

    // const client = redis.createClient(6379, 'redis');
    const client = redis.createClient({
      socket: {
        port: 6379,
        host: '172.28.1.4',
      }
    });
    

    查看createClient configuration了解更多信息。

    【讨论】:

    • 非常感谢@Eranga Heshan。我用你的建议编辑了代码,它工作了。
    • 可以使用Compose服务名redis作为主机名,而不是手动配置IP地址;请参阅 Docker 文档中的 Networking in Compose。您可以通过删除不必要的手动 networks:container_name:links: 选项来显着简化 Compose 设置,而无需真正更改除此主机名设置之外的任何其他内容。
    • 也会尝试@DavidMaze。如果它有效,它似乎肯定是一个更优雅的解决方案。感谢您的回答!
    猜你喜欢
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2018-07-29
    • 2017-07-06
    • 2012-05-22
    相关资源
    最近更新 更多