Контейнерная обработка Docker просто добавляет различные уровни изоляции вокруг обычных процессов пользовательского пространства.Сам по себе он не вводит координацию между несколькими процессами, хотя, безусловно, его можно использовать при построении многопроцессорной системы, в которой каждый процесс выполняет некоторые задания, независимо от того, являются ли эти задания избыточными или дополняющими.
Если вы можетеспроектируйте свое решение таким образом, чтобы для каждой «платформы» запускался один процесс (например, передавая конкретную платформу, которую экземпляр должен обрабатывать в качестве параметра командной строки), тогда действительно, это технически можно сделать в Docker.
Однако я должен указать, что не ясно, почему вы хотите запускать каждый процесс в отдельном контейнере.Уместна ли изоляция по соображениям безопасности?Для учета ресурсов?Чтобы каждый процесс был отправлен на отдельный хост, чтобы иметь доступ к большей вычислительной мощности?Кроме того, требуется ли координация между этими процессами, помимо необходимости изначально определять, какой процесс обрабатывает какую платформу?Если это так, нужно ли им иметь доступ к общему хранилищу или иметь возможность отправлять сигналы друг другу?Эти вопросы помогут вам решить, как приблизиться к докеризации вашего решения.
В самом простом случае, если предположить, что все, что вам нужно, это изолировать весь процесс от остальной системы, но безТребование, чтобы эти процессы были изолированы друг от друга, тогда самой простой стратегией будет просто иметь один контейнер, содержащий сценарий оболочки точки входа, который будет просто запускать один процесс на платформу.
entrypoint.sh (inside your docker image):
#!/bin/bash
platforms=Bitfinex Bittrex
for platform in ${platforms} ; do
./myprogram "${platform}" &
done
Если вы действительнодля каждой платформы нужен отдельный контейнер, тогда вы бы использовали аналогичный сценарий, но на этот раз он будет запускаться непосредственно на хост-машине (то есть вне контейнера) и инкапсулировать каждый процесс внутри контейнера докера.
launch.sh (directly on the host):
#!/bin/bash
for platform in ${platforms} ; do
docker -name "program_${platform}" my_program_docker \
/usr/local/bin/myprogram "$platform"
done
В качестве альтернативы, вы можете использовать docker-compose
, чтобы определить список контейнеров докеров, которые должны быть запущены, но я не буду больше обсуждать эту опцию в настоящее время (просто спросите, кажется ли это уместным для вас).
Если вам нужно распределить контейнерысреди нескольких хост-машин можно использовать тот же цикл, но на этот раз процессы будут запускаться с использованием docker-machine
.В качестве альтернативы, если используется docker-compose
, процессы могут распространяться с использованием Swarm.