如何从前端js请求链接容器?

时间:2016-02-23 11:56:35

标签: ruby-on-rails node.js docker docker-compose

我正在使用docker-compose构建应用程序。

一个docker容器是仅限rails api的应用程序。第二个是带角度的node.js app。

我需要的是对rails容器发出POST和GET请求,以便将数据从它获取到我的Angular应用程序。

搬运工-compose.yml

library(ggplot2)

radius <- function(h, s){
  return((4 * h^2 + s^2) / 8 * h )
}

p <-ggplot(data.frame(x = c(0.0, 20)), aes(x))

plot(
p + stat_function(fun=radius, aes(color="10"), args=list(s=10))
  + stat_function(fun=radius, aes(color="20"), args=list(s=20))
  + stat_function(fun=radius, aes(color="30"), args=list(s=30))
  + stat_function(fun=radius, aes(color="40"), args=list(s=40))
  + scale_y_continuous(limits = c(0,1000))
)

我尝试使用docker compose为我提供的ENV变量来访问rails容器。与rails_server: build: ./rails_server nodejs_server: build: ./nodejs_server ports: - "80:8080" links: - rails_server MICROSERVICEAPP_RAILS_SERVER_1_PORT_3000_TCP_ADDR一样。 env vars相应地返回MICROSERVICEAPP_RAILS_SERVER_1_PORT_3000_TCP_PORT172.17.0.2。 但重点是浏览器客户端无法访问内部docker专用网络。所以我无法向我的rails应用程序发出请求。我想我可以将请求发送回节点js然后发送到rails但是感觉不对。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

所以正确的方法是在我的nodejs容器上使用代理服务器。

例如。 My Express js正在寻找/ api端点的请求,只是将它们代理到我的RoR容器。

像:

var config = {
  api_uri: process.env.MICROSERVICESCHAT_API_1_PORT_3000_TCP || "http://localhost:3000"
}

var apiProxy = httpProxy.createProxyServer();

app.all('/api/*', function (req, res) {
  req.url = req.url.replace(/\/api/, '');
  apiProxy.web(req, res, { target: config.api_uri });
});

您可以在此处的示例应用https://github.com/gabyshev/microservices_chat

中更仔细地查看

答案 1 :(得分:0)

根据您所写的内容,您似乎需要从浏览器访问rails_server,这意味着rails_server应该可以从外部访问。与发布nodejs_server容器的端口类似,发布rails_server容器的端口:

rails_server:
  build: ./rails_server
  ports:
    - "8080:8080"
nodejs_server:
  build: ./nodejs_server
  ports:
    - "80:8080"
  links:
    - rails_server

这种方式在浏览器中,如果您请求http://host_ip_address:8080/,它将被重定向到您的rails_server容器