为什么有角容器需要裸露的端口进行连接?

时间:2020-03-23 23:53:31

标签: angular docker nginx docker-compose containers

这只是有关理论的问题,我的应用运行良好...

因此,我有3种服务在docker-compose上运行: postgres数据库后端springboot 前端angular

据我所知,docker容器可以从其他docker容器访问端口,而无需暴露端口,因此无需暴露或绑定端口,因为它们都是容器,并且可以使用默认网桥相互访问网络模式(这是我学到的,不知道这是否正确)

我只需要从前端容器中公开端口,即可从本地主机访问该端口。

问题是:我可以使用后端(backend-> database)访问数据库,而无需导出任何端口,但是可以使用前端(frontend-> backend)< / em>在Nginx中使用angular,它只能在后端端口暴露的情况下工作,为什么?

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

1 个答案:

答案 0 :(得分: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"