В последнее время очень много шума вокруг виртуализации. Использованием виртуальны машин для разработки никого не удивишь — наличие изолированных сред позволяет существенно облегчить жизнь разработчику. Ну и как следствие появились соедства для автоматизации создания и управления виртуальными машинами. Давайте разберёмся в этом зоопарке технологий.
Лично я уже использовал для этих целей как VmWare так и VirtualBox. В последнее время перешёл на VirtualBox ввиду его бесплатности. Виртуальные машины использую для особо хитрых проектов с нестандартным или устаревшим набором софта, чтобы не засорять систему всяким вручную собранным мусором.
И в общем-то могу сказать, что да — это чертовски удобно. Если возникают какие-то задачи по проекту, не надо заботиться о том, что какая-то библиотечка в системе обновилась и проект уже не запускается. В виртуальной машине уже установлены нужные версии и ини никуда не денутся.
Но есть и некоторые минусы — хранить на каждый проект по образу довольно накладно, даже с учётом того, что дисковое пространство стоит недорого. В случае если давно не занимался каким-то проектом и допустим переместил его в другое место приходится заново настраивать папки права и т. п.
Так же есть определённые неудобства при создании нового образа. Тут либо ставить систему заново, либо клонировать существующий образ и настраивать дополнительно.
В общем я собственно веду к тому, что все это было бы неплохо автоматизировать. К нашему счастью такие средства есть.
Vagrant
Пожалуй наиболее известным проектом для управления изолированными средами для запуска приложений является Vagrant. Суть его в том, что на основе некоторого заранее подготовленного сценария можно легко собрать виртуальную машину и подключить к ней проект. При этом в принципе даже необязательно хранить образ, он при необходимости собирается заново.
В качестве систем виртуализации поддерживаются:
- VirtualBox
- VMware
- Hyper-V
- Amazon EC2
Готовые для загрузки образы можно посмотреть тут — [https://vagrantcloud.com/discover/featured]
Конфигурация задаётся в файле Vagrantfile
. В нём указывает базовый образ для загрузки, набор скриптов которые нужно выполнить после установки (установка дополнительного софта и т. п.), настройки сети. Собственно этого достаточно, чтобы собрать собственный клон системы для разработки с минимум усилий.
Docker
Сравнительно молодой продукт, обеспечивает примерно такие-же возможности как Vagrant, но реализовано это несколько иным путем. Вместо полной виртуализации как в Vagrant используется паравиртуализация, т. е. изолированная среда создаётся на том же хосте и не производится виртуализация оборудования.
Так же как и Vagrant который по сути является лишь удобной прослойкой использующей возможности сторонних систем виртуализации, docker основан на LXC — системе виртуализации представленной в linux.
Соответственно нет накладных расходов на запуск отдельной версии операционной системы и инициализацию оборудования — всё выполняется на том-же ядре что на котором работает хост система. Виртуализируется дисковое пространство, процессы, сеть.
Например если ваша операционная система Ubuntu вы можете создать docker контейнер для запуска CentOS, в котором будет отдельный образ файловой системы, на котором будут развёрнуты файлы CentOS. При запуске контейнера нет нужды запускать и инициализировать систему — используется ваше уже загруженное и работающее ядро. Соответственно запускаются в виртуализированном контейнере только то что, вы укажете явно — например БД или memcache или приложение Rails.
Отсюда проистекают неоспоримое достоинства docker — он реально быстр и работает с минимальным оверхедом. Запуск приложения внутри контейнера происходит практически так же быстро как и запуск обычного приложения в хост системе.
Это же является источником и основного недостатка — поддерживается запуск только linux контейнеров. В приципе можно запустить сам docker и под Windows в виртуальной машине, но опять в виртуальной машине должен быть запущен linux.
Конфигурация задаётся в файле Dockerfile
. Как и в случае с Vagrant файл содержит базовый образ для загрузки, набор скриптов которые нужно выполнить после установки, настройки сети и запускаемый файл.
Готовые образа для docker можно найти тут .
Интересной особенностью docker является то, что запущенаый контейнер не сохраняет изменения сделанные в нём. Т.е. если вы запустили контейнер, установили какой-то софт, а затем вышли из него то при повторном запуске вы получите снова чистую систему.
Для закрепления изменений их нужно создавать образ работающей системы. Для этого есть специальная команда docker push
. При этом создаётся новый образ (snapshoot).
В общем docker это отдельная большая тема.
Вывод
Итого для себя я сделал следующие выводы — если вы работает на linux или ваши продакшен сервера работат под linux — однозначно docker.
Едиснтвенный вариант когда Vagrant будет единственно возможным решением это неообходимость запуска операционных систем отличных от linux. Однако на сегодня такие варианты на мой взгляд достаточно редки — веб сервер на windows выглядит откровенным извращением, остаются варианты с BSD системами, но это скорее тоже экзотика.
Комментарии