Skip to main content
Stack Overflow на русском

Вернуться к просмотру редакций

1 из 3
etki
  • 36.3k
  • 2
  • 60
  • 83

(дописывается, отправлен по ошибке)

Не могу не отметиться в эпичном вопросе.

Что такое 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-система слоев, которая позволяет экономить место при использовании нескольких машин с общим предком
  • Практически мгновенный запуск за счет того, что не нужно инициализировать систему (загружать ядро, монтировать диски и весь тот невероятный парк операций, который происходит при включении машины), и контейнеру остается только запустить бинарник, указанный для него точкой входа.
etki
  • 36.3k
  • 2
  • 60
  • 83
default

AltStyle によって変換されたページ (->オリジナル) /