HTTP-запрос между двумя контейнерами - PullRequest
0 голосов
/ 05 мая 2020

Я создаю веб-сервис, который использует реакцию для внешнего интерфейса и django REST для внутреннего интерфейса. Оба работают в отдельных контейнерах docker. Мой файл docker -compose выглядит следующим образом:

services: 
 db:
  image: postgres
  volumes:
    - ./config/load.sql:/docker-entrypoint-initdb.d/init.sql
  environment:
    - POSTGRES_DB=postgres
    - POSTGRES_USER=postgres
    - POSTGRES_PASSWORD=postgres
web:
  build: .
  image: gudmundurorri4/hoss-web
  command: python manage.py runserver 0.0.0.0:8000
  volumes:
    - .:/code
  stdin_open: true
  ports:
    - "8000:8000"
  depends_on:
    - db
frontend:
  image: gudmundurorri4/hoss-frontend
  stdin_open: true
  ports:
    - "3000:3000"
  depends_on:
    - "web"

И веб-контейнер, и контейнер внешнего интерфейса работают нормально. Бэкэнд работает, когда я открываю его в браузере и когда выполняю запрос на получение http://web: 8000 из контейнера внешнего интерфейса, я получаю правильный ответ. Однако, когда я выполняю запрос GET из своего приложения для реагирования, используя тот же адрес (http://web: 8000 ), он всегда терпит неудачу с ошибкой

net :: ERR_NAME_NOT_RESOLVED

1 Ответ

1 голос
/ 05 мая 2020

Имена служб Compose - это только вещи внутри самих контейнеров (настраиваются с помощью локального DNS magi c).

С точки зрения вашего (или пользовательского) браузера не существует такой вещи, как http://web:8000.

Вам нужно будет либо

  • publi sh с портом и DNS-именем, доступным вашим пользователям, например https://backend.myservice.kittens/, и иметь интерфейс, который запускается в вашем браузере, запрашивает вещи оттуда (помните о CORS).
  • или пусть прокси-сервер клиентской службы отправляет эти запросы на бэкэнд (что это может получить доступ через http://web:8000/ ). Если вы используете webpack-dev-server, у него есть встроенная возможность.
...