从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权限错误