Docker无法从其他服务连接到redis

时间:2018-06-12 13:13:11

标签: node.js docker redis

我无法弄清楚如何从我的redis服务连接到我的app服务。使用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

我总是得到某种形式:

  

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

     

错误:Redis连接到redis:6379失败 - 连接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"]

app Dockerfile

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

搬运工-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'

5 个答案:

答案 0 :(得分:3)

看起来您的redis映像配置为侦听127.0.0.1而不是所有接口。这不是默认redis映像的问题,因此要么使用docker hub中的官方映像,要么更正配置以侦听0.0.0.0。

您可以使用netshoot进行验证:

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

在redis conf中,通过在redis.conf中注释掉“bind”行来监听所有界面。

答案 1 :(得分:0)

localhost容器的角度来看,

app将无法离开app容器。所以最好的办法是使用redis或主机的IP地址。

如果您想从redis容器中获取app,则需要将它们链接或将它们放入同一网络中。请使用相同的网络名称向这两个服务添加network属性。然后,Docker将为您提供有效的服务名称dns查找。

请参阅https://docs.docker.com/compose/compose-file/#networks(适用于service:媒体资源)和https://docs.docker.com/compose/compose-file/#network-configuration-reference(适用于顶级networks媒体资源)的官方文档。

答案 2 :(得分:0)

让我用简单的语言解释一下。当您运行docker-compose up时,它将在单独的容器中运行redis和app。现在,您的应用程序需要连接/访问redis容器(请记住,redis不在您的计算机本地主机上,而是在容器内,并在默认端口6379内运行)。默认情况下,Docker会将应用程序容器和Redis容器保持在同一网络中,并且您可以通过其服务名称访问容器(在您的情况下为redis和app),以便从应用程序容器全部访问redis您需要使用默认端口6379,主机将成为服务名称(在您的情况下为“ redis”)。

对于在容器中运行的节点应用程序,可以通过

访问Redis(它也在容器中运行)

const redis = require("redis");
const client = redis.createClient(6379, "service-name-for-redis-container");

答案 3 :(得分:0)

我解决了将 redis 主机从“localhost”更改为“redis”的问题,例如:

REDIS_HOST=redis

REDIS_PORT=6379

更改后,我的 docker 服务开始与 redis 通信。

原始论坛答案:https://forums.docker.com/t/connecting-redis-from-my-network-in-docker-net-core-application/92405

答案 4 :(得分:0)

就我而言,问题是我在 redis 上绑定了不同的端口:

redis:
    image: redis
    ports:
        - 49155:6379

我试图连接到端口 49155,但我需要通过端口 6379 进行连接,因为该连接来自另一个服务。