发布 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的主要内容,如果未能解决你的问题,请参考以下文章