发布 redis 和 docker

Posted

技术标签:

【中文标题】发布 redis 和 docker【英文标题】:issue redis and docker 【发布时间】:2022-01-11 13:12:27 【问题描述】:

我目前在使用 docker 时遇到了一个非常奇怪的错误,更准确地说是使用 redis。

我的后端使用 nodejs 和 typescript 运行:

代码

const redisPubSubOptions: any = 
  host: process.env.REDIS_HOST || "127.0.0.1",
  port: process.env.REDIS_PORT || 6379,
  connectTimeout: 10000,
  retryStrategy: (times: any) => Math.min(times * 50, 2000),
;

export const pubsub: RedisPubSub = new RedisPubSub(
  publisher: new Redis(redisPubSubOptions),
  subscriber: new Redis(redisPubSubOptions),
);

Dockerfile

FROM node:14-alpine as tsc-builder

WORKDIR /usr/src/app

COPY . .
RUN yarn install

EXPOSE 4000

CMD yarn run dev

码头工人撰写

version: "3.8"

services:
  
  backend:
    build: .
    container_name: backend
    ports:
      - 4242:4242
    depends_on:
      - redis
    env_file:
      - ./docker/env/.env.dev
    environment:
      - ENVIRONMENT=development
      - REDIS_PORT=6379
      - REDIS_HOST=redis

  redis:
    image: redis:6.0.12-alpine
    command: redis-server --maxclients 100000 --appendonly yes
    hostname: redis
    ports:
      - "6379:6379"
    restart: always

当我启动我的服务器时,后端工作,然后出现 redis 错误:

错误:连接 ECONNREFUSED 127.0.0.1:6379

【问题讨论】:

您的代码中是否有其他内容试图连接到 Redis?或者,REDIS_HOST 是否也设置在 .env.dev 文件中?如果你修改你的代码只打印出process.env.REDIS_HOST 的值,它会显示什么?我希望您在此处包含的代码能够正常工作。 【参考方案1】:

Redis 和您的后端都在不同的容器上运行,因此它们在 docker 网络中具有不同的 IP 地址。您正在尝试连接到127.0.0.1,这是后端容器的本地地址。

方法一:

由于您使用的是docker-compose(当然它会在服务之间创建一个网络),您可以使用服务名称而不是127.0.0.1。例如:

const redisPubSubOptions: any = 
  host: process.env.REDIS_HOST || "redis",
  port: process.env.REDIS_PORT || 6379,
  connectTimeout: 10000,
  retryStrategy: (times: any) => Math.min(times * 50, 2000),
;

export const pubsub: RedisPubSub = new RedisPubSub(
  publisher: new Redis(redisPubSubOptions),
  subscriber: new Redis(redisPubSubOptions),
);

方法二:

另一种方法是将Redis端口暴露给Host机器中Docker接口的IP地址。大多数时候是172.17.0.1,但使用ip -o a(如果您使用的是Linux),您可以看到Docker 接口及其IP 地址。 所以你需要这样做:

  redis:
    image: redis:6.0.12-alpine
    command: redis-server --maxclients 100000 --appendonly yes
    hostname: redis
    ports:
      - "172.17.0.1:6379:6379"
    restart: always

此地址 172.17.0.1:6379(或主机上的任何 Docker 接口 IP 地址)应为 Redis 公开。您可以轻松地在应用程序中使用此地址。

注意:您可以使用环境变量来处理这些值,这是一种更好、更标准的解决方案。你可以看看at this。

【讨论】:

由于原始代码使用process.env.REDIS_HOST 作为其首选,我希望设置environment: [REDIS_HOST=redis] 可以工作,根本不需要修改代码。 哦。谢谢你提到这一点。我没注意。

以上是关于发布 redis 和 docker的主要内容,如果未能解决你的问题,请参考以下文章

Dockerdocker-compose安装 Redis

dockerdocker 常用命令

dockerdocker 常用命令

Docker容器简介及命令

dockerdocker镜像和镜像发布方法

dockerdocker虚拟容器的使用大全