Docker 容器正在使用我的主机 DNS 而不是 docker 内部 DNS

Docker container is using my host DNS instead of the docker internal DNS

我有一个构建两个基本应用程序的 docker-compose 文件。 angular 的前端和 adonis.

的后端
version: "3.9"
services:
  backend_login:
    build: 
      context: ./apis/apis/login_api
    ports:
      - "3333:3333"
  
  sendit_frontend:
    build: 
      context: ./frontend/frontend/external
    ports:
      - "4500:4200"
    depends_on:
      - api_backend_login

当我 运行 docker-compose 时,两个应用程序启动并在各自的端口工作。 当我使用服务名称从前端应用程序调用 api 时出现问题(在本例中为 backend_login)。

我将我的终端连接到两个容器并在它们之间进行了 telnet 测试,它们似乎工作正常,因为它们解析了名称并连接到各自的端​​口

最后,我发现前端应用程序在从 firefox 调用时尝试使用主机 dns 而非内部 docker dns 解析名称。

现在我不知道问题出在哪里,是在代码中还是在我构建容器的方式中。

编辑:我发现该应用程序 运行 在我主机的浏览器中运行(我是容器新手),显然它使用我的主机 DNS。

有没有办法解决这个问题?

docker compose 为 compose 文件中的所有服务设置了一个 docker 网络,允许它检测您正在谈论的 DNS 规则,但仅限于从服务到服务。正如您所指出的,您的 Angular 应用程序在技术上是来自浏览器(例如 Firefox)的“运行”,这意味着它不在网络内部。

没有从容器环境内部 运行 SPA 或 Angular 等静态站点的实用方法,但解决问题的简单方法是将前端指向 http://localhost:3333.您已将端口映射到主机,因此它应该可以直接从主机网络获得。

注意:当你到达那里时,这将是一个问题。当涉及到动态后端地址时,SPA 和静态站点可能会很棘手。大多数 SPA 框架建议您在每次部署到新环境时 re-build 应用程序,以便可以将后端地址构建到工件中,但这往往是 at-odds 和 container-centric 开发它倾向于保持“一次构建,随处部署”的理念。