【问题标题】:Redis connection failedRedis 连接失败
【发布时间】:2020-06-16 00:04:57
【问题描述】:

我正在构建一个使用 Node、redis 和 mongo 的应用程序。开发完成了,想用docker来容器化。

这是我的Dockerfile

FROM node:13.8.0-alpine3.11
RUN npm install -g pm2
WORKDIR /user/src/app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000

这里是我的docker-compose.yml

version: '3'
services:
  redis-server:
    container_name: scrapr-redis
    image: 'redis:6.0-rc1-alpine'
    ports:
      - '6379:6379'
  mongo-db:
    container_name: scrapr-mongo
    image: mongo
    ports:
      - '27017:27017'
    command: --auth
    environment:
      - MONGO_INITDB_ROOT_USERNAME=user
      - MONGO_INITDB_ROOT_PASSWORD=pass
      - MONGO_INITDB_DATABASE=db
  app:
    container_name: scrapr-node
    restart: always
    build: .
    ports:
      - '3000:3000'
      - '3001:3001'
    links:
      - mongo-db
    depends_on:
      - redis-server
    environment:
      - DB_USER=user
      - DB_PWD=pass
      - DB_NAME=db
      - REDIS_HOST=redis-server
    command: 'node index.mjs'

我可以成功启动服务,但是当node启动时,会产生如下错误:

错误错误:Redis 连接到 127.0.0.1:6379 失败 - 连接 ECONNREFUSED 127.0.0.1:6379

当我执行docker ps -a 时,我可以看到所有容器都在运行:

为什么连接不上redis?我错过了什么?

【问题讨论】:

    标签: javascript node.js docker redis


    【解决方案1】:

    127.0.0.1 在我看来根本不合适。让我先快速检查一下,您确定您在节点应用程序中正确使用了 REDIS_HOST 环境变量吗?我会在您的节点应用程序中添加一些控制台日志记录,以回显环境变量以检查它们是什么。

    其次,如果 sh 不起作用,请尝试使用 docker container exec -it scrapr-node sh 或 /bin/bash 附加到正在运行的 scrapr-node。

    然后从 shell 运行nslookup scrapr-redis,这将为您提供 redis 容器的 IP 地址。如果ping scraper-redis 返回,那么您知道这是您的节点应用程序而不是 docker 网络的问题。

    您也可以执行到 redis 节点并运行 hostname -I,它应该显示与您在其他容器中看到的相同的 IP 地址。

    这应该可以帮助您调试问题。

    编辑:

    确保您使用process.env.REDIS_HOST 将环境中的值正确获取到节点应用程序中,然后在连接到 redis 时正确使用该值,例如:

    const redisClient = redis.createClient({
      host: process.env.REDIS_HOST,
      port: 6379
    });
    

    我不会尝试在 docker 网络上强制使用 127.0.0.1(如果可能的话),它被保留为环回地址。

    【讨论】:

    • 你是对的。 nslookup scrapr-redis 返回 127.0.0.11:53。是否可以将容器主机更改为 127.0.0.1 用于 redis?我做了很多搜索,但找不到正确的方法来做到这一点。例如,我发现了这个article
    • 我会说你 99% 都在 docker 中运行它。请查看我对答案的编辑。想要 127.0.0.1 是否有特定原因???
    • 您参考的文章没有将redis服务器的ip设置为127.0.0.1,它显示了如何运行多个redis容器以及如何将不同的名称别名到正在运行的容器中。当您正在学习并且不会担心尝试做那种事情时,这非常复杂。而是为您的直接问题集中精力在节点应用程序中创建 redis 客户端时使用正确的变量/ ip 地址
    猜你喜欢
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 2021-07-19
    • 2021-06-25
    • 2019-08-01
    相关资源
    最近更新 更多