Django 'failed connection' между двумя контейнерами

В настоящее время я пытаюсь установить связь между двумя моими контейнерами docker (запрашивающий контейнер, работающий под управлением Gunicorn/Django, и api контейнер, работающий под управлением kroki).

Я просмотрел другие ответы, но, похоже, не нашел решения, поэтому надеялся на небольшой толчок в правильном направлении.

Docker-compose:

version: '3.8'

services:
  app:
    build:
      context: ./my_app
      dockerfile: Dockerfile.prod
    command: gunicorn my_app.wsgi:application --bind 0.0.0.0:8000 --access-logfile -
    volumes:
      - static_volume:/home/app/web/staticfiles
    expose:
      - 8000
    environment:
      - DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 kroki
    env_file:
      - ./.env.prod
    depends_on:
      - db
  db:
    image: postgres:13.0-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    env_file:
      - ./.env.prod.db
  nginx:
    build: ./nginx
    volumes:
      - static_volume:/home/app/web/staticfiles
    ports:
      - 1337:80
    depends_on:
      - app
  kroki:
    image: yuzutech/kroki
    ports:
      - 7331:8000

volumes:
  postgres_data:
  static_volume:

settings.py

ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS").split(" ")

Код запроса в django

url = 'http://kroki:7331/bytefield/svg/' + base64_var
        try:
            response = requests.get(url)
            return response.text
        except ConnectionError as e:
            print("Connection to bytefield module, unavailable")
            return None

Я могу успешно получить доступ к обоим контейнерам через браузер, однако инициирование кода для внутреннего вызова между ними выдает

requests.exceptions.ConnectionError: HTTPConnectionPool(host='kroki', port=7331): Max retries exceeded with url: /bytefield/svg/<API_URL_HERE> (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f286f5ecaf0>: Failed to establish a new connection: [Errno 111] Connection refused'))

Я пробовал получить доступ к url через localhost:7331 иamp; 127.0.0.1:7331, но ни то, ни другое не помогает

Когда вы обращаетесь к другим контейнерам внутри одного и того же network, вам не нужно обращаться к ним, используя открытый порт в host, а вместо этого использовать фактический порт, который прослушивает приложение внутри контейнера.

Я сделал действительно простой пример, чтобы вы могли понять, в чем ваша проблема:

version: '3.8'

services:
  app:
    image: busybox
    entrypoint: tail -f /dev/null
  kroki:
    image: yuzutech/kroki
    ports:
      - 7331:8000

От хозяина

❯ curl -s -o /dev/null -w "%{http_code}" localhost:7331

200

Приложение

/ # wget kroki:7331
Connecting to kroki:7331 (172.18.0.3:7331)
wget: can't connect to remote host (172.18.0.3): Connection refused
/ # wget kroki:8000
Connecting to kroki:8000 (172.18.0.3:8000)
saving to 'index.html'
index.html           100% |************************************************************************| 51087  0:00:00 ETA
'index.html' saved
Вернуться на верх