docker-compose make requests between containers

Viewed 25823

I'm a bit new to docker-compose, so I'm not so sure what am I looking for even.

I created two images, and I'm running them using docker-compose, on a local environment these two services communicate via HTTP requests (both are running on localhost, one service on port 3000, one service on port 8000)

When I moved those two services to docker (two separated containers and images) I can't seem to make them communicate.

this is my docker-compose file:

version: '3'

services:
  service1:
    image: services/services1
    ports:
      - 3000:3000
    links:
      - "service2"
    depends_on:
      - service2

  service2:
    image: services/service2
    ports:
      - 8000:8000

When I'm making http requests directly to each of the services I get a good response, but when I'm making a request to service1 and in services1 I have another request to service 2, I can't get a response at all

Error: connect ECONNREFUSED 127.0.0.1:8000

Both services are running on 0.0.0.0

4 Answers

so I'm not so sure what am I looking for even.

Most probably you are looking for this part of the docker documentation. It explains how docker compose is treating network. Part of particular interest for you is this:

By default Compose sets up a single network for your app.
Each container for a service joins the default network and is both reachable
by other containers on that network, and discoverable by them 
at a hostname identical to the container name.

Meaning that you should use service1 and service2 instead of localhost to target across services.

All the services declared in the docker-compose.yml file are running in their own container. They have different ips. You can address them with their service name that will resolve to the service ip. In your case:

docker-compose exec service1 ping service2
or
docker-compose exec service2 ping service1

You should define a network and use the name of the service instead of localhost:

version: '3'

services:
  service1:
    image: services/services1
    ports:
      - 3000:3000
    links:
      - "service2"
    depends_on:
      - service2
    networks:
      - mynet

  service2:
    image: services/service2
    ports:
      - 8000:8000
    networks:
      - mynet

networks:
  mynet:

There are cases where your configuration is correct, but there is happening that you have a CORS issues.

In my case I was using react-js in my frontend service, so I added a proxy in package.json file.

...
"proxy": "http://{container_name}:80/api",
...
Related