从dockerized网页到后端服务器的API调用以net :: ERR_CONNECTION_REFUSED结束

时间:2016-12-02 11:57:41

标签: docker docker-compose

我有2个容器正在运行:

  • 基于nginx的前端应用/容器(在浏览器中打开的网页),尝试在" / search"进行API调用端点。网页是静态的,可以通过将网页内容复制到/usr/share/nginx/html
  • 来获得
  • 端口8080上可用的后端服务器

为什么我不能为/search发出GET请求,以便后端处理此请求?

我总是在浏览器的控制台中获得net::ERR_CONNECTION_REFUSED,即使我已将它们链接起来。

这是我的配置:

services:
   backend:
      image: docker.xxxxx.net/yyyyyy/zzzzzzzz:latest
      expose:
         - "8080"
      ports:
         - "8333:8080"

   frontend:
      build:
         dockerfile: Dockerfile
         context: .
      depends_on:
         - "backend"
      links:
         -  backend
      ports:
         - "80:80"
      volumes:
         - ./build:/usr/share/nginx/html

重要提示,在另一台服务器上启动后端允许我进行API调用(唯一出现的问题是CORS),因此后端代码没问题且问题必须在错误的docker配置中。

我可以清楚地打开前端,但是我无法进行任何API调用:我已经尝试了许多类似调用的东西:

  • http://backend/search?q=test
  • http://backend:8080/search?q=test
  • http://backend:8333/search?q=test
  • http://frontend/search?q=test
  • http://frontend:8080/search?q=test
  • http://frontend:8333/search?q=test

结果是一样的。什么可能是错的?

3 个答案:

答案 0 :(得分:2)

我假设GET请求来自您的浏览器,即来自主机NOT而不是来自前端容器。根据您的配置,8080从后端容器暴露到前端容器,端口8333暴露给docker主机。因此http://backend:8080只能从前端容器中看到,而不能从主机看到。因此,可能必须http://<docker_ip>:8333/search?q=test才能从后端容器获取响应。

答案 1 :(得分:0)

尝试通过docker提供的环境变量与源码头进行通信。见this

答案 2 :(得分:0)

使用nginx处理您的CORS错误。

在你的nginx.conf中配置一个反向代理。

server {
    listen 80 default_server;
    server_name _;

      location /search {
       proxy_pass http://backend:8080;
    }
...
}

此(或类似)应解决您的net :: ERR_CONNECTION_REFUSED权限错误