如何从 Angular Nginx 容器连接到 Node API docker 容器

Posted

技术标签:

【中文标题】如何从 Angular Nginx 容器连接到 Node API docker 容器【英文标题】:How to connect to Node API docker container from Angular Nginx container 【发布时间】:2020-12-11 07:22:45 【问题描述】:

我目前正在使用 Rest API(Express、Nodejs)和 Postgresql 开发 Angular 应用程序。在我的本地计算机上托管时一切正常。测试后,我将图像移至 Ubuntu 服务器,以便可以将应用程序托管在外部端口上。我可以使用 https://server-external-ip:80 访问角度前端,但是在尝试登录时,nginx 没有连接到 NodeApi。这是我的 docker-compose 文件:

version: '3.0' 

services:

  db:
    image: postgres:9.6-alpine
    environment:
      POSTGRES_DB: myDb
      POSTGRES_PASSWORD: myPwd

    ports:
    - 5432:5432
    restart: always
    volumes:
    - ./postgres-data:/var/lib/postgresql/data
    networks:
    - my-network

  backend: # name of the second service
   image: myId/mynodeapi
   ports:
   - 3000:3000
   environment:
    POSTGRES_DB: myDb
    POSTGRES_PASSWORD: myPwd
    POSTGRES_PORT: 5432
    POSTGRES_HOST: db
   depends_on:
   - db
   networks:
   - my-network

   command: bash -c "sleep 20 && node server.js"

  myapp:
    image: myId/myangularapp
    ports:
    - "80:80"
    depends_on:
    - backend
    networks:
    - my-network

networks:
    my-network:

我不确定 apiUrl 应该是什么?我尝试了以下方法,但没有任何效果:

    apiUrl: "http://backend:3000/api" apiUrl: "http://server-external-ip:3000/api" apiUrl: "http://server-internal-ip:3000/api" apiUrl: "http://localhost:3000/api"

【问题讨论】:

【参考方案1】:

我认为您应该将docker-compose 服务用作DNS。看来您有几个可用的 docker 主机/端口,在您的 docker-compose 结构中有以下内容:

db:5432 http://backend:3000 http://myapp

确保在backend 服务的环境部分中使用db 作为POSTGRES_DB

看看我的repo,我认为这是了解类似项目如何工作以及如何使用nginx 构建多个应用程序的最佳方式,您也可以查看我的docker-compose.yml,它使用多种服务和使用nginx 代理并一起工作。

在这个link 上,你会找到一个nginx/default.conf 文件,它包含几个nginx 上游配置,请看看我是如何在hosts 那里使用docker-compose 服务引用的。

在client/ 目录中,我还有另一个nginx 作为react.js 项目的Web 服务器。

在server/ 目录上,它有一个Node.js API,它连接到Redis 和同样由docker-compose.yml 构建的Postgres SQL 数据库。

如果您需要将流量设置或重定向到 /api,您可以使用一些 ngnix 配置,例如 this

我认为这个用例可能对您和其他用户有用!

【讨论】:

谢谢@Hugo Lesta。我会试试这个,让你知道。 很好,祝你好运,如果您需要更多帮助,请告诉我 这就是我要找的。这对我来说是一个新概念,所以我在尝试之前通读了文章,但它确实有效。非常感谢您的详细解释。不过有一个问题 - 我已经通过 localhost 访问应用程序在几台机器上对其进行了测试,但我如何使用myapp 访问它?我已经尝试过了,但它没有用。 server listen 80; server_name myapp; location / proxy_pass http://myapp; location /api proxy_pass http://backend:3000; 您好 :),您检查过容器状态了吗?它们都启动并运行了吗?您是否尝试在浏览器中运行localhost?如果我之前的回答有用,请标记为已解决,或许对其他用户有帮助。 如果您在虚拟机中托管此解决方案并运行这些容器,您将在该机器中绑定这些端口,这意味着您还可以拥有一个指向端口 80 的负载均衡器,并且它可以工作好吧,如果你也可以设置指向这台机器的 DNS 记录,它也可以工作。如果您只想创建一个名为 myapp 的简单主机,您应该设置您的内部主机文件来实现它。希望对你有帮助

以上是关于如何从 Angular Nginx 容器连接到 Node API docker 容器的主要内容,如果未能解决你的问题,请参考以下文章

docker nginx和php,php无法连接到localhost

从 pod 连接到其他 pod

如何从 Docker 容器连接到本地 Redis 服务器?

如何从 docker 容器连接到远程 mysql 托管?

如何从 Docker 容器连接到 Nvidia MPS 服务器?

如何从 asp.net core webapi 获取数据到连接到数据库的 angular 11.0.0。我试图这样做,但它返回空记录