Docker,独立的多个rails实例

时间:2016-06-08 08:30:43

标签: ruby-on-rails docker docker-compose microservices

我试图创建一个包含多个微服务的开发环境,就像在生产环境中一样。

我想与Docker两个rails applications一起运行,它们之间进行调用。

我知道我可以使用links,但有了这个,我总是必须将其中一个作为主要的一个。这意味着,我只能调试这个,我希望看到每个控制台的输出。也许我做错了什么,这就是我要问的原因。

这是我的docker-compose.yml文件:

rails-app-A:
  build: .
  dockerfile: "DockerfileA"
  environment:
    RAILS_ENV: development
  links:
    - db
  command: bundle exec rails server -p 3005 -b '0.0.0.0'
  volumes:
    - ".:/home/app"
  volumes_from:
    - bundle
  expose:
    - "3005"
  ports:
    - "3005:3005"

rails-app-B:
  build: .
  dockerfile: "DockerfileB"
  environment:
    RAILS_ENV: development
  links:
    - db
  command: bundle exec rails server -p 3000 -b '0.0.0.0'
  volumes:
    - ".:/home/app"
  volumes_from:
    - bundle
  expose:
    - "3000"
  ports:
    - "3000:3000"

这就是我运行rails app的方式:

docker-compose run --service-ports rails-app-A
docker-compose run --service-ports rails-app-B

我总是遇到这样的错误:

Errno::ECONNREFUSED: Connection refused - connect(2) for "localhost" port 3000

Errno::ECONNREFUSED (Failed to open TCP connection to localhost:3000 (Connection refused - connect(2) for "localhost" port 3000))

问题是我可以使用浏览器访问所有这些内容。

对于使用VirtualBox的OSX的Docker版本,这工作正常(只需调用localhost:3000localhost:3005),但在Ubuntu或Docker-beta中失败。

修改

我理解" localhost"对于rails-app-A是一个不同的服务器,因为" localhost"在rails-app-B中,因为它们作为不同的机器运行。当我有VirtualBox时我可以访问,因为我有VirtualBox实例的IP(192.169.99.100)。

我现在正在使用http://localtunnel.me/,我可以访问其他服务。但是,无论如何,有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

最后,我实现了使用external_link调用外部服务:

rails-app-A:
  build: .
  dockerfile: "DockerfileA"
  environment:
    RAILS_ENV: development
  links:
    - db
  external_links:
    - app_B

  ...ommited lines...

app_B应该是一个正在运行的容器,之前执行过如下:

docker-compose run --service-ports --name app_B rails-app-B

添加此--name app_B可以使用此名称进行访问。

我还不明白如何在没有先前打开rails-app-B的情况下build rails-app-A。如果rails-app-A将rails-app-B作为外部链接,而另一方向发生同样的情况,则builds将变得无法管理。