###############
Docker 文件
###############
FROM node:alpine
WORKDIR '/app'
COPY package.json .
RUN yarn
COPY . .
CMD ["yarn","run","start"]
###################
docker-compose.yml
###################
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "8081:8081"
---------------------------app.js----------------- --------------
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host:'localhost',
port: 6379
});
client.set('visits', 0);
app.get('/', (req, res) => { client.get('visits', (err, visits) => { res.send('Number of visits is ' + visits); client.set('visits', parseInt(visits) + 1); }); });
app.listen(8081, () => { console.log('Listening on port 8081'); });
################################
错误信息
################################
<块引用>节点:事件:346 扔er; // 未处理的“错误”事件 ^
错误:连接 ECONNREFUSED 127.0.0.1:6379
答案 0 :(得分:0)
正如我从 app.js
代码中看到的,您试图通过使用 localhost
从另一个 docker 容器访问一个 docker 容器,这是错误的。 Docker-compose 为您的服务创建一个网络,并默认为它们提供与服务名称相同的主机名。您可以参考 docker compose networking documentation 了解更多详情。
因此,您应该通过 redis-server
主机而不是 localhost
从您的应用访问 redis 服务。
此外,您的 docker-compose 文件中没有暴露的 redis 端口。它应该看起来像
version: '3'
services:
redis-server:
image: 'redis'
- "6379:6379"
node-app:
build: .
ports:
- "8081:8081"
并且您的应用程序应该在下一步创建 redis 连接:
const client = redis.createClient({ host:'redis-server', port: 6379 });