Зачем контейнеру angular нужен открытый порт для подключения? - PullRequest
1 голос
/ 24 марта 2020

это просто вопрос теории, мое приложение работает отлично ...

Итак, у меня есть 3 службы, работающие с docker -композицией: postgres база данных * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * 10 * * * * * * * 10 * * '' docker *. Я не знаю, что *1030*. выставить порт, поэтому нет необходимости открывать или связывать порты, потому что все они являются контейнерами и могут обращаться друг к другу с помощью режима моста по умолчанию (это то, что я узнал, не знаю, правильно ли это) .

Мне нужно только открыть порт из контейнера внешнего интерфейса, чтобы я мог получить доступ с моего локального хоста.

Дело в том, что я могу получить доступ к базе данных с помощью внутреннего интерфейса (backend -> database) без необходимости экспорта каких-либо портов, но с внешним интерфейсом (frontend -> backend) с использованием 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

1 Ответ

1 голос
/ 24 марта 2020

Ваш 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"
...