【问题标题】:Why a angular container needs a exposed port to connect?为什么一个角容器需要一个暴露的端口来连接?
【发布时间】:2020-07-04 11:35:54
【问题描述】:

这只是一个关于理论的问题,我的应用程序运行良好......

所以,我有 3 个使用 docker-compose 运行的服务:一个 postgres 数据库、一个 backend springboot 和一个 frontend angular。 p>

据我所知,docker容器可以访问其他docker容器的端口,而不需要暴露端口,所以不需要暴露或绑定端口,因为它们都是容器,可以通过默认的桥接器相互访问网络模式(这是我学的,不知道对不对)

我只需要从前端容器公开端口,这样我就可以从我的本地主机访问。

问题是:我可以使用后端(后端->数据库)访问数据库,而无需导出任何端口,但使用前端(前端->后端) 使用 Angular 和 nginx,它只适用于暴露的后端端口,为什么?

docker-compose.yml:

version: "3"
services:
  ### DATABASE ###
  db:
    image: postgres:latest
    container_name: mydb
    network_mode: bridge
    environment:
      - POSTGRES_PASSWORD=envpass
      - POSTGRES_USER=envuser
      - POSTGRES_DB=database

    # It works without exposing
    # expose: 
      # - 5432
    # ports:
      # - 5433:5432

  ### BACKEND ###
  backend:
    image: angularback
    container_name: backend
    network_mode: bridge
    expose:
      - 8080
    ports:
      - 8082:8080
    depends_on:
      - db
    links:
      - db

  ### FRONTEND ###
  frontend:
    image: angularfront
    container_name: frontend
    network_mode: bridge
    expose:
      - 80
    ports:
      - 8084:80
    depends_on:
      - backend
    links:
      - backend

【问题讨论】:

  • 您尚未将数据库配置为持久化数据。您需要创建一个卷并将其挂载到 postgres 存储其数据的位置。
  • 你用nginx构建了一个角度图像吗?

标签: angular docker nginx docker-compose containers


【解决方案1】:

您的 Angular 前端正在从前端容器外部向 Spring 后端发出请求。它正在从您的浏览器内部发出请求。这就是为什么后端也需要暴露的原因。

其次,您不需要links。由于两个服务都在同一个网络中,因此链接将自动完成。

这是一个更新的配置,它使用网络代替:

version: "3"
services:
  ### DATABASE ###
  db:
    image: postgres:latest
    environment:
      - POSTGRES_PASSWORD=envpass
      - POSTGRES_USER=envuser
      - POSTGRES_DB=database
    # Only add the ports here, if you want to access the database using an external client.
    # ports:
      # - "5433:5432"
    networks:
      - backend


  ### BACKEND ###
  backend:
    image: angularback
    ports:
      - "8082:8080"
    depends_on:
      - db
    networks:
      - backend
      - frontend


  ### FRONTEND ###
  frontend:
    image: angularfront
    ports:
      - "8084:80"
    depends_on:
      - backend
    networks:
      - frontend

networks:
  backend:
  frontend:

当不在生产环境中运行时,我还建议将所有端口直接绑定到主机接口 (127.0.0.1),以防止您网络中的其他人访问您机器上的端口,如下所示:

ports:
  - "127.0.0.1:8084:80"

【讨论】:

  • 谢谢!这就是我想知道的,现在它很有意义。 Angular 从浏览器(在容器外运行)发出请求,因为它是 javascript 并在客户端运行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2014-09-26
  • 1970-01-01
  • 2018-05-22
  • 2020-08-12
  • 1970-01-01
相关资源
最近更新 更多