Redis与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

我正在使用一个开源repo中的docker compose文件。值得注意的是,它缺少
版本
服务
键,但它仍然可以工作(到目前为止,我还没有看到没有这些键的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;