我正在使用来自开源代码库的docker-compose文件。值得注意的是,它缺少version
和services
键,但它仍然有效(直到现在,我还没有看到没有这些键的撰写文件)。
redis:
image: redis
ports:
- '6379'
app:
build: .
environment:
- LOG_LEVEL='debug'
links:
- redis
docker-compose up
启动所有内容,应用程序可以通过127.0.0.1:6379与redis对话。
但是,当我重新添加version
和services
密钥时,会拒绝与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'
和services:
会导致无法连接?
答案 0 :(得分:1)
您无需在同一网络(撰写文件)中指定端口和服务链接。您可以使用:
version: '3'
services:
redis:
image: redis
app:
build: .
environment:
- LOG_LEVEL='debug'
然后在您的应用代码中将redis称为'redis:6379'。如果你看到redis image的Dockerfile,你可以看到端口已经暴露在最后。
答案 1 :(得分:0)
如果要将服务公开给特定主机端口,请在Docker Compose版本3中使用以下语法:
ports:
- '6379:6379'
检查文档here:
指定两个端口(HOST:CONTAINER),或仅指定容器端口 (将选择随机主机端口。)
答案 2 :(得分:0)
在遇到相同问题后,这对我有用:
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;
答案 3 :(得分:0)
该端口可能正在使用中。使用它杀死该容器,或者重新启动docker会释放该端口。