Не удается получить доступ к бэкэнду rails-api с именем хоста в docker-compose

Я пытаюсь создать бэкэнд rails-api и реагировать на внешний веб-сайт с помощью docker-compose. Но я не смог отправить запрос на бэкэнд rails-api с помощью axios с моим именем хоста (указанным в docker-compose). Я могу получить доступ к серверной части через локальный хост, но это будет проблемой (я полагаю), когда я разверну мультиконтейнерное приложение на aws elastic beanstalk.

Я пытаюсь получить доступ к таким значениям:

const value = await axios.get('http://website:3000/api/v1/examples');

Это в моем docker-compose.yml:

version: '2'

services:
  website:
    depends_on:
      - 'postgres'
      - 'redis'
    build: .
    ports:
      - '3000:3000'
    volumes:
      - '.:/app'
    env_file:
      - '.env'
  frontend:
    build:
      context: ./../atwo-react-2
      dockerfile: Dockerfile.dev
    ports:
      - '3001:3001'
    volumes:
      - ./../atwo-react-2:/app
    depends_on:
      - website

вместо этого я получаю эту ошибку

GET http://website:3000/api/v1/examples net::ERR_NAME_NOT_RESOLVED в консоли Google

Заранее спасибо. Любая помощь приветствуется.


person Stan    schedule 22.07.2019    source источник
comment
Вы пытаетесь открыть http://website:3000/api/v1/examples в своем браузере и получаете эту ошибку? Что вы имеете в виду, говоря консоль Google?   -  person tgogos    schedule 22.07.2019
comment
Это конечная точка API, которую я должен вернуть. Под «консолью Google» подразумевается, когда я проверяю консоль браузера. Я использую интерфейс react.js, поэтому я проверяю консоль своего браузера на наличие ответа.   -  person Stan    schedule 22.07.2019
comment
Это обмен данными между контейнерами или хост-контейнер?   -  person tgogos    schedule 22.07.2019
comment
Связь между контейнерами. Я пробовал этот способ вызова apis с помощью httparty в рельсах, и он работает. Я называл это как http://‹container-hostname-in-docker-compose-yml›:5005/   -  person Stan    schedule 22.07.2019
comment
@tgogos Большое спасибо за вашу помощь. Удалось получить некоторое представление о проблеме и сделать исправление.   -  person Stan    schedule 23.07.2019


Ответы (1)


Мне удалось получить некоторую подсказку из сообщения о переполнении стека. Здесь Невозможно, чтобы контейнеры Docker взаимодействовали друг с другом . Как следует из ответа в сообщении, мне пришлось настроить контейнер nginx для проксирования (перенаправления) запроса.

Я изменил свой запрос axios на:

const value = await axios.get('/api/v1/examples');

И сделал контейнер nginx с файлом default.conf следующим образом:

upstream website {
    server website:3000;
}

upstream frontend {
    server frontend:3001;
}

server {
    listen 80;

    location / {
        proxy_pass http://frontend;
    }

    location /sockjs-node {
        proxy_pass http://frontend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }

    location /api {
        proxy_pass http://website;  
    }
}

Надеюсь, эта информация сможет помочь тому, кто застрял.

person Stan    schedule 23.07.2019
comment
Эй, Стэн, не могли бы вы объяснить этот подход? Я столкнулся с той же проблемой, но в моем случае добавление контейнера nginx не помогло. Ошибка Не удалось загрузить ресурс: net::ERR_NAME_NOT_RESOLVED появляется с my-backend:5000/api/ get/options - my-backend - это имя backend-контейнера... У меня заканчиваются решения, локально все отлично работает - person patreu22; 24.03.2020