Выполнение нескольких проектов с использованием докеров, каждый из которых выполняется с помощью докеры

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

Теперь мы хотим создать набор разработчика, который клонирует проекты и запускает их вместе и обрабатывает ссылки. Может ли docker-compose обрабатывать файл с несколькими файлами-докере? Если нет, то у нас есть достаточный инструмент для этого? Или какой-либо рекомендуемый подход для нашей цели?

EDIT: Например, у нас есть два проекта: PROJECT_A и PROJECT_B. У каждого есть свой собственный docker-compose.yml, и каждый из них нуждается в postgresql для запуска. В PROJECT_A у нас есть docker-compose.yml:

db:
    image: postgres:9.4
    ports:
      - "5432"

project_a:
    build: .
    command: python2.7 main.py
    links:
        - db

И у нас есть docker-compose.yml в PROJECT_B, как это:

db:
    image: postgres:9.4
    ports:
      - "5432"

project_b:
    build: .
    command: python2.7 main.py
    links:
        - db

Каждый проект может работать отдельно и отлично работать. Но если мы хотим изменить api между PROJECT_A и PROJECT_B, нам нужно запустить оба проекта и связать их вместе, чтобы протестировать наш код. Теперь мы хотим написать проект комплекта разработки, который может запускать оба проекта и связывать их при необходимости. Каков наилучший способ сделать это?

Ответ 1

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

../
├── foo/
│   └── docker-compose.yml
└── bar/
    └── docker-compose.yml

Foo/докер-compose.yml:

base:
    build: .

foo:
    extends:
        service: base
    links:
        - db

db:
    image: postgres:9

Если бы вы хотели протестировать этот проект самостоятельно, вы бы сделали что-то вроде:

sudo docker-compose up -d foo

Создание foo_foo_1

бар/докер-compose.yml:

foo:
    extends:
        file: ../foo/docker-compose.yml
        service: base
    links:
        - db

bar:
    build: .
    extends:
        service: base
    links:
        - db
        - foo

db:
    image: postgres:9

Теперь вы можете протестировать оба сервиса вместе с:

sudo docker-compose up -d bar

Создание bar_foo_1
Создание bar_bar_1

Ответ 2

Не уверен на 100% на ваш вопрос, так что это будет широкий ответ.

1) Все может находиться в одном файле компоновки, если он работает на одном компьютере или кластере серверов.

#proxy
haproxy:
  image: haproxy:latest
  ports:
    - 80:80


#setup 1
ubuntu_1:
  image: ubuntu
  links:
    - db_1:mysql
  ports:
    - 80

db1:
  image: ubuntu
  environment:
    MYSQL_ROOT_PASSWORD: 123


#setup 2
ubuntu_2:
   image: ubuntu
   links:
     - db_2:mysql
   ports:
    - 80

db2:
  image: ubuntu
  environment:
    MYSQL_ROOT_PASSWORD: 123

Также возможно объединить несколько файлов yml, например, $docker-compose -f [File A].yml -f [File B].yml up -d

2) Каждый контейнер в сборке может быть контролироваться отдельно с компоновкой.
$docker-compose stop/start/build/ ubuntu_1

3) Используя $docker-compose build, он будет только перестраивать, где были сделаны изменения.

Вот более подробная информация, которая может быть полезной https://docs.docker.com/compose/extends/#extending-services

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

Ответ 3

Это наш подход для тех, кто имеет одну и ту же проблему:

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

python controller.py --run projectA projectB

Он запускает каждый проект, используя команду докере-компоновки. Затем, когда все проекты запущены и запущены, он начинает добавлять все остальные IP-проекты док-станции в другие проекты, добавляя их в /etc/hosts ips, используя следующие команды:

# getting contaier id of projectA and projectB
CIDA = commands.getoutput("docker-compose ps -q %s" % projectA)
CIDB = commands.getoutput("docker-compose ps -q %s" % projectB)
# getting ip of container projectA
IPA = commands.getoutput("docker inspect --format '{{ .NetworkSettings.IPAddress }}' %s" % CIDA)

Теперь для отправки запросов от projectB к projectA нам нужно только определить projectA IP как "projectA" в настройках ProjectB.