Как связать внешние и внутренние докеры - PullRequest
0 голосов
/ 08 июня 2018

В настоящее время я разрабатываю приложение Spring Boot и ReactionJs , используя Postgresql в качестве базы данных.Моя весна и мое приложение ReactionJs находятся в двух отдельных проектах.Я попытался докеризировать свое приложение, используя docker-compose.Итак, на стороне сервера у меня есть и мои postgresql, и мои springboot сервисы, определенные в файле docker-compose.

version: '3'
services:
  app:
    image: app
    depends_on:
    - mypostgres
    ports:
     - "9000:8086"
    environment:
      - DATABASE_HOST=mypostgres
      - DATABASE_USER=root
      - DATABASE_PASSWORD=root
      - DATABASE_NAME=test
      - DATABASE_PORT=5432



  mypostgres:
    image: postgres:9.6-alpine
    container_name: mypostgres

    ports:
     - "5433:5432"

    environment:
     - POSTGRES_PASSWORD=root
     - POSTGRES_USER=root
     - POSTGRES_DB=irooldb
    volumes:
    - ./postgres-data:/var/lib/postgresql/data

. Для Client side я не использовал docker-compose. Я только добавил Dockerfile и запустил свое клиентское приложение в отдельном контейнере.

Мои вопросы:

Как связать мой клиентский контейнер с моим контейнером на стороне сервера?

Должен ли я определить клиентскую службу в файле docker-compose, расположенном в проекте на стороне сервера?Или это нормально, что они бегут отдельно?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

я должен определить клиентскую службу в файле docker-compose, расположенном в проекте на стороне сервера?

Это один из вариантов, и это, вероятно, самый простой и простой способ.По умолчанию docker-compose устанавливает сеть докеров для сервисов, которые вы определяете для docker-compose.yml.Поскольку все службы находятся в одной сети, они могут разрешать друг друга по имени хоста, т. Е. Ваше клиентское приложение достигнет бэкэнда, например http://app:9000/api/login/, где вы используете имя службы docker-compose в качестве хоста.

Или это нормально, что они запускаются отдельно?

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

  1. Создать сеть Docker Bridge вручную . Вот документы для этого .Вам просто нужно определить сеть с помощью docker network create, , добавить эту сеть в ваш docker-compose и убедиться, что вы поместили свой интерфейсный контейнер в ту же сеть, когда вы docker run, используя--network вариант.Точно так же вы можете просто определить новую сеть в вашем docker-compose.yml, пропустить ее создание вручную и поместить свой контейнер внешнего интерфейса в эту сеть.

Любая из этих опций # 1 оказывается хрупкой, потому что вам нужно убедиться, что ваша сеть существует перед запуском фронтэнда или, возможно, стека docker-compose.В любом случае, это опция.

В режиме моста, который является сетевым режимом по умолчанию, ссылка на localhost в вашем контейнере не ссылается на ваш хост.Например, curl localhost:9000 из вашего внешнего интерфейса будет пытаться свернуть контейнер внешнего интерфейса на порту 9000. curl localhost:9000 из службы приложений должно завершиться успешно, потому что оно само сворачивается.

Используйте сетевой драйвер хоста , , который поместит ваши контейнеры в вашу хост-сеть, удалив сетевую изоляцию Docker .Тогда все будет просто использовать localhost:<port>, чтобы общаться друг с другом.

Если у вас нет веских оснований не пускать интерфейс в docker-compose.yml, я бы посоветовал вампросто добавьте его туда и все будет готово.Делая это, выгрузите много мыслей, чтобы составить докер.Он также будет лучше масштабироваться, если вы используете конвейер CI, и его будет легче передать другому разработчику, поскольку все это в аккуратной упаковке.Удачи!

0 голосов
/ 08 июня 2018

Это нормально, чтобы они работали отдельно.

Вам необходимо подключить их, поместив и интерфейс, и серверную часть в одну и ту же сеть докеров (вам не нужно помещать в эту сеть db).

Просто создайте отдельную сеть вручную и затем укажите ее в docker-compose как external - то же самое для внутреннего и внешнего интерфейса.Затем вы сможете использовать имена сервисов, чтобы заставить интерфейс взаимодействовать с бэкендом.

frontend-docker-compose.yml:

services:
  frontend:
    networks:
      project_network:
networks:
  project_network:
    external: true

backend-docker-compose.yml:

services:
  app:
    networks:
      project_network:
networks:
  project_network:
    external: true

docker network create --attachable project_network

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...