node.js - Docker-compose 部署 redis 但 app.js 拒绝连接

标签 node.js docker redis docker-compose

我正在尝试将 nodejs 应用程序容器化。该应用程序在我手动安装并运行 redis 的 Node 容器上运行良好,但是当我尝试使用我的 docker-compose 文件在容器中运行该应用程序时,出现错误:

“错误错误:Redis 连接到本地主机:6379 失败 - 连接 ECONNREFUSED 127.0.0.1:6379”。

我将在下面发布我的 docker-compose.yml 和 dockerfile 以及当我尝试执行 docker-compose up 时的控制台日志。

FROM node:8-jessie

WORKDIR /var/api-console

COPY package*.json ./
RUN npm install

COPY . . /var/api-console/

RUN apt-get update
RUN apt-get install python

EXPOSE 3000
version: '3'
services:
  redis:
    image: redis
    ports:
      - "6379:6379"
    command:
      redis-server
    networks:
      - webnet
  app:
    build: ./
    volumes:
      - ./:/var/api-console
    ports:
      - 3000:3000
    command:
      node app.js
    networks:
      - webnet
networks:
  webnet:
AIDEVERSUSCATCH:api-console evan.dhillon$ docker-compose up
WARNING: The Docker Engine you're using is running in swarm mode.

Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.

To deploy your application across the swarm, use `docker stack deploy`.

Starting api-console_app_1   ... done
Starting api-console_redis_1 ... done
Attaching to api-console_app_1, api-console_redis_1
redis_1  | 1:C 04 Jun 2019 03:12:27.660 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 04 Jun 2019 03:12:27.660 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 04 Jun 2019 03:12:27.660 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1  | 1:M 04 Jun 2019 03:12:27.661 * Running mode=standalone, port=6379.
redis_1  | 1:M 04 Jun 2019 03:12:27.661 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1  | 1:M 04 Jun 2019 03:12:27.661 # Server initialized
redis_1  | 1:M 04 Jun 2019 03:12:27.661 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
redis_1  | 1:M 04 Jun 2019 03:12:27.661 * DB loaded from disk: 0.000 seconds
redis_1  | 1:M 04 Jun 2019 03:12:27.661 * Ready to accept connections
app_1    | Express server listening on port 3000
app_1    | Error Error: Redis connection to localhost:6379 failed - connect ECONNREFUSED 127.0.0.1:6379
app_1    | Error AbortError: Redis connection lost and command aborted. It might have been processed.
app_1    | events.js:183
app_1    |       throw er; // Unhandled 'error' event
app_1    |       ^
app_1    | 
app_1    | Error: Redis connection to localhost:6379 failed - connect ECONNREFUSED 127.0.0.1:6379
app_1    |     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1191:14)
api-console_app_1 exited with code 1

最佳答案

您日志中的这一行解释了连接失败

Redis connection to localhost:6379 failed

Node 应用程序期望 redis 位于本地主机上,但事实并非如此。

您可以通过环境变量将redis容器的地址提供给您的 Node 应用。

同时在应用服务中添加一个depends_on,让它等待redis服务。修改后的 compose 文件如下

version: '3'
services:
  redis:
    image: redis
    ports:
      - "6379:6379"
    command:
      redis-server
    networks:
      - webnet
  app:
    build: ./
    volumes:
      - ./:/var/api-console
    ports:
      - 3000:3000
    depends_on:
      - redis
    environment:
      redis_server_addr: redis   
      #The dependent service address is set in environment variable which you can use in your app to connect
    command:
      node app.js
    networks:
      - webnet
networks:

关于node.js - Docker-compose 部署 redis 但 app.js 拒绝连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56436960/

相关文章:

apache - 如何在端口 80 上运行 Node.js?

redis - 无法更改端口号

php - Nginx和PHP容器之间的Docker连接被拒绝

java - Redisson 尝试连接到内部 redis IP,而不是配置中指定的 float redis IP

redis - Redis MATCH操作中如何使用OR条件

node.js - 无法使用 'autoAttachChildProcesses' 调试 fork 进程

node.js - 使用 "npm install pcap"安装 pcap 时出错

node.js - rtorrent xml-rpc 命令加载 torrent 并从 Nodejs 获取添加的 torrent 的 id

tomcat - Docker Webapp 没有出现

tomcat - tomcat7服务的奇怪错误