Должен ли я использовать Vagrant или Docker для создания изолированной среды?

Я использую Ubuntu для разработки и развертывания и нуждаюсь в создании изолированной среды.

Я рассматриваю либо Бродягу, либо Докер для этой цели. Каковы плюсы и минусы, или как эти решения сравниваются?

Ответ 1

Если ваша цель - изоляция, я думаю, что Docker - это то, что вы хотите.

Вагрант - менеджер виртуальной машины. Он позволяет script настройку виртуальной машины, а также настройку. Тем не менее, он по-прежнему является виртуальной машиной в зависимости от VirtualBox (или других) с огромными накладными расходами. Это требует, чтобы у вас был жесткий диск, который может быть огромным, он занимает много бара, а производительность может быть не очень хорошей.

Docker, с другой стороны, использует группу cgroup и namespacing через LXC. Это означает, что вы используете то же ядро, что и хост и одна и та же файловая система. Вы можете использовать Dockerfile с помощью команды docker build, чтобы обрабатывать подготовку и настройку вашего контейнера. У вас есть пример в docs.docker.com о том, как сделать свой Dockerfile; это очень интуитивно понятно.

Единственная причина, по которой вы можете использовать Vagrant, - это то, что вам нужно сделать BSD, Windows или другую разработку, отличную от Linux, в вашем поле Ubuntu. В противном случае перейдите к Docker.

Ответ 2

Отказ от ответственности: я написал Vagrant! Но поскольку я написал Vagrant, большую часть своего времени я провожу в мире DevOps, который включает в себя программное обеспечение, такое как Docker. Я работаю с большим количеством компаний, использующих Vagrant, и многие используют Docker, и я вижу, как эти два взаимодействия.

Прежде чем говорить слишком много, прямой ответ: в вашем конкретном сценарии (самостоятельно работая, работая в Linux, используя Docker в процессе производства), вы можете придерживаться только Docker и упрощать вещи. Во многих других сценариях (я обсуждаю далее), это не так просто.

Неправильно напрямую сравнивать Vagrant с Docker. В некоторых сценариях они накладываются друг на друга, и в подавляющем большинстве они этого не делают. Фактически, более подходящим сравнением будет Vagrant по сравнению с чем-то вроде Boot2Docker (минимальная ОС, которая может запускать Docker). Бродяга - это уровень выше Докера с точки зрения абстракций, поэтому в большинстве случаев это не справедливое сравнение.

Vagrant запускает приложения для запуска приложений/сервисов с целью разработки. Это может быть на VirtualBox, VMware. Он может быть удален как AWS, OpenStack. Внутри них, если вы используете контейнеры, Vagrant не заботится и обнимает это: он может автоматически устанавливать, вытаскивать, строить и запускать контейнеры Docker, например. С Vagrant 1.6 Vagrant имеет среду разработки на основе докеров и поддерживает использование Docker с тем же рабочим процессом, что и Vagrant, в Linux, Mac и Windows. Вагрант не пытается заменить Докера здесь, он охватывает практики Докера.

Docker специально запускает контейнеры Docker. Если вы сравниваете напрямую с Vagrant: это более конкретный (может работать только контейнер Docker), менее гибкий (требуется где-то Linux или Linux-хост). Конечно, если вы говорите о производстве или CI, нет никакого сравнения с Vagrant! Бродяга не живет в этих условиях, поэтому Docker следует использовать.

Если ваша организация запускает только контейнеры Docker для всех своих проектов и только разработчики работают на Linux, тогда все в порядке, Docker может определенно работать на вас!

В противном случае я не вижу преимущества в попытке использовать только Docker, поскольку вы теряете много того, что может предложить Vagrant, которые имеют реальные преимущества для бизнеса/производительности:

  • Vagrant может запускать машины VirtualBox, VMware, AWS, OpenStack и т.д. Неважно, что вам нужно, Бродяга может запустить его. Если вы используете Docker, Vagrant может установить Docker на любом из них, чтобы вы могли использовать их для этой цели.

  • Vagrant - это единый рабочий процесс для всех ваших проектов. Или, по-другому, люди должны научиться запускать проект, будь то в контейнере Docker или нет. Если, например, в будущем, конкурент должен конкурировать непосредственно с Docker, Vagrant также сможет запустить это.

  • Бродяга работает на Windows (обратно в XP), Mac (обратно до 10.5) и Linux (обратно в ядро ​​2.6). Во всех трех случаях рабочий процесс одинаков. Если вы используете Docker, Vagrant может запустить машину (VM или remote), которая может запускать Docker во всех трех этих системах.

  • Вагрант знает, как настроить некоторые продвинутые или нетривиальные вещи, такие как создание сетей и синхронизация папок. Например: Вагрант знает, как подключить статический IP-адрес к машинным или пересылаемым портам, и конфигурация одинакова независимо от того, какую систему вы используете (VirtualBox, VMware и т.д.). Для синхронизированных папок Vagrant предоставляет несколько механизмов для получения вашего локального файлы на удаленный компьютер (общие папки VirtualBox, NFS, rsync, Samba [плагин] и т.д.). Если вы используете Docker, даже Docker с виртуальной машиной без бродяг, вам придется вручную это сделать, иначе в этом случае придется изобретать Vagrant.

  • Vagrant 1.6 имеет первоклассную поддержку док-серверных сред разработки. Это не приведет к запуску виртуальной машины в Linux и автоматически запустит виртуальную машину на Mac и Windows. Конечным результатом является то, что работа с Docker одинакова на всех платформах, а Vagrant по-прежнему обрабатывает утомительные детали таких вещей, как создание сетей, синхронизированные папки и т.д.

Чтобы обратиться к конкретным аргументам счетчика, которые я слышал в пользу использования Docker вместо Vagrant:

  • "Это менее подвижные части". Да, это может быть, если вы используете Docker исключительно для каждого проекта. Даже тогда это приносит в жертву гибкость для блокировки Docker. Если вы когда-либо решили не использовать Docker для любого проекта, прошлого, настоящего или будущего, тогда у вас будет больше движущихся частей. Если вы использовали Vagrant, у вас есть одна движущаяся часть, которая поддерживает остальных.

  • "Это быстрее!" - После того, как у вас есть хост, который может запускать контейнеры Linux, Docker определенно быстрее работает с контейнером, чем будет запускаться любая виртуальная машина. Но запуск виртуальной машины (или удаленной машины) - это разовая стоимость. В течение дня большинство пользователей Vagrant никогда не уничтожают виртуальную машину. Это странная оптимизация для сред разработки. В производстве, где Docker действительно сияет, я понимаю необходимость быстрого разворачивания вверх/вниз контейнеров.

Надеюсь, теперь ясно, что это очень сложно, и я считаю неверным сравнивать Docker с Vagrant. Для срединных сред бродяга более абстрактная, более общая. Докер (и различные способы, которыми вы можете заставить его вести себя как бродяга) - это конкретный случай использования Vagrant, игнорируя все, что может предложить Vagrant.

В заключение: в особо конкретных случаях использования Docker, безусловно, является возможной заменой Vagrant. В большинстве случаев использования это не так. Vagrant не мешает вам использовать Docker; он действительно делает то, что может сделать этот процесс более плавным. Если вы обнаружите, что это неверно, я рад принять предложения по улучшению ситуации, поскольку цель Vagrant - работать одинаково хорошо с любой системой.

Надеюсь, что это очистит все!

Ответ 3

Я автор Докера.

Короткий ответ: если вы хотите управлять машинами, вы должны использовать Vagrant. И если вы хотите создавать и запускать среды приложений, вы должны использовать Docker.

Vagrant - это инструмент для управления виртуальными машинами. Docker - это инструмент для создания и развертывания приложений путем их упаковки в легкие контейнеры. Контейнер может содержать практически любой программный компонент вместе с его зависимостями (исполняемые файлы, библиотеки, файлы конфигурации и т.д.) И выполнять его в гарантированной и повторяемой среде выполнения. Это упрощает сборку приложения и развертывание в любом месте - на вашем ноутбуке для тестирования, а затем на разных серверах для активного развертывания и т.д.

Это распространенное заблуждение, что вы можете использовать Docker только в Linux. Это неверно; вы также можете установить Docker на Mac, а поддержка Windows уже ведется. При установке на Mac Docker объединяет крошечную Linux VM (25 Мб на диске!), Которая действует как оболочка для вашего контейнера. После установки это полностью прозрачно; вы можете использовать командную строку Docker точно так же. Это дает вам лучшее из обоих миров: вы можете тестировать и разрабатывать свое приложение с помощью контейнеров, которые очень легки, легко проверяются и легко перемещаются (см., Например, https://index.docker.io для обмена контейнерами многократного использования с сообществом Docker), и вам не нужно беспокоиться о подробных подробностях управления виртуальными машинами, которые в любом случае являются средством для завершения.

В теории можно использовать Vagrant как слой абстракции для Docker. Я рекомендую против этого по двум причинам:

  • Во-первых, бродяга не является хорошей абстракцией для Докера. Vagrant был разработан для управления виртуальными машинами. Docker был разработан для управления временем выполнения приложений. Это означает, что Docker по своему дизайну может взаимодействовать с приложением более богатыми способами и имеет больше информации о времени выполнения приложения. Примитивами в Docker являются процессы, потоки журналов, переменные среды и сетевые связи между компонентами. Примитивами в Vagrant являются машины, блокирующие устройства и ключи ssh. Бродяга просто сидит ниже в стеке, и единственный способ, которым он может взаимодействовать с контейнером, заключается в том, что он делает вид, что это просто другой тип машины, который вы можете "загружать" и "входить в систему". Итак, конечно, вы можете ввести "бродячий вверх" с плагином Docker и что-то красивое произойдет. Является ли это заменой полной ширины того, что может сделать Докер? Попробуйте родной Docker на пару дней и убедитесь сами:)

  • Во-вторых, аргумент блокировки. "Если вы используете Vagrant как абстракцию, вы не будете заперты в Докер!". С точки зрения Vagrant, который предназначен для управления машинами, это имеет смысл: не являются ли контейнеры только другим видом машины? Так же, как Amazon EC2 и VMware, мы должны быть осторожны, чтобы не привязывать наши инструменты обеспечения к любому конкретному поставщику! Это создаст блокировку - лучше всего отбросить все это с помощью Vagrant. Кроме того, это полностью не соответствует точке Докера. Докер не предоставляет машины; он обертывает ваше приложение в легком переносном времени выполнения, которое можно отбросить в любом месте.

Какое время исполнения, которое вы выбираете для своего приложения, не имеет никакого отношения к тому, как вы предоставляете свои машины! Например, довольно часто развертывать приложения на машинах, которые предоставляются кем-то другим (например, экземпляр EC2, развернутый вашим системным администратором, возможно, с использованием Vagrant), или на голые металлические машины, которые Vagrant не может обеспечить вообще. И наоборот, вы можете использовать Vagrant для предоставления машин, которые не имеют никакого отношения к разработке вашего приложения - например, готового к использованию окна IIS для Windows или чего-то еще. Или вы можете использовать Vagrant для предоставления машин для проектов, которые не используют Docker - возможно, они используют комбинацию rubygems и rvm для управления зависимостями и песочницей, например.

Вкратце: Vagrant предназначен для управления машинами, а Docker предназначен для создания и запуска приложений.

Ответ 4

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

У меня есть приличный опыт работы с Vagrant и могу очень рекомендовать его. Это, безусловно, более тяжелое решение с точки зрения того, что он основан на виртуальной машине вместо LXC. Тем не менее, я нашел приличный ноутбук (операционная система с 8-ми ядерными процессорами, i5/i7) без проблем с использованием виртуальной машины с использованием Vagrant/VirtualBox наряду с инструментами разработки.

Одна из действительно замечательных вещей с Vagrant - интеграция с Puppet/Chef/сценарии оболочки для автоматизации конфигурации. Если вы используете один из этих параметров для настройки рабочей среды, вы можете создать среду разработки, которая будет близка к идентичной, как вы собираетесь получить, и это именно то, что вы хотите.

Другим замечательным моментом с Vagrant является то, что вы можете обновить свой Vagrantfile вместе со своим кодом приложения. Это означает, что все остальные члены вашей команды могут поделиться этим файлом, и вам гарантировано, что все работают с той же конфигурацией среды.

Интересно, что бродяга и докер действительно могут быть бесплатными. Vagrant может быть расширен для поддержки различных поставщиков виртуализации, и возможно, что Docker является одним из таких поставщиков, который получит поддержку в ближайшем будущем. См. https://github.com/dotcloud/docker/issues/404 для недавнего обсуждения темы.

Ответ 5

Vagrant-lxc является плагином для Vagrant, который позволяет использовать LXC для предоставления Vagrant. Он не имеет всех функций, которые имеет виртуальная виртуальная машина (VirtualBox) по умолчанию, но это должно позволить вам больше гибкости, чем контейнеры докеров. В ссылке есть видео, показывающее его возможности, которые стоит посмотреть.

Ответ 6

Они очень много дополняют друг друга.

Я использую комбинацию VirtualBox, Vagrant и Docker для всех своих проектов в течение нескольких месяцев и сильно ощущаю следующие преимущества.

В Vagrant вы можете полностью избавиться от любого сольного обеспечения шеф-повара, и все, что вам нужно, - это подготовить машину, на которой установлена ​​небольшая оболочка script, которая устанавливает докер. Это означает, что мои Vagrantfiles для каждого проекта почти идентичны и очень просты.

Вот типичный Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "mark2"
  config.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box"
  [3000, 5000, 2345, 15672, 5672, 15674, 27017, 28017, 9200, 9300, 11211, 55674, 61614, 55672, 5671, 61613].each do |p|
    config.vm.network :forwarded_port, guest: p, host: p
  end
  config.vm.network :private_network, ip: "192.168.56.20"
  config.vm.synced_folder ".", "/vagrant", :type => "nfs"
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048"]
    vb.customize ["modifyvm", :id, "--cpus", "2"]
  end
  # Bootstrap to Docker
  config.vm.provision :shell, path: "script/vagrant/bootstrap", :privileged => true
  # Build docker containers
  config.vm.provision :shell, path: "script/vagrant/docker_build", :privileged => true
  # Start containers
  # config.vm.provision :shell, path: "script/vagrant/docker_start", :privileged => true
end

Файл Bootstrap, устанавливающий докер, выглядит следующим образом:

#!/usr/bin/env bash
echo 'vagrant  ALL= (ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers
apt-get update -y
apt-get install htop -y
apt-get install linux-image-extra-`uname -r` -y
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list
apt-get update -y
apt-get install lxc-docker -y
apt-get install curl -y

Теперь, чтобы получить все службы, которые мне нужны, у меня есть docker_start script, который выглядит примерно так:

#!/bin/bash
cd /vagrant
echo Starting required service containers
export HOST_NAME=192.168.56.20
# Start MongoDB
docker run --name=mongodb --detach=true --publish=27017:27017 --publish=28017:28017 dockerfile/mongodb
read -t5 -n1 -r -p "Waiting for mongodb to start..." key
# Start rabbitmq
docker run --name=rabbitmq --detach=true --publish=5671:5671 --publish=5672:5672 --publish=55672:55672 --publish=15672:15672 --publish=15674:15674 --publish=61613:61613 --env RABBITMQ_USER=guest --env RABBITMQ_PASS=guest rabbitmq
read -t5 -n1 -r -p "Waiting for rabbitmq to start..." key
# Start cache
docker run --name=memcached --detach=true --publish=11211:11211  ehazlett/memcached
read -t5 -n1 -r -p "Waiting for cache to start..." key
# Start elasticsearch
docker run --name=elasticsearch --detach=true --publish=9200:9200 --publish=9300:9300 dockerfile/elasticsearch
read -t5 -n1 -r -p "Waiting for elasticsearch to start..." key
echo "All services started"

В этом примере я запускаю MongoDB, Elastisearch, RabbitMQ и Memcached

Соло-конфигурация не-докеров-шефов будет значительно сложнее.

Окончательный большой плюс достигается, когда вы переходите в производство, переводя среду разработки в инфраструктуру хостов, которые все те же, что и у них достаточно конфигурации для запуска докеров, очень мало работают.

Если вам интересно, у меня есть более подробная статья о среде разработки на моем собственном веб-сайте в

Внедрение среды разработки бродяг/докеров

Ответ 7

Теперь с помощью Vagrant вы можете использовать Docker в качестве провайдера. http://docs.vagrantup.com/v2/docker/. Поставщик Docker может использоваться вместо VirtualBox или VMware.

Обратите внимание, что вы также можете использовать Docker для предоставления Vagrant. Это очень отличается от использования Docker в качестве поставщика. http://docs.vagrantup.com/v2/provisioning/docker.html

Это означает, что вы можете заменить Chef или Puppet с Docker. Вы можете использовать комбинации, такие как Docker, как поставщик (VM), с шеф-поваром в качестве средства обеспечения. Или вы можете использовать VirtualBox в качестве поставщика и Docker в качестве средства обеспечения.

Ответ 8

Использование обоих компонентов является важной частью тестирования доставки приложений. Я только начинаю заниматься Docker и очень много думаю о команде приложений, которая имеет ужасную сложность в создании и предоставлении своего программного обеспечения. Подумайте о классическом проекте Phoenix Project/Continuous Delivery.

Мысль выглядит примерно так:

  • Возьмите компонент приложения Java/Go и создайте его как контейнер (обратите внимание: не уверен, что приложение должно быть построено в контейнере или построено тогда установленный в контейнер)
  • Доставьте контейнер к Vagrant VM.
  • Повторите это для всех компонентов приложения.
  • Итерации на компоненте (-ах) для кода.
  • Непрерывно проверяйте механизм доставки на виртуальные машины, управляемые Vagrant.
  • Хорошо зная, когда пришло время развертывать контейнер, тестирование интеграции происходило на гораздо более постоянной основе, чем до Docker.

Это, по-видимому, логическое продолжение утверждения Митчелла о том, что Vagrant предназначен для развития в сочетании с мышлением Farley/Humbles в Continuous Delivery. Если я, как разработчик, смогу сократить цикл обратной связи для тестирования интеграции и доставки приложений, последуют более высокое качество и улучшенные рабочие среды.

Тот факт, что как разработчик я постоянно и последовательно доставляю контейнеры в виртуальную машину и более целостно тестирую приложение, означает, что продление выпуска будет еще более упрощено.

Итак, я вижу, как Vagrant развивается как способ использовать некоторые из удивительных последствий, которые Docker будет использовать для развертывания приложений.

Ответ 9

В реальном журнале Oracle Java есть действительно информативная статья об использовании Docker в сочетании с Vagrant (и Puppet):

Заключение

Докеры облегченные контейнеры быстрее по сравнению с классическими виртуальными машинами и стали популярными среди разработчиков и как часть CD и DevOps инициативы. Если ваша цель - изоляция, Docker - отличный выбор. Vagrant - это менеджер виртуальной машины, который позволяет вам конфигурировать scriptотдельные виртуальные машины, а также выполнять подготовку. Однако, это VM зависит от VirtualBox (или другого диспетчера VM) с относительно большие накладные расходы. Это требует, чтобы у вас был жесткий диск на холостом ходу, который может быть Огромный, он занимает много оперативной памяти, а производительность может быть неоптимальной. докер использует ядро ​​cgroups и пространство имен через LXC. Это значит, что вы используете то же ядро, что и хост и одна и та же система. Бродяга - уровень выше Докера с точки зрения абстракции, поэтому они не совсем сопоставимы. Инструменты управления конфигурацией, такие как Puppet, широко используется для обеспечения целевых сред. Повторное использование существующих Докеры легко разрешают решения на основе кукол. Вы также можете нарезать решение, поэтому инфраструктура снабжена Puppet; промежуточное программное обеспечение, сам бизнес-приложение или оба с Докером; и Докер завернут Вагрантом. С этим диапазоном инструменты, вы можете сделать все, что лучше для вашего сценария.

Как создавать, использовать и организовывать контейнеры докеров в DevOps http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0

Ответ 10

Определенно Docker для победы!

Как вы знаете, Vagrant предназначен для управления виртуальными машинами, тогда как Docker предназначен для управления контейнерами программного обеспечения. Если вы не знаете разницы, вот что: Контейнер программного обеспечения может совместно использовать один и тот же компьютер и ядро ​​с другими программными контейнерами. Используя контейнеры, вы сэкономите деньги, потому что вам не нужно тратить меньше ресурсов на несколько операционных систем, вы можете упаковать больше программного обеспечения на один сервер, сохраняя высокую степень изоляции.

Конечно, это новая дисциплина, которая заботится о своих собственных ошибках и проблемах.

Пойдите для Docker Swarm, если ваши требования пересекают ограничение одиночных ресурсов машины.