ultra909
ultra909

Reputation: 1748

Docker container fails to connect to second container when running under Compose

I have two processes that I have containerised as container1 and container2. I would like to run both of these together using Docker Compose. container1 should connect to container2. This does not currently work and I cannot figure out the problem.

Some test scenarios I have tried...

Run container2 using Docker Compose:

version: '2'
services:
  container2:
    image: container2
    ports:
      - "4003:4003"

Now run container1 source code from outside Docker and point to 127.0.0.1:4003 - connects ok.

Or run container2 as above; note the IP address, then run container1 also from Compose, referencing the IP directly - also connects ok:

version: '2'
services:
  container1:
    image: container1
    environment:
      - HOST=172.18.0.2
      - PORT=4003

But when I place them both in the same docker-compose.yml file, container1 never connects to container2, but can ping it by name - what gives?

version: '2'
services:
  container1:
    image: container1
    depends_on:
      - container2
    environment:
      - HOST=container2
      - PORT=4003
  container2:
    image: container2
    ports:
      - "4003:4003"    

Edit: it appears that there is a problem with using the container alias, as this also works:

version: '2'
services:
  container1:
    image: container1
    depends_on:
      - container2
    environment:
      - HOST=172.18.0.2
      - PORT=4003
  container2:
    image: container2
    ports:
      - "4003:4003"  

A further piece of the puzzle: internally container2 is using socat to expose the port the app is listening on:

echo "Forking :::4001 onto 0.0.0.0:4003\n"
socat TCP-LISTEN:4003,fork TCP:127.0.0.1:4001 

Seems that this doesn't work with the container alias for some reason?

Upvotes: 1

Views: 252

Answers (1)

Derick Bailey
Derick Bailey

Reputation: 72858

depends_on only set the order in which the containers start: https://docs.docker.com/compose/compose-file/#dependson

I think you need to include links as well: https://docs.docker.com/compose/compose-file/#links


version: '2'
services:
  container1:
    image: container1
    depends_on:
      - container2
    links:
      - container2
    environment:
      - HOST=container2
      - PORT=4003
  container2:
    image: container2
    ports:
      - "4003:4003"  

also, from the docs:

depends_on will not wait for [dependencies] to be “ready” before starting [the container] - only until they have been started. If you need to wait for a service to be ready, see Controlling startup order for more on this problem and strategies for solving it.

It's likely that your container1 app is starting before container2 is really ready to have connections.

Upvotes: 1

Related Questions