Redis与Docker compose文件的连接失败
我正在使用一个开源repo中的docker compose文件。值得注意的是,它缺少Redis与Docker compose文件的连接失败,docker,redis,docker-compose,Docker,Redis,Docker Compose,我正在使用一个开源repo中的docker compose文件。值得注意的是,它缺少版本和服务键,但它仍然可以工作(到目前为止,我还没有看到没有这些键的compose文件) docker compose up启动一切,应用程序可以通过127.0.0.1:6379与redis通话 但是,当我重新添加版本和服务键时,与redis的连接被拒绝: version: '3' services: redis: image: redis ports: - '6379' ap
版本
和服务
键,但它仍然可以工作(到目前为止,我还没有看到没有这些键的compose文件)
docker compose up
启动一切,应用程序可以通过127.0.0.1:6379与redis通话
但是,当我重新添加版本
和服务
键时,与redis的连接被拒绝:
version: '3'
services:
redis:
image: redis
ports:
- '6379'
app:
build: .
environment:
- LOG_LEVEL='debug'
links:
- redis
其结果是:
[Wed Jan 03 2018 20:51:58 GMT+0000 (UTC)] ERROR { Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED 127.0.0.1:6379
at Object.exports._errnoException (util.js:896:11)
at exports._exceptionWithHostPort (util.js:919:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1073:14)
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 6379 }
为什么添加
version:'3'
和服务:
会导致连接失败?当您想将服务公开给特定的主机端口时,在Docker Compose version 3中,您应该使用以下语法:
ports:
- '6379:6379'
检查文档:
指定两个端口(主机:CONTAINER),或仅指定容器端口
(将选择一个随机主机端口)
您不需要为同一网络中的服务(组合文件)指定端口或链接。您可以使用:
version: '3'
services:
redis:
image: redis
app:
build: .
environment:
- LOG_LEVEL='debug'
然后在你的应用程序代码中把redis称为“redis:6379”。如果您看到的Dockerfile为,您可以看到端口已在末尾公开。这是在出现相同问题后对我有效的方法: docker-compose.yml
version: "3"
services:
server:
...
depends_on:
- redis
redis:
image: redis
我的redis配置文件:
const redis = require('redis');
const redisHost = 'redis';
const redisPort = '6379';
let client = redis.createClient(redisPort, redisHost);
client.on('connect', () => {
console.log(`Redis connected to ${redisHost}:${redisPort}`);
});
client.on('error', (err) => {
console.log(`Redis could not connect to ${redisHost}:${redisPort}: ${err}`);
});
module.exports = client;
该端口可能正在使用中。使用它杀死容器或重新启动docker将释放端口。这并不能解决问题。我最好奇的是,为什么从docker compose文件中删除
版本:“3”和服务:
会使localhost在应用程序容器中工作。也许它迫使docker容器像主机一样查看网络?
const redis = require('redis');
const redisHost = 'redis';
const redisPort = '6379';
let client = redis.createClient(redisPort, redisHost);
client.on('connect', () => {
console.log(`Redis connected to ${redisHost}:${redisPort}`);
});
client.on('error', (err) => {
console.log(`Redis could not connect to ${redisHost}:${redisPort}: ${err}`);
});
module.exports = client;