Являются ли тома Docker специфичными для машины

Я новичок в Docker Swarm. Насколько я понимаю, Docker Swarm позволяет абстрагироваться от кластеризации. Означает, что вам все равно, на каком жестком контейнере развернут.

С другой стороны, стандартный способ работы с базой данных в Docker — это запись данных вне контейнера Docker (чтобы избежать копирования при записи). Это достигается путем монтирования тома и записи в него данных, связанных с базой данных. Важным моментом здесь является то, привязаны ли тома к конкретной машине? Достаточно ли умны Docker и Docker Swarm, чтобы смонтировать том на нужной машине?

Пример:

У меня есть 3 машины и 3 микросервиса/контейнера. Все они развернуты через Docker Swarm. К базе данных должен подключаться только один микросервис/контейнер. Поэтому мне нужно смонтировать Volume только на одной машине. Но на каком?


person VB_    schedule 13.11.2017    source источник


Ответы (1)


С базами данных и подобными приложениями с отслеживанием состояния по-прежнему сложно иметь дело, когда речь идет о Docker swarm и других средах оркестровки. В идеале контейнеры должны иметь возможность работать на любом узле в рое, но проблема возникает, когда вам нужно сохранять данные после жизненного цикла контейнера.

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

Был проект под названием Flocker, который решает вышеуказанную проблему (он больше не поддерживается). Существует также более новый проект под названием REXRAY.

Достаточно ли умны Docker и Docker Swarm, чтобы смонтировать том на нужной машине?

По умолчанию нет. Docker swarm выберет один из узлов и развернет на нем контейнер. Однако вы можете обойти эту проблему:

Во-первых, вам нужно определить именованный том в вашем Stackfile/Composefile под определением службы. Во-вторых, вам нужно использовать узел Ограничения размещения, чтобы ограничить, где находится контейнер базы данных. должен работать.

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

person yamenk    schedule 13.11.2017
comment
большое спасибо за отличный ответ! Если вы знаете ответ, не могли бы вы добавить подробности о том, как REXRAY добился независимого от узла поведения для баз данных с отслеживанием состояния? Почему то же самое поведение трудно реализовать с архитектурой Docker/Docker Swarm? Я полагаю, что если бы это было легко, Docker давно бы реализовал машинно-независимые тома. - person VB_; 13.11.2017
comment
как насчет высокой доступности с жестко запрограммированным/ограниченным контейнером для определенного узла? Есть ли обходные пути? - person VB_; 13.11.2017