在docker for rails应用程序rest-client中启用CORS

我有两个应用程序运行在不同的泊坞窗图像。 首先暴露在端口3000:3000和第二4000:4000。 第一个应用程序有一些资源,我想通过第二个应用程序使用rest-client获取。

docker集装箱可能是个问题。

这里有错误:

  • Errno :: ECONNREFUSED在FilmsController#index中

  • 无法打开TCP连接到本地主机:3000(连接被拒绝 – 连接(2)为“本地主机”端口3000)

//第一个应用程序:

  • 公开http:// localhost:3000 / movies上的资源
  • 对其他networking开放
  • 允许交叉来源请求

第一个应用程序的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 

因为它是一个应用程序,一切工作正常。 当我分成两个docker集装箱时出现问题。 我想, 一个容器阻止来自另一个容器的请求 ,但找不到解决scheme。 任何帮助将非常感激。

每个docker容器默认运行在一个单独的networking名称空间中,其中包括获取独立于每个其他容器和主机的专用回送接口(又称localhost)。 要连接两个容器,它们需要在同一个dockernetworking上,然后只要该networking不是名为“bridge”(名称,不是networking驱动程序)的默认networking,就可以使用其容器名称。 请注意,您不需要将容器的端口发布或公开到容器networking,前者仅用于允许外部访问容器。

所以,如果你使用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。