node.js - Docker 无法从其他服务连接到 Redis

标签 node.js docker redis

我不知道如何从我的 app 服务连接到我的 redis 服务。使用 DDocker 版本 18.03.1-ce,为 Mac 构建 9ee9f40ocker。

我尝试将我在类似问题上发现的各种方法联系起来:

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

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

const client = redis.createClient('redis://redis:6379');

const client = redis.createClient('redis', 6379); // and reversed args

我总是得到某种形式的:

Error: Redis connection to localhost:6379 failed - connect ECONNREFUSED 127.0.0.1:6379

Error: Redis connection to redis:6379 failed - connect ECONNREFUSED 172.20.0.2:6379

Docker 容器

$ docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED              STATUS              PORTS                    NAMES
0fd798d58561        app_app         "pm2-runtime start e…"   2 seconds ago        Up 7 seconds                                 app
65d148e498f7        app_redis       "docker-entrypoint.s…"   About a minute ago   Up 8 seconds        0.0.0.0:6379->6379/tcp   redis

Redis 的工作原理:

$ docker exec -it redis /bin/bash
root@65d148e498f7:/data# redis-cli ping
PONG

Redis Dockerfile(非常简单)

FROM redis:4.0.9
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]

应用 Dockerfile

FROM node:10.3.0-slim
RUN mkdir -p /app
COPY src/* /app/
CMD ["pm2-runtime", "start", "/app/ecosystem.config.js"]

docker-compose.yml

version: "3"
services:
  redis:
    build: ./redis/
    container_name: redis
    restart: unless-stopped
    ports:
      - "6379:6379"
    expose:
      - "6379"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - 'API_PORT=6379'
      - 'NODE_ENV=production'
  app:
    depends_on:
      - redis
    build: ./app/
    container_name: app
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /app/node_modules
    environment:
      - 'NODE_ENV=production'

最佳答案

看起来您的 redis 镜像配置为监听 127.0.0.1 而不是所有接口(interface)。这不是默认 redis 镜像的问题,所以要么使用来自 docker hub 的官方镜像,要么更正您的配置以监听 0.0.0.0。

您将能够使用 netshoot 验证这一点:

docker run --rm --net container:app_redis nicolaka/netshoot netstat -ltn

在redis conf中,通过注释掉redis.conf中的“bind”行来监听所有接口(interface)。

关于node.js - Docker 无法从其他服务连接到 Redis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50818146/

相关文章:

performance - HMGET 以及字段数量和阅读性能之间的相关性

node.js - 能不能把 "tedious"模块browserify一下,这样nodejs程序就可以在浏览器中运行了?

node.js - 使用可扩展 Node.js/Express/MongoDB 的方法将用户匹配在一起进行 1v1 游戏

javascript - 从其他文件获取数据库信息

docker - 获取docker内部Go所有依赖包

java - 是否可以将 spring.cloud.config.uri 与 docker run 命令一起传递?

javascript - 我可以在 Express POST 请求中进行 DOM 操作吗?

docker - 我可以在 GCP 上运行 Docker 吗?

windows - 我如何将 Redis 扩展安装到 Windows Apache 服务器

c++ - Bredis 0.07 - 发送具有多个条目的 HMSET 命令