在 Nginx 中从 Angular 调用 API 无法解析 Docker 服务名称

2024-02-18

我有一个Angular应用程序运行在NginX Docker容器。

The Angular应用程序可以制作一个REST调用另一个容器(Spring Boot API Docker) using localhost作为服务器。

server: string = 'localhost';
return this.httpClient.post<MyClass[]>('http://' + this.server + ':6060/files-data/list-files', request);

But REST使用时调用失败Docker而是服务名称。

server: string = 'files-service';
return this.httpClient.post<MyClass[]>('http://' + this.server + ':8080/files-data/list-files', request);

*这次使用8080端口来尝试解析docker服务名称

UI 控制台中出现错误:

net::ERR_NAME_NOT_RESOLVED

使用默认值NginX带有默认值的图像nginx.conf.

  nginx-files-ui:
    image: nginx:latest
    container_name: nginx-files-ui
    volumes:
      - ./files-ui/dist/html:/usr/share/nginx/html
    ports:
      - 99:80

容器都在同一个上运行Docker网络。

networks:
  default:
    external:
      name: files-net

修改的nginx.conf包括解析器但没有乐趣。

resolver 127.0.0.11 valid=30s;

知道为什么我不能做一个REST呼叫使用Docker服务名称 ?

EDIT

浏览器中运行的 Angular 代码似乎无法解析服务名称。

Docker compose服务无法通过服务名称进行通信 https://stackoverflow.com/questions/44412367/docker-composed-services-cant-communicate-by-service-name


我认为这是在 docker 容器内运行应用程序时非常常见的误解,特别是对于浏览器应用程序:)。

您只能使用以下方式调用 APIservice name在您的应用程序中,如果您的应用程序和 api 是running and 被访问在同一网络内。在您的情况下,Angular 应用程序和您的后端在同一网络中运行,但 Angular 应用程序是从主机而不是容器内部访问的。

详细信息:在当前上下文中,当您从浏览器访问 Angular 应用程序时,您是在主机、主机网络中使用 Angular 应用程序,而不是在容器内,您的 Angular 应用程序是通过将端口从容器映射到主机来公开的。因此,当您发出 API 请求时,它将来自主机 -> docker 容器,此时主机将尝试解析service name在当前上下文中,当然从主机上没有service name

因此,对于所有浏览器应用程序,即使您使用docker容器部署它,但当您调用API时,大多数情况下您都必须使用localhost:<mapped_port>或者解析为不在 docker 容器内的主机(例如:域名)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Nginx 中从 Angular 调用 API 无法解析 Docker 服务名称 的相关文章

随机推荐