(дописывается, отправлен по ошибке)
Не могу не отметиться в эпичном вопросе.
Что такое Vagrant и Docker?
В общем и целом, под Docker и Vagrant имеют в виду просто средства виртуализации с разной степенью этой виртуализации, Docker - как средство виртуализации на уровне ядра Linux (теперь не только Linux, но не берусь говорить, как обстоит дело на маке и окнах), Vagrant - как полную виртуализацию (затрудняюсь даже корректно охарактеризовать, что это такое, но если в первом случае все происходит внутри ядра Linux, то тут машина виртуализуется полностью, и ей предоставляются виртуальные оперативные память, процессор, и прочие устройства - ВМ думает, что общается с железом, которого на самом деле не существует).
На самом деле все несколько иначе: Docker и вправду предоставляет вышеописанную виртуализацию, а Vagrant является просто менеджером средств виртуализации, и вышеприведенный пассаж про "полную виртуализацию" на самом деле относится к VirtualBox, которым управляет Vagrant. У Vagrant есть понятие провайдера (поставщика средстсв виртуализации), и Vagrant умеет управлять как VirtualBox, так и Docker.
Зачем это нужно / что это позволяет сделать
Вы не указываете в своем вопросе, какие именно цели преследуете, поэтому придется написать, какие вообще проблемы это решает и какие проблемы принято решать тем или иным инструментом.
У виртуализации как таковой есть много приятных бонусов, в том числе:
- Простое и легкое ограничение процессов в ресурсах
- Изоляция ресурсов
- Возможность поставки не приложения как такового, а целиком готовое решение, которое нужно не установить и настроить, а просто запустить
- Косвенным образом - повторяемость процессов
Это очень хорошо с точки зрения инфраструктуры, потому что это позволяет перейти от модели сломалось -> починил к модели сломалось -> развернул заново, что гораздо проще автоматизируется и экономит тучу ресурсов.
С точки зрения разработки появляются два ключевых плюса, которые могут поменять парадигму разработки:
- Сборка приложения внутри виртуальной машины переворачивает ситуацию из "работает на моей машине" в "работает в этой виртуальной машине". Инженер, который должен развернуть приложение, получая его в образе виртуальной машины, знает, что для запуска нужно обеспечить только запуск самого образа, тратит процентов на девяносто меньше времени на разруливание ошибок запуска.
- Использование виртуальных машин позволяет разработчику полностью сымитировать инфраструктуру, в которой проект будет развернут, что опять же позволяет снизить издержки с известной проблемой "на моей машине все работает" и держать несколько версий ПО для разных проектов (если проект А использует PHP 5.3, а проект Б использует PHP 7.0, то вместо жонглирования версиями на рабочей машине разработчик может их держать в отдельных изолированных машинах).
В данном случае, конечно, интересует второй момент.
И Vagrant + VirtualBox, и Docker позволяют его реализовать, поэтому принципиальной разницы нет.
Есть ли разница
В комментариях к вопросу я занял позицию "криминальной разницы между ними нет", и намерен продолжать ее занимать.
Что Vagrant-поверх-VirtualBox, что Docker на самом деле предоставляют один и тот же функционал:
- Виртуальная машина с одним корневым процессом (строго говоря, так вообще все машины работают)
- Распространяемые образы этих виртуальных машин
- Возможность проброса портов виртуальной машины на хост
- Возможность монтирования директорий хоста внутрь виртуальной машины
- Возможность организации внутренней сети виртуальных машин
- Возможность запуска/остановки композиции виртуальных машин
- Возможность сохранения, выгрузки и загрузки снэпшота виртуальной машины
- Ограничение виртуальной машины по ресурсам
Поэтому на самом деле никакой функциональной разницы, на чем вы будете строить свою инфраструктуру, нет: вы можете ровно так же перевести vagrant на философию "один процесс на машину" или запихнуть все на свете в один docker-container. Однако, у Docker есть ряд преимуществ, не влияющих на сам функционал виртуализации, которые просто делают его использование более удобным и экономным (и которые сформировали его философию):
- Отсутствие расходов на полноценную виртуализацию
- COW-система слоев, которая позволяет экономить место при использовании нескольких машин с общим предком
- Практически мгновенный запуск за счет того, что не нужно инициализировать систему (загружать ядро, монтировать диски и весь тот невероятный парк операций, который происходит при включении машины), и контейнеру остается только запустить бинарник, указанный для него точкой входа.
- 36.3k
- 2
- 60
- 83