Docker контейнеры вместо многопроцессорной обработки - PullRequest
0 голосов
/ 29 сентября 2018

Одним из основных применений контейнеров Docker является балансировка нагрузки.Например, в случае веб-приложения вместо того, чтобы только один экземпляр обрабатывал все запросы, у нас есть много контейнеров, выполняющих одно и то же, но запросы делятся на все эти экземпляры.

Но можетбудет ли он использоваться для одного и того же сервиса, но с разными «параметрами»?

Например, предположим, я хочу создать платформу для хранения данных криптовалюты с разных платформ обмена (Bitfinex, Bittrex и т. д.).

Многие из этих платформ работают с веб-сокетами.Поэтому, чтобы создать один сокет для каждой платформы, я хотел бы сделать что-то на «уровне кода», например (независимость от языка):

foreach (platform in platforms)
    client = createClient(platform)
    socket = client.createSocket()
    socket.GetData()

Теперь, конечно, этот цикл будет зависать на первой итерации, потому чтовеб-сокет ждет (хотя я мог бы использовать асинхронность, в любом случае).Чтобы обойти это, я мог бы использовать многопроцессорность, что-то вроде:

foreach (platform in platforms)
    client = createClient(platform)
    socket = client.createSocket()
    process = new ProcessWhichGetData(socket)
    process.Launch()

Есть ли способ сделать это на «уровне Docker», я имею в виду использовать Docker, чтобы разные контейнеры обрабатывали разные платформы?У меня был бы один Docker-контейнер для Bittrex, один Docker-контейнер для Bitfinex и т. Д.

Я знаю, что это означало бы, что либо разные контейнеры будут связываться между собой (кто заботится о Bitfinex? Кто заботится о Bittrex?) или контейнерный оркестратор (Docker Swarm / Kubernete) справится с этим «перераспределением».

Это то, что мы могли бы сделать, и, вдобавок ко всему, это то, что мы хотим?

Ответы [ 3 ]

0 голосов
/ 29 сентября 2018

Контейнерная обработка 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.

0 голосов
/ 29 сентября 2018

Вы можете объединить различные док-контейнеры в STACK, а также настроить сеть так, чтобы док-контейнеры могли оставаться изолированными от внешнего мира, но могли общаться друг с другом.

Подробнее здесь Docker Stack

0 голосов
/ 29 сентября 2018

Скажем, вы реструктурировали это как долгосрочную программу, которая обрабатывает только одну платформу за раз и контролирует, какой платформой она была, с помощью параметра командной строки или переменной среды.Вместо того, чтобы использовать цикл «Запустить все платформы» в коде, вы можете написать сценарий оболочки, подобный

#!/bin/sh
for platform in $(cat platforms.txt); do
  ./run_platform $platform &
done

. Эту настройку легко перенести в Docker.

Не стоит планироватьдинамически запускает контейнеры Docker.Это сложно настроить и имеет значительные последствия для безопасности (под этим я подразумеваю, что «ошибка в вашей панели запуска контейнера может легко вызвать корень вашего хоста»).

Если отдельные задачи обработки могут выполняться полностью независимо (возможно, онииспользовать общую базу данных для хранения данных), то вы в основном сделали.Вы можете заменить этот сценарий оболочки чем-то вроде YAML-файла Docker Compose, в котором перечислены все контейнеры;если вы хотите запустить это на нескольких хостах, вы можете использовать такие инструменты, как Ansible, Docker Swarm или Kubernetes, чтобы распределить контейнеры (с различными уровнями сложности инфраструктуры).

...