无法从节点Docker容器连接到redis-stack-server(本地)[重复]

nfs0ujit  于 2023-10-15  发布在  Redis
关注(0)|答案(2)|浏览(173)

此问题已在此处有答案

From inside of a Docker container, how do I connect to the localhost of the machine?(43个回答)
2个月前关闭。
当我运行包含node express app.js的docker容器时,它无法连接到本地运行的redis-stack-server。
但是,如果我不使用Docker容器,一切都很好。
我运行esbuild生成一个app.js文件,但它是express ts app。它连接到redis-stack-server。这是我的Dockerfile

FROM node:18

ENV REDIS_URL="redis://localhost:6379"
ENV NODE_PORT=3000

COPY app.js .

EXPOSE 3000
CMD [ "node", "app.js" ]

下面是我如何在node app中设置redis客户端:

export const redisC = async () => {
    const client : RedisClientType = createClient();
    client.on('error', (err) => console.error('Redis Client Error', err));
    await client.connect();
    return client;
}

export let redisClient : RedisClientType;
redisC().then((response) => {
    redisClient = response
}).catch(error => console.error(error))

我在本地运行:

redis-stack-server

构建Docker容器:

docker build . -t my-app

然后我跑:

docker run -p 3000:3000 my-app

然而,当我运行Docker容器时,我遇到了以下问题:

Redis Client Error Error: connect ECONNREFUSED 127.0.0.1:6379
    at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1495:16) {
  errno: -111,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 6379
}

如果我在本地运行app.js而不是docker,那么一切都正常。

Express listening on port 3000

没有关于Redis连接的错误。
任何帮助将非常感谢。非常感谢!

6pp0gazn

6pp0gazn1#

在Docker中,每个容器都是独立运行的,所以localhost意味着不同的东西。您机器上的localhost与快递集装箱中的localhost不同。
Redis在你的机器上运行在127.0.0.1:6379上,但不在express容器中的那个地址上。这就是为什么在容器外运行express可以正常工作的原因。
你可能需要Docker compose

services:
  express:
    ...
    environment:
      REDIS_URL: redis:6379
    ports:
      - 3000:3000 // <- forwards traffic from port 3000 on your machine to port 3000 in container

  redis:
    ...
    ports:
      - 6379:6379 // <- same as above

express服务中的REDIS_URL: redis:6379是关键部分,它告诉express容器在哪里可以联系到redis,在Docker compose中使用服务名称。

cygmwpex

cygmwpex2#

[解析] This文章真的很有帮助!要使其在本地工作,我们需要将redis URL更改为:

url: "redis://host.docker.internal:6379"

所以我完整的redis客户端配置:

export const redisC = async () => {
    const client : RedisClientType = createClient({
        url: "redis://host.docker.internal:6379",
    });
    client.on('error', (err) => console.error('Redis Client Error', err));
    await client.connect();
    return client;
}

非常感谢大家的参与!我真的非常感谢帮助!

相关问题