此问题已在此处有答案:
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连接的错误。
任何帮助将非常感谢。非常感谢!
2条答案
按热度按时间6pp0gazn1#
在Docker中,每个容器都是独立运行的,所以
localhost
意味着不同的东西。您机器上的localhost
与快递集装箱中的localhost
不同。Redis在你的机器上运行在
127.0.0.1:6379
上,但不在express容器中的那个地址上。这就是为什么在容器外运行express可以正常工作的原因。你可能需要Docker compose。
express服务中的
REDIS_URL: redis:6379
是关键部分,它告诉express容器在哪里可以联系到redis,在Docker compose中使用服务名称。cygmwpex2#
[解析] This文章真的很有帮助!要使其在本地工作,我们需要将redis URL更改为:
所以我完整的redis客户端配置:
非常感谢大家的参与!我真的非常感谢帮助!