【问题标题】:Docker can't connect to redis from another serviceDocker 无法从其他服务连接到 redis
【发布时间】:2018-11-21 21:49:12
【问题描述】:

我不知道如何从我的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

我总是得到某种形式的:

错误: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"]

应用 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'

【问题讨论】:

  • 检查您的主机 6379 端口。有什么东西用过那个端口吗? sudo lsof -i tcp:6379
  • @TruongDang 它没有显示输出。我最初使用不同的端口,但切换回6379 进行调试。两者都有上述相同的错误。
  • 你能构建你的镜像并尝试将build: ./redis/替换为image: your_image_name_build_from_dockerfile吗?
  • 好像你的Redis 还没有开始……你可能需要检查你的docker文件和redis配置……
  • 请包含错误消息,它不会显示它连接到 localhost 或 127.0.0.1,因为这在容器之间不起作用。

标签: node.js docker redis


【解决方案1】:

您的 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”行来完成的。

【讨论】:

  • 谢谢,绑定到0.0.0.0 成功了! FROM redis:4.0.9不是“默认redis镜像”吗?
  • 这是基于官方图像,但您似乎已使用自己的配置扩展了该图像。
  • @BMitch 也遇到了这个问题,虽然我没有使用docker-compose.yml,而只是使用docker run --name some-redis -p 6379:6379 -d redis 命令。 netstat 的输出:i.imgur.com/Coq403Q.png 我仍然无法通过我的 node 应用程序连接到它
  • @Oscar 没有 docker-compose.yml,你的容器没有在同一个用户创建的网络上启动,所以你不会有 DNS 和容器到容器的网络。这是一个不同的问题。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    我解决了这个问题,将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】:

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

      redis:
          image: redis
          ports:
              - 49155:6379
      

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

      【讨论】:

      • 你救了我的命。我的节点应用程序来自另一个服务,但我试图通过 49155 连接。但你怎么知道呢?请告诉我怎么做?我以为 49155 是 reids 容器与全世界通信的端口?
      【解决方案5】:

      app 容器的角度来看,localhost 将无法离开app 容器。所以最好的办法是使用redis或者主机的ip地址。

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

      请参阅https://docs.docker.com/compose/compose-file/#networks(对于service: 属性)和https://docs.docker.com/compose/compose-file/#network-configuration-reference(对于顶级networks 属性)的官方文档。

      【讨论】:

      • 这不是问题,我通常在我的 docker-compose 中使用 redis。它工作正常......
      • @TruongDang 你是对的 - 相关文档是 docs.docker.com/compose/networking
      • 那我就按照你的说法来检查一下Redis进程是否真的启动了
      • @gesellix 谢谢我添加了一个网络,但仍然是同样的错误。 Redis 确实启动了,我可以在输出中看到。
      猜你喜欢
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      • 2020-06-13
      • 2021-09-02
      • 2013-02-25
      相关资源
      最近更新 更多