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

vagrant docker


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

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





Answer 1 creack


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

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

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

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




Answer 2 Mitchell


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

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

Неправильно напрямую сравнивать бродягу с Докером.В некоторых сценариях они пересекаются,а в подавляющем большинстве нет.На самом деле,тем более правильным было бы сравнение Vagrant с чем-то вроде Boot2Docker (минимальная операционная система,которая может работать под управлением Docker).Vagrant-это уровень выше 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! Vagrant не живет в таких средах,поэтому следует использовать Docker.

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

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

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

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

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

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

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

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

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

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

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

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

Надеюсь,это все прояснит!




Answer 3 Solomon Hykes


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

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

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

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

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

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

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

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

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




Answer 4 Chris Bushell


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

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

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

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

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




Answer 5 Mark Stratmann


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

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

В Vagrant вы можете полностью отказаться от любой самостоятельной настройки Chef,и все,что вам нужно-это подготовить машину,на которой запущен один маленький скрипт командной оболочки,устанавливающий docker.Это означает,что мои файлы 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,который выглядит примерно так.

#!/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.

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

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

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

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