Выполнение нескольких проектов с использованием докеров, каждый из которых выполняется с помощью докеры
Мы используем подход к микросервисам для создания нашего продукта. Мы используем некоторые проекты, которые каждый из них использует для запуска докеров. Проблема в том, что в среде разработки, если мы хотим изменить коды в нескольких проектах и протестировать разработанные коды, мы должны запускать проекты отдельно и связывать их вместе вручную.
Теперь мы хотим создать набор разработчика, который клонирует проекты и запускает их вместе и обрабатывает ссылки. Может ли 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.