funseiki
funseiki

Reputation: 9527

Docker Compose: Allowing Network Interactions Between Services

I'd like to have two Docker containers, which are defined in the same docker-compose.yaml file to be able to share a network and interact with each others' exposed ports. I'm running all of this on Docker for Mac.

In order to do so, I've set up a couple docker containers that are running a tiny Flask server which can either return a "Hello" or make a request to another server (see below for details). So far, I've been unable to allow the two apps to communicate with each other.

What I've tried so far:

All of the above examples give me a Connection Refused error, so I feel like I'm missing something basic about Docker networking.

The Networking in Compose doc mentions the following:

When you run docker-compose up, the following happens:

...

  1. A container is created using db’s configuration. It joins the network myapp_default under the name db.

And their example appears to have all the separate services be able to communicate without any network definitions, which leads me to believe that I probably should not need to define a network either.

Below is my docker-compose.yaml file - all the files can be found at this gist:

version: '3'
services:
    receiver:
        build: ./app
        # Tried with/without expose
        expose:
            - 3000
        # Tried with/without ports
        ports:
            - 3000:3000
        # Tried with/without 0.0.0.0
        command: "--host 0.0.0.0 --port 3000"
        # Tried with/without explicit network
        networks:
          - mine
    requester:
        build: ./app
        expose:
            - 4000
        ports:
            - 4000:4000
        # This one's ip is 0.0.0.0, so we can access from host
        command: "--host 0.0.0.0 --port 4000"
        networks:
          - mine
networks:
  mine: {}

The app.py file:

@app.route("/")
def hello():
    return "Hello from {}".format(request.host)

@app.route("/request/<int:port>")
def doPing(port):
     location = "http://localhost:{}/".format(port)
     return requests.get(location, timeout=5).content

Upvotes: 1

Views: 746

Answers (1)

Mazel Tov
Mazel Tov

Reputation: 2182

in docker-compose the services that are on same network can access each other by its name, you dont even have to expose the ports to host. so your docker-compose.yaml can be simplified to:

version: '3'
services:
receiver:
    build: ./app
    command: "--host 0.0.0.0 --port 3000"
requester:
    build: ./app
    command: "--host 0.0.0.0 --port 4000"

and inside the container requester you can access the other one with

ping receiver

that resolves the name and you can verify the port is also open, for example with netcat

nc -z receiver 3000 -v

Upvotes: 2

Related Questions