【问题标题】:Linked docker-compose containers making http requests链接的 docker-compose 容器发出 http 请求
【发布时间】:2017-10-28 08:26:57
【问题描述】:

我在网上搜索了一段时间,但没有找到与 StackOverflow 问题 Docker HTTP-requests between containers 类似的问题的解决方案。但是这个答案已经是我在我的电脑上做的事情了。我正在提供我的 docker-compose 文件

version: "3"
services:
  web:
    image: ecdavis15/tsn-web-server
    ports:
      - "3000:3000"
    links:
      - app
  app:
    image: ecdavis15/tsn-app-server
    ports:
      - "3030:3030"
    links:
      - mongo
  mongo:
    image: mongo
    ports:
      - "27017:27017"
    volumes:
      - ./data/db:/data/db

在我的 Web 容器中,我向 http://app:3030/historyhttp://app:3030/rules 发出了 http get 请求,但我没有看到该请求到达应用程序容器。我在浏览器控制台中看到的是这个错误消息net::ERR_NAME_NOT_RESOLVED。我不确定为什么 http 请求没有进入应用程序容器,因为它已链接到 Web 容器。有什么想法吗?

【问题讨论】:

  • 您能否从您的 Web 容器中 ping 应用程序容器?
  • 请求是如何产生的?通过 AJAX 还是通过服务器端代码?
  • 删除链接部分,您尝试做的事情不需要它。 Docker 为同名提供了 dns。
  • Ajax 调用是由您的浏览器而不是您的应用程序进行的。所以你不能使用app:3030,因为浏览器不知道它。相反,您应该使用document.location.host + ":3030" 来生成 api 所在的 url。
  • 尝试使用主机名而不是主机。 Chrome 也使用您的系统主机文件而不是容器。您也可以使用 nginx 将它们合并到一台服务器下

标签: docker docker-compose docker-for-mac


【解决方案1】:

由于您进行了 Ajax 调用,它将由客户端而非服务器端的浏览器发送。因此,当您从<IP>:3000app:3030 调用 API 时,您的浏览器不知道应用程序是什么。所以你可以做的事情很少

使用主机文件

/etc/hosts

<IP> app 

那么当你使用app:3000浏览应用时,app:3030会自动指向正确的地址。

使用javascript判断API url

您可以使用 javascript 来获取您应该用于 api 的 url

document.location.scheme + "://" + document.location.hostname + ":3030"

使用 nginx

你可以创建nginx反向代理

location / {
   proxy_pass http://localhost:3000;

   location /api {
      proxy_pass http://localhost:3030;
   }
}

这将需要对您的代码文件进行一些更改,以便您使用/api

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多