Я использую Ubuntu для разработки и развертывания и нуждаюсь в создании изолированной среды.
Я рассматриваю Vagrant или Docker для этой цели. Каковы плюсы и минусы или как эти решения сравниваются?
Я использую Ubuntu для разработки и развертывания и нуждаюсь в создании изолированной среды.
Я рассматриваю Vagrant или Docker для этой цели. Каковы плюсы и минусы или как эти решения сравниваются?
Ответы:
Если ваша цель - изоляция, я думаю, Докер - это то, что вы хотите.
Vagrant - менеджер виртуальных машин. Это позволяет вам создавать сценарии конфигурации виртуальной машины, а также инициализации. Тем не менее, это все еще виртуальная машина в зависимости от VirtualBox (или других) с огромными накладными расходами. Это требует, чтобы у вас был файл жесткого диска, который мог быть огромным, это требовало большого количества оперативной памяти, и производительность могла быть не очень хорошей.
Docker, с другой стороны, использует ядро cgroup и пространство имен через LXC . Это означает, что вы используете то же ядро, что и хост, и ту же файловую систему. Вы можете использовать Dockerfile с docker build
командой, чтобы управлять подготовкой и настройкой вашего контейнера. У вас есть пример на docs.docker.com о том, как сделать ваш Dockerfile; это очень интуитивно понятно.
Единственная причина, по которой вы можете захотеть использовать Vagrant, заключается в том, что вам нужно заняться разработкой BSD, Windows или другой не-Linux на вашем Ubuntu. В противном случае, перейдите на Docker.
Отказ от ответственности: я написал Vagrant! Но поскольку я написал Vagrant, я провожу большую часть своего времени в мире DevOps, который включает в себя программное обеспечение, такое как Docker. Я работаю со многими компаниями, использующими Vagrant, и многие используют Docker, и я вижу, как они взаимодействуют.
Прежде чем говорить слишком много, прямой ответ: в вашем конкретном сценарии (вы работаете один, работаете в Linux, используете Docker в работе), вы можете придерживаться только одного Docker и упростить вещи. Во многих других сценариях (я обсуждаю далее) это не так просто.
Неправильно сравнивать Vagrant с Docker. В некоторых сценариях они перекрываются, а в подавляющем большинстве - нет. На самом деле, более подходящим сравнением будет Vagrant и Boot2Docker (минимальная ОС, которая может запускать Docker). Vagrant на уровень выше Docker с точки зрения абстракций, поэтому в большинстве случаев это несправедливое сравнение.
Vagrant запускает приложения для запуска приложений / сервисов с целью разработки. Это может быть на VirtualBox, VMware. Он может быть удаленным, как AWS, OpenStack. Внутри них, если вы используете контейнеры, Vagrant не заботится об этом, и принимает это: он может, например, автоматически устанавливать, извлекать, собирать и запускать контейнеры Docker. В Vagrant 1.6 Vagrant имеет среды разработки на основе докеров и поддерживает использование Docker с тем же рабочим процессом, что и Vagrant, в Linux, Mac и Windows. Вагрант не пытается заменить Docker здесь, он охватывает практики Docker.
Docker специально запускает контейнеры Docker. Если вы сравниваете непосредственно с Vagrant: это, в частности, более конкретное (может только запускать Docker-контейнеры), менее гибкое (требует где-то Linux или Linux-хост) решение. Конечно, если вы говорите о производстве или CI, нет никакого сравнения с Vagrant! Vagrant не живет в этих средах, и поэтому следует использовать Docker.
Если ваша организация использует только контейнеры Docker для всех своих проектов и в ней работают только разработчики под Linux, то, конечно, Docker наверняка подойдет вам!
В противном случае, я не вижу пользы от попытки использовать Docker в одиночку, поскольку вы теряете многое из того, что может предложить Vagrant, что дает реальные преимущества для бизнеса / производительности:
Vagrant может запускать машины VirtualBox, VMware, AWS, OpenStack и др. Неважно, что вам нужно, Vagrant может запустить его. Если вы используете Docker, Vagrant может установить Docker на любой из них, чтобы вы могли использовать их для этой цели.
Vagrant - это единый рабочий процесс для всех ваших проектов. Или, другими словами, людям нужно научиться запускать проект независимо от того, находится он в контейнере Docker или нет. Например, если в будущем у вас появится конкурент, который будет напрямую конкурировать с Docker, Vagrant также сможет его запустить.
Vagrant работает в Windows (версия XP), Mac (версия 10.5) и Linux (версия 2.6). Во всех трех случаях рабочий процесс одинаков. Если вы используете Docker, Vagrant может запустить машину (виртуальную или удаленную), которая может запустить 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. Если вы когда-нибудь решите не использовать Docker для какого-либо проекта, прошлого, настоящего или будущего, у вас будет больше движущихся частей. Если вы использовали Vagrant, у вас есть одна движущаяся часть, которая поддерживает остальные.
"Это быстрее!" - Если у вас есть хост, на котором можно запускать контейнеры Linux, Docker определенно быстрее запускает контейнер, чем любая виртуальная машина для запуска. Но запуск виртуальной машины (или удаленной машины) стоит единовременно. В течение дня большинство пользователей Vagrant никогда не уничтожают свои виртуальные машины. Это странная оптимизация для сред разработки. На производстве, где Docker действительно сияет, я понимаю необходимость быстрого вращения контейнеров вверх / вниз.
Я надеюсь, теперь ясно, что очень трудно, и я считаю, что это неправильно, сравнивать Docker с Vagrant. Для сред разработки Vagrant является более абстрактным, более общим. Docker (и различные способы заставить его вести себя как Vagrant) - это особый вариант использования Vagrant, игнорирующий все остальное, что может предложить Vagrant.
В заключение: в очень специфических случаях использования Docker, безусловно, является возможной заменой Vagrant. В большинстве случаев это не так. Vagrant не мешает вам использовать Docker; он на самом деле делает все возможное, чтобы сделать этот опыт более гладким. Если вы обнаружите, что это неправда, я с удовольствием приму предложения по улучшению, поскольку цель Vagrant - одинаково хорошо работать с любой системой.
Надеюсь, это прояснит ситуацию!
vagrant provision
).
Я автор Docker.
Короткий ответ: если вы хотите управлять машинами, вы должны использовать Vagrant. И если вы хотите создавать и запускать среды приложений, вам следует использовать Docker.
Vagrant - это инструмент для управления виртуальными машинами. Docker - это инструмент для создания и развертывания приложений путем упаковки их в легкие контейнеры. Контейнер может содержать практически любой программный компонент вместе со своими зависимостями (исполняемые файлы, библиотеки, файлы конфигурации и т. Д.) И выполнять его в гарантированной и воспроизводимой среде выполнения. Это позволяет очень просто создать приложение и развернуть его где угодно - на ноутбуке для тестирования, затем на разных серверах для оперативного развертывания и т. Д.
Это распространенное заблуждение, что вы можете использовать Docker только в Linux. Это неверно; Вы также можете установить Docker на Mac и Windows. При установке на Mac Docker связывает крошечную виртуальную машину Linux (25 МБ на диске!), Которая действует как оболочка для вашего контейнера. После установки это полностью прозрачно; вы можете использовать командную строку Docker точно таким же образом. Это дает вам лучшее из обоих миров: вы можете тестировать и разрабатывать свое приложение с использованием контейнеров, которые очень легки, просты в тестировании и легко перемещаются (см., Например, https://hub.docker.com для обмена повторно используемыми контейнерами с сообщество Docker), и вам не нужно беспокоиться о мельчайших подробностях управления виртуальными машинами, которые в любом случае являются лишь средством достижения цели.
Теоретически возможно использовать Vagrant в качестве уровня абстракции для Docker. Я рекомендую против этого по двум причинам:
Во-первых, Vagrant не является хорошей абстракцией для Docker. Vagrant был разработан для управления виртуальными машинами. Docker был разработан для управления временем выполнения приложения. Это означает, что Docker по своему замыслу может более полно взаимодействовать с приложением и имеет больше информации о времени выполнения приложения. Примитивами в Docker являются процессы, потоки журналов, переменные среды и сетевые связи между компонентами. Примитивами в Vagrant являются машины, блочные устройства и ssh-ключи. Vagrant просто находится ниже в стеке, и единственный способ, которым он может взаимодействовать с контейнером, - притворяться, что это просто другой тип машины, которую вы можете «загружать» и «входить в систему». Так что, конечно, вы можете напечатать «vagrant up» с помощью плагина Docker, и что-то очень красивое произойдет. Заменит ли он всю широту возможностей Docker? Попробуйте родной Docker на пару дней и убедитесь сами :)
Во-вторых, аргумент блокировки. «Если вы используете Vagrant в качестве абстракции, вы не будете заблокированы в Docker!». С точки зрения Vagrant, который предназначен для управления машинами, это имеет смысл: не являются ли контейнеры просто другим видом машины? Так же, как Amazon EC2 и VMware, мы должны быть осторожны, чтобы не связывать наши инструменты обеспечения с каким-либо конкретным поставщиком! Это создаст блокировку - лучше абстрагироваться от Vagrant. За исключением того, что это полностью упускает из виду Docker. Докер не предоставляет машины; это оборачивает ваше приложение в легкую переносимую среду выполнения, которую можно отбросить куда угодно.
То, какое время выполнения вы выбираете для своего приложения, никак не связано с тем, как вы готовите свои машины! Например, довольно часто можно развертывать приложения на компьютерах, которые предоставлены кем-то другим (например, экземпляр EC2, развернутый вашим системным администратором, возможно, с помощью Vagrant), или на чистых машинах, которые Vagrant не может предоставить вообще. И наоборот, вы можете использовать Vagrant для предоставления компьютеров, которые не имеют ничего общего с разработкой вашего приложения - например, готового к использованию Windows IIS или чего-то еще. Или вы можете использовать Vagrant для предоставления компьютеров для проектов, которые не используют Docker - возможно, они используют комбинацию rubygems и rvm для управления зависимостями и песочницы, например.
Итак, Vagrant предназначен для управления машинами, а Docker - для создания и запуска сред приложений.
Я предвосхищаю свой ответ, признавая, что у меня нет опыта работы с Docker, кроме как заядлого наблюдателя того, что выглядит действительно аккуратным решением, которое набирает обороты.
У меня есть приличный опыт работы с Vagrant, и я очень рекомендую его. Это, безусловно, более тяжелое решение с точки зрения того, что оно основано на виртуальной машине, а не на LXC. Однако я обнаружил, что приличный ноутбук (8 ГБ ОЗУ, процессор i5 / i7) без проблем запускает виртуальную машину с использованием Vagrant / VirtualBox вместе с инструментами разработки.
Одна из замечательных особенностей Vagrant - это интеграция со скриптами Puppet / Chef / shell для автоматизации настройки. Если вы используете один из этих параметров для настройки своей производственной среды, вы можете создать среду разработки, максимально приближенную к идентичной, которую вы собираетесь получить, и это именно то, что вам нужно.
Еще одна замечательная особенность Vagrant - это то, что вы можете создавать версии Vagrantfile вместе с кодом приложения. Это означает, что все остальные в вашей команде могут поделиться этим файлом, и вы гарантированно, что все работают с одинаковой конфигурацией среды.
Интересно, что Vagrant и Docker на самом деле могут быть бесплатными. Vagrant может быть расширен для поддержки различных поставщиков виртуализации, и может оказаться, что Docker станет одним из таких поставщиков, который получит поддержку в ближайшем будущем. Видеть Https://github.com/dotcloud/docker/issues/404 для недавнего обсуждения этой темы.
Они очень дополняют друг друга.
Я использовал комбинацию VirtualBox, Vagrant и Docker для всех своих проектов в течение нескольких месяцев и почувствовал следующие преимущества.
В Vagrant вы можете полностью отказаться от любой индивидуальной подготовки Chef, и все, что вам нужно для работы с вашим файлом vagrant, - это подготовить машину, на которой выполняется один небольшой скрипт оболочки, устанавливающий Docker. Это означает, что мои Vagrant-файлы для каждого проекта практически идентичны и очень просты.
Вот типичный 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
Конфигурация соло Chef без докера будет значительно более сложной.
Последний большой плюс получается, когда вы переходите в производственную среду, перевод среды разработки в инфраструктуру хостов, которые одинаковы в том смысле, что у них просто достаточно конфигурации для запуска docker, означает на самом деле очень мало работы.
Если вы заинтересованы, у меня есть более подробная статья о среде разработки на моем собственном веб-сайте по адресу
Vagrant-lxc - это плагин для Vagrant, который позволяет вам использовать LXC для предоставления Vagrant. Он не обладает всеми функциями, которыми обладает стандартная бродячая виртуальная машина (VirtualBox), но он должен обеспечивать большую гибкость, чем контейнеры Docker. В ссылке есть видео, показывающее его возможности, которые стоит посмотреть.
С 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) с Chef в качестве провайдера. Или вы можете использовать VirtualBox в качестве поставщика и Docker в качестве поставщика.
Использование обоих является важной частью тестирования доставки приложений. Я только начинаю связываться с Docker и очень серьезно думаю о команде разработчиков, которая имеет ужасную сложность в создании и поставке своего программного обеспечения. Подумайте о классической ситуации с Проектом Феникс / Непрерывная доставка.
Мышление идет примерно так:
Это, кажется, является логическим продолжением заявления Митчелла о том, что Vagrant предназначен для разработки в сочетании с мышлением Фарли / Хамблса в рамках Continuous Delivery. Если я, как разработчик, смогу сократить цикл обратной связи по интеграционному тестированию и доставке приложений, это приведет к повышению качества и улучшению условий работы.
Тот факт, что я как разработчик постоянно и последовательно поставляю контейнеры на виртуальную машину и более целостно тестирую приложение, это означает, что производственные выпуски будут еще более упрощены.
Поэтому я вижу, как Vagrant развивается как способ использовать некоторые из удивительных последствий, которые Docker будет иметь для развертывания приложений.
Определенно Docker для победы!
Как вы, возможно, знаете, Vagrant предназначен для управления виртуальными машинами, а Docker - для управления программными контейнерами. Если вы не знаете о разнице, вот что: Контейнер программного обеспечения может использовать тот же компьютер и ядро совместно с другими контейнерами программного обеспечения. Используя контейнеры, вы экономите деньги, потому что вы не тратите ресурсы на несколько операционных систем (ядер), вы можете упаковать больше программного обеспечения на сервер, сохраняя хорошую степень изоляции.
Конечно, это новая дисциплина, чтобы заботиться о своих собственных недостатках и проблемах.
Выберите Docker Swarm, если ваши требования превышают лимит ресурсов одной машины.
В журнале Oracle Java действительно содержательная статья об использовании Docker в сочетании с Vagrant (и Puppet):
Вывод
Легкие контейнеры Docker быстрее по сравнению с классическими виртуальными машинами и стали популярными среди разработчиков и в рамках инициатив CD и DevOps. Если ваша цель - изоляция, Docker - отличный выбор. Vagrant - это менеджер виртуальных машин, который позволяет создавать сценарии конфигурации отдельных виртуальных машин, а также выполнять настройку. Однако это все-таки виртуальная машина, зависящая от VirtualBox (или другого менеджера виртуальных машин) с относительно большими накладными расходами. Для этого требуется простоя жесткого диска, который может быть огромным, занимает много оперативной памяти, а производительность может быть ниже оптимальной. Docker использует cgroups ядра и изоляцию пространства имен через LXC. Это означает, что вы используете то же ядро, что и хост, и ту же систему ile. Vagrant на уровень выше Docker с точки зрения абстракции, поэтому они на самом деле не сопоставимы. Инструменты управления конфигурацией, такие как Puppet, широко используются для предоставления целевых сред. С помощью Docker легко использовать существующие решения на основе Puppet. Вы также можете нарезать свое решение, чтобы инфраструктура обеспечивалась Puppet; промежуточное программное обеспечение, само бизнес-приложение или оба вместе предоставляются с помощью Docker; и Докер обволакивает Вагрант. С этим набором инструментов вы можете делать то, что лучше для вашего сценария.
Как создавать, использовать и организовывать контейнеры Docker в DevOps http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0