включить CORS в докере для приложений rails rest-client

У меня два приложения работают в разных образах докеров. Первый открыт для портов 3000: 3000, а второй - 4000: 4000. Первое приложение имеет некоторые ресурсы, которые я хочу получить вторым приложением, использующим rest-client.

Наверное, проблема с контейнерами докеров.

Вот ошибки:

  • Errno :: ECONNREFUSED в FilmsController # index

  • Не удалось открыть TCP-соединение с localhost: 3000 (в соединении отказано - подключение (2) для порта 3000 localhost)

// ПЕРВАЯ ЗАЯВКА:

  • предоставляет ресурсы на http://localhost:3000/movies
  • открыт для других сетей
  • разрешает запрос с перекрестным происхождением

application.rb файл для первого приложения

module Movies
   class Application < Rails::Application
      config.web_console.whiny_requests = false

      config.middleware.insert_before 0, Rack::Cors do
        allow do
          origins '*'
          resource '*', :headers => :any, :methods => [:get, :post, 
          :options]
       end
     end
  end
end

// ВТОРОЕ ПРИЛОЖЕНИЕ:

  • работает на порту: 4000
  • есть одна модель фильма
  • один контроллер

Модель фильма:

class Film
  require 'rest-client'
    def self.all
      RestClient.get 'localhost:3000/movies.json'
  end
end

Films_controller:

class FilmsController < ApplicationController
  def index
    render json: Film.all
  end
end

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


person elmuzyk    schedule 25.05.2017    source источник


Ответы (1)


Каждый контейнер докеров по умолчанию работает в отдельном сетевом пространстве имен, что включает в себя получение собственного частного интерфейса обратной петли (также известного как localhost), который отделен от всех других контейнеров и хоста. Чтобы подключиться между двумя контейнерами, они должны быть в одной сети докеров, и если эта сеть не является сетью по умолчанию с именем «мост» (имя, а не сетевой драйвер), вы можете подключаться между контейнерами, используя их контейнер. название. Обратите внимание, что вам не нужно публиковать или открывать порт для контейнера для сети контейнера, это необходимо только для разрешения внешнего доступа к контейнеру.

Итак, если вы используете docker run (в противном случае вы должны включить свой docker-compose.yml), у вас будет:

docker network create railsnet
docker run --net railsnet --name=app1 ...
docker run --net railsnet --name=app2 ...

А затем, если app1 прослушивает порт 3000 внутри контейнера, вы можете подключиться из app2 к app1: 3000 / xyz.

person BMitch    schedule 25.05.2017
comment
Спасибо за ваш ответ. Я запустил контейнеры, а затем подключил их к сети, набрав: docker network create railsnet docker network connect railsnet app1 docker network connect railsnet app2 НО ЭТО НЕ РЕШЕНИЕ - person elmuzyk; 26.05.2017
comment
Пожалуйста, объясните, почему это не решение для вас, и возникла ли у вас новая ошибка. - person BMitch; 26.05.2017
comment
Ошибка все та же. Я уверен, что это «проблема с докером», потому что, когда я тестирую приложения на другом компьютере (без докера), все работает нормально. - person elmuzyk; 26.05.2017
comment
Если ошибка такая же, значит, вы не выполнили описанные выше действия с тестируемой средой. Обновите свой вопрос, указав шаги, которые вы выполнили. - person BMitch; 26.05.2017
comment
Я использую docker-compose.yml для обоих приложений. Что именно я должен добавить в docker-compose, чтобы реализовать ваши предложения? - person elmuzyk; 26.05.2017
comment
Чтобы получить совет о том, что изменить в docker-compose.yml, включите этот файл в свой вопрос. Если ваш вывод по-прежнему показывает соединения с localhost, значит, вы выполнили только 3 строки кода выше, не следуя остальным советам. - person BMitch; 26.05.2017
comment
Вот как это выглядит. Мне очень жаль, что он не просматривается должным образом. Пинг между участниками работает, но приложения Rails - нет. Я знаю, что это может выглядеть как проблема с Rails, но это не так, потому что на другой машине без докеров работают приложения. - person elmuzyk; 26.05.2017
comment
Это раздел комментариев к ответу, ваш вопрос находится выше и включает ссылку для редактирования. Пожалуйста, используйте это место для публикации обновлений по вашему вопросу. Такой код публикации в комментариях не читается. См. Также: stackoverflow.com/help/mcve - person BMitch; 26.05.2017
comment
Наконец, я нашел решение. Я правильно настроил docker-compose.yml :) К сожалению, я не могу правильно поместить его в текст комментария. Спасибо, BMitch! - person elmuzyk; 26.05.2017