0

I deploy 2 applications in different Docker container: 1 application-Django 2 application-FastAPI I have view function "view_request" in my Django-app, which make request to FastAPI app. From my browser Chrome I make request to Django endpoint, which run "view_request" function in Django, which make request to FastAPI app. Then I have this:

ConnectionError HTTPConnectionPool(host='127.0.0.1', port=8100): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f146c6a61c0>: Failed to establish a new connection: [Errno 111] Connection refused'))

FastAPI app This container run by command: docker run -d --name fast_api -p 8100:8000 fast_api Dokerfile:

FROM python:3.8.10-slim

# 
WORKDIR /code

# 
COPY ./requirements.txt /code/requirements.txt

# 
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

# 
COPY ./app /code/app

# 
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8100"]

file main.py:

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def root():
    return {
        "message": (
            "Hello World !!!!!!"
            "This message from FastApi!"
        )
    }


if __name__ == '__main__':
    uvicorn.run(app, host='127.0.0.1', port=8100)

Django app This container run by command: docker run --name sim_app -it -p 8000:8000 sim_app

Dokerfile:

FROM python:3.8.10-slim

RUN mkdir /app

COPY requirements.txt /app

RUN pip3 install -r /app/requirements.txt --no-cache-dir

COPY simple_app/ /app

WORKDIR /app

CMD ["python3", "manage.py", "runserver", "0:8000"] 

file views.py:

def view_request(request):
    template = 'api/index.html'
    data = requests.get(
        url='http://127.0.0.1:8100'
    )
    ready = data.json()
    
    context = {
        'ready': ready
    }
    return render(request, template, context)
Alexandr
  • 13
  • 2
  • 1
    In the client code, you're making a call to `http://127.0.0.1:8100`, but in a Docker context the localhost address always refers to the current container and not the other one or to something running on your host. See for example [How to communicate between Docker containers via "hostname"](https://stackoverflow.com/questions/30545023/how-to-communicate-between-docker-containers-via-hostname). – David Maze Jun 23 '23 at 13:53

1 Answers1

1

The 127.0.0.1 inside the container refers to the container itself, not the host machine. You runned the containers separately and if you want to Django app communicate FastAPI app, then

  • You can use Docker Networking. As this allows containers to communicate with each other in a network.
  • Or you can deploy multiple containers by using Docker compose

Steps

  • change 127.0.0.1 into fast_api, as this is the container name
def view_request(request):
    template = 'api/index.html'
    data = requests.get(
        url='http://fast_api:8100'
    )
    ready = data.json()
    
    context = {
        'ready': ready
    }
    return render(request, template, context)
  • Create a network
docker network create my_app_network
  • Then run docker containers within that network
docker run --network my_app_network --name sim_app -p 8000:8000 sim_app
docker run --network my_app_network --name fast_api -p 8100:8100 fast_api

Now sim_app will able to communicate with fast_api

You can also use docker-compose

version: '3'

services:
  sim_app:
    build:
      context: .
      dockerfile: ./Dockerfile-sim
    ports:
      - '8000:8000'
    depends_on:
      - fast_api

  fast_api:
    build:
      context: .
      dockerfile: ./Dockerfile-fast_api
    ports:
      - '8100:8100'

Hope this helps

PRATHEESH PC
  • 1,461
  • 1
  • 3
  • 15