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

В пределах класса не существует способа сделать это, если только A не было определено как-то другим (а затем some_func (A) будет делать что-то совершенно отличное от того, что вы ожидаете)

Если вы не проводите проверку стека для добавления бит в класс, кажется странным, почему вы хотите это сделать. Почему не просто:

class A:
    # do something
    pass

some_func(A)

То есть, запустите some_func на A после его создания. В качестве альтернативы вы можете использовать декоратор класса (синтаксис для него был добавлен в версии 2.6) или метакласса, если вы хотите каким-то образом изменить класс A. Не могли бы вы пояснить свой прецедент?

2023
задан Peter Mortensen 24 December 2016 в 22:57
поделиться

10 ответов

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

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

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

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

1120
ответ дан Peter Mortensen 24 December 2016 в 22:57
поделиться

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

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

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

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

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

82
ответ дан Peter Mortensen 24 December 2016 в 22:57
поделиться

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

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

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

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

9
ответ дан Jairo Andres Velasco Romero 24 December 2016 в 22:57
поделиться

С 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 в качестве провайдера (VM) с Chef в качестве провайдера. Или вы можете использовать VirtualBox в качестве провайдера и Docker в качестве провайдера.

45
ответ дан Peter Mortensen 24 December 2016 в 22:57
поделиться

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

52
ответ дан jenzz 24 December 2016 в 22:57
поделиться

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

Заключение

Докер Легкие контейнеры быстрее по сравнению с классическими виртуальными машинами и стали популярными среди разработчиков и в рамках инициатив 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

7
ответ дан Peter Mortensen 24 December 2016 в 22:57
поделиться

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

Я использовал комбинацию 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, который устанавливает Docker, выглядит следующим образом

#!/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 без докера будет значительно сложнее.

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

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

Реализация среды разработки Vagrant / Docker

59
ответ дан tobych 24 December 2016 в 22:57
поделиться

Использование обоих является важной частью тестирования доставки приложений. Я только начинаю связываться с Docker и очень серьезно думаю о команде разработчиков, которая имеет ужасную сложность в создании и поставке своего программного обеспечения. Подумайте о классической ситуации с Проектом Феникс / Непрерывной Доставкой.

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

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

Это, кажется, является логическим продолжением утверждения Митчелла о том, что Вагрант предназначен для развития в сочетании с мышлением Фарли / Хамблса в «Непрерывной доставке». Если я, как разработчик, смогу сократить цикл обратной связи по интеграционному тестированию и доставке приложений, это приведет к повышению качества и улучшению условий работы.

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

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

14
ответ дан Boyd Hemphill 24 December 2016 в 22:57
поделиться

Я автор Docker.

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

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

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

1371
ответ дан Robert 24 December 2016 в 22:57
поделиться

Отказ от ответственности: я написал 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.

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 знает, как подключить статический 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 действительно сияет, я понимаю необходимость быстрого вращения контейнеров вверх / вниз.

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

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

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

2294
ответ дан Marcin Orlowski 24 December 2016 в 22:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: