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

我有2个容器运行:

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

为什么我不能为/search做一个GET请求,以便这个请求由后端处理?

我总是得到net::ERR_CONNECTION_REFUSED在浏览器的控制台,即使我已经链接它们。

这是我的configuration:

 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),所以后端代码是可以的,问题必须在错误的dockerconfiguration中。

我可以清楚地打开前端,但我不能做任何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

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

我假设GET请求是从您的浏览器,即从主机不是从前端容器。 根据您的configuration,8080从后端容器暴露给前端容器,并且端口8333暴露于docker主机。 因此http://backend:8080只能在前端容器中看到,而不能在主机上看到。 所以它可能是http://<docker_ip>:8333/search?q=test从后端容器获取响应。

尝试通过docker提供的环境variables与源代码进行通信。 看到这个

用nginx处理你的CORS错误。

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

 server { listen 80 default_server; server_name _; location /search { proxy_pass http://backend:8080; } ... } 

这个(或类似的)应该解决你的net :: ERR_CONNECTION_REFUSED权限错误