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

How to make request to linked container from frontend js?

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

一个 docker 容器是 rails api 唯一的应用程序。第二个是 node.js 应用 angular.

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

docker-compose.yml

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

我试图使用 docker 为我提供的 ENV 变量访问 rails 容器。喜欢 MICROSERVICEAPP_RAILS_SERVER_1_PORT_3000_TCP_ADDRMICROSERVICEAPP_RAILS_SERVER_1_PORT_3000_TCP_PORT。相应地有 env vars return 172.17.0.23000。 但重点是浏览器客户端无法访问内部 docker 专用网络。所以我无法向我的 rails 应用发出请求。我想我可以将请求发送回节点 js,然后发送到 rails 但感觉不对。

我该如何解决这个问题?

根据您所写的内容,您似乎需要从浏览器访问 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 容器

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

例如。我的 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