相关文章推荐
一身肌肉的麦片  ·  c# - SQL Server ...·  1 年前    · 
另类的木瓜  ·  Xml Entity ...·  1 年前    · 
爱喝酒的刺猬  ·  c++ ...·  2 年前    · 
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I'm working with a docker-compose file from an open-source repo. Notably, it's missing the version and services keys, but it still works (up until now, I have not seen a compose file without these keys).

redis:
  image: redis
  ports:
    - '6379'
   build: .
   environment:
     - LOG_LEVEL='debug'
   links:
     - redis

docker-compose up starts everything up and the app is able to talk to redis via 127.0.0.1:6379.

However, when I add the version and services keys back in, connections to redis are refused:

version: '3'
services:
  redis:
    image: redis
    ports:
      - '6379'
    build: .
    environment:
      - LOG_LEVEL='debug'
    links:
      - redis

Which results in:

[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 }

Why does adding version: '3' and services: lead to failure to connect?

You don't need to specify the ports neither the links for services in the same network (compose file). You can use:

version: '3'
services:
  redis:
    image: redis
    build: .
    environment:
      - LOG_LEVEL='debug'

And then in your app code refer to redis just as 'redis:6379'. If you see the Dockerfile for the redis image you can see the port is already exposed at the end.

When you want to expose the service to a specific host port, in Docker Compose version 3 you should use this syntax:

ports:
  - '6379:6379'

Check the docs here:

Either specify both ports (HOST:CONTAINER), or just the container port (a random host port will be chosen).

that doesn't solve the problem. Mostly I am curious why removing version: '3' and services: from the docker-compose file makes localhost work in the app container. Perhaps it forces docker containers to see the network like the host machine? – rgwozdz Jan 4, 2018 at 15:29 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;

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.