Javascript Redis连接失败

Javascript Redis连接失败,javascript,node.js,docker,redis,Javascript,Node.js,Docker,Redis,我正在构建一个使用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'

我正在构建一个使用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'
我可以成功启动服务,但当节点启动时,它会生成以下错误:

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

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


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

其次,尝试使用
docker container exec-it scrapr node sh
或/bin/bash(如果sh不工作)连接到正在运行的scrapr节点

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

您还可以执行redis节点并运行
hostname-I
,它应该显示与您在另一个容器中看到的相同的ip地址

这将帮助您调试问题

编辑:

确保使用
process.env.REDIS\u 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。是否可以将redis的容器主机更改为127.0.0.1?我做了很多搜索,但找不到正确的方法。例如,我发现了这个,我想说你99%都在docker中运行这个。请参阅我对答案的编辑。想要127.0.0.1有什么特别的原因吗?您参考的文章没有将redis服务器的ip设置为127.0.0.1。它展示了如何让多个redis容器运行,以及如何在运行的容器中使用不同的名称。当你在学习时,这是相当复杂的,你不会担心尝试做那种事情。在node应用程序中创建redis客户端时,请将注意力集中在使用正确的变量/ip地址上