В связи с последними релизами в мире Docker произошли некоторые изменения. В версии 1.12 в Docker Engine был интегрирован режим Swarm, в связи с чем появилось несколько новых инструментов. Среди прочего, теперь появилась возможность использовать Compose-файлы docker-compose.yml для создания стеков контейнеров Docker без необходимости устанавливать инструмент Docker Compose.
Теперь для этого есть команда docker stack, и она очень похожа на docker-compose
. Сравните:
$ docker-compose -f docker-compose up
$ docker stack deploy -c docker-compose.yml somestackname
Обе команды создают все сервисы, тома, сети и все остальное, что определено в файлах docker-compose.yml
. Почему получилось так, что возникли два очень похожих инструмента, которые выполняют одну задачу? Отличается ли docker stack
от docker-compose
? Зачем создали docker stack
? Что следует учитывать, кроме синтаксиса?
Отличия
Docker-compose
– приложение, реализованное на языке Python
. Изначально существовал проект под названием fig
, который использовался, чтобы анализировать файлы fig.yml
для создания стеков контейнеров Docker. Проект был довольно популярным, особенно среди тех, кто работает с Docker, поэтому команда Docker решила создать свою собственную версию, основанную на fig
. Они назвали свою новую разработку Docker Compose. Она также создана на Python и работает на базе Docker Engine. Внутри Docker Compose используется Docker API для создания контейнеров в соответствии со спецификацией. Чтобы использовать docker-compose
с Docker на вашей машине, вам придется установить его отдельно.
Функциональность docker stack
реализована внутри Docker, поэтому для его использования не нужно устанавливать дополнительные пакеты. Развертывание стеков контейнеров является частью режима swarm. Docker Stack поддерживает те же файлы compose, но их обработка производится внутри ядра Docker. Прежде, чем использовать команду stack, необходимо создать “рой” из одной машины, но это не является проблемой.
Есть некоторые различия между Docker Compose и Docker Stack:
Сборка образов. Docker stack игнорирует инструкции build
. Вы не сможете собрать новые образы, используя команду stack. Для нее необходимо наличие предварительно собранных образов. Поэтому в случае использования в разработке больше подходит docker-compose
.
Спецификация. Также, есть части спецификации файла compose, которые игнорируются командой docker-compose
или командой docker stack
. Например, docker-compose
игнорирует свойство deploy
, а docker stack
игнорирует depends_on
. Есть и другие примеры.
Версии. Docker stack
не поддерживает файлы docker-compose.yml
, оформленные согласно спецификации версии 2. Версия должна быть последней, на момент написания данной статьи это была версия 3. А docker-compose
может без проблем работать с версиями 2 и 3.
Заключение
Обе команды – и docker-compose
, и сравнительно новая команда docker stack
– могут использоваться с файлами docker-compose.yml
, написанными в соответствии со спецификацией версии 3. Для проектов, работающих с версией 2, можно использовать docker-compose
или обновить файл для соответствия новой версии.
Так как docker stack
делает все то же, что и docker-compose
, но является более прогрессивной утилитой, вероятно, что docker stack
более предпочтителен для новых проектов. Вероятно, когда-нибудь docker-compose
устареет и больше не будет поддерживаться.
Перевести рабочий процесс на docker stack
несложно. Это легко можно сделать при обновлении файлов docker compose с версии 2 на версию 3.
Если вы только начали работать с Docker, или находитесь на этапе выбора технологии для нового проекта – без сомнений используйте docker stack
.
Если статья вам понравилась и была для вас полезной, поделитесь ей с друзьями.