Блог экспериментатора инженера-разработчика: Infanty.
Я пишу how-to статьи на редкие темы или статьи обзоры - для себя и тех кто со мной работает.
Блог существует при поддержке: "Оккупационных сил Марса".

Периодически приходится создавать виртуальные машины для локальной разработки с функцией автоматического развёртывания для распространения в команде разработчиков. Для решения этой задачи ограничится только Bash-скриптами не получится. Так как довольно часто клиентские машины для разработки довольно сильно отличаются, как программно так и аппаратно, друг от друга и от серверов на которых будет размешаться разрабатываемый код. В таком случае лучшим решением будет использование VirtualBox (используя Vagrant с Puppet или Ansible) или Docker как одни из самых распространённых технологий для подобных задач.

Для решения подобной задачи можно использовать Xen (а так же решения от Parallels или VMware) или LXD, но зачем игнорировать уже имеющиеся инструменты автоматизации и конструировать свои.

С Docker всё просто и сложно одновременно. Docker позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, что в ряде случаев не подходит. Основные проблемы связаны с возможностью расширения программного обеспечения контейнера конечным пользователем. Конечному пользователю в ряде случаев проще зайти по ssh в виртуальную машину в VirtualBox и выполнить ряд необходимых команд для установки требующегося дополнительного программного обеспечения.

Docker решение более производительное и простое, чем использование VirtualBox. Для автоматизации развёртывания виртуальных машин у конечных пользователей - достаточно зайти на PHPDocker, сгенерировать docker-compose файл, дополнить его при необходимости и распространить полученный архив среди конечных пользователей.

Конечные пользователи устанавливают локально Docker, распаковывают полученный архив, переходят в него и запускают в консоли команду:

 docker-compose up 

И Docker автоматически развернёт и запустит окружение, после чего конечный пользователь может начать локальную разработку.

При изменении docker-compose файла, при запуске Docker окружения, следует добавлять к команде --build для перестройки контейнеров, если они уже есть на хосте.