Я використовую Ubuntu для розробки та розгортання і маю потребу в створенні ізольованого середовища.
З цією метою я розглядаю або Вагранта, або Докера. Які плюси і мінуси, або як вони порівнюють ці рішення?
Я використовую Ubuntu для розробки та розгортання і маю потребу в створенні ізольованого середовища.
З цією метою я розглядаю або Вагранта, або Докера. Які плюси і мінуси, або як вони порівнюють ці рішення?
Відповіді:
Якщо ваша мета - ізоляція, я думаю, що Докер - це те, чого ви хочете.
Vagrant - менеджер віртуальної машини. Це дозволяє скриптувати конфігурацію віртуальної машини, а також резервування. Однак це все-таки віртуальна машина залежно від VirtualBox (або інших) з величезними накладними витратами. Для цього потрібно мати файл жорсткого диска, який може бути величезним, вимагає багато оперативної пам’яті, а продуктивність може бути не дуже хорошою.
З іншого боку, Docker використовує групу ядра та простір імен через LXC . Це означає, що ви використовуєте те саме ядро, що і хост, і ту ж файлову систему. Ви можете використовувати Dockerfile разом із docker build
командою, щоб обробляти забезпечення та конфігурацію вашого контейнера. У вас є приклад на docs.docker.com про те, як зробити свій Dockerfile; це дуже інтуїтивно.
Єдиною причиною, яку ви могли б захотіти використовувати Vagrant, є те, що вам потрібно зробити BSD, Windows або іншу розробку, яка не є Linux, у вашому вікні Ubuntu. Інакше йдіть за Докером.
Відмова: Я написав Вагрант! Але через те, що я писав Vagrant, я більшу частину свого часу проводжу в світі DevOps, який включає в себе програмне забезпечення типу Docker. Я працюю з багатьма компаніями, які використовують Vagrant, і багато хто використовує Docker, і я бачу, як вони взаємодіють.
Перш ніж я розмовляю надто багато, пряма відповідь: у вашому конкретному сценарії (ви працюєте в самоті, працюєте на Linux, використовуючи Docker у виробництві), ви можете дотримуватися лише Docker і спрощувати речі. У багатьох інших сценаріях (я обговорюю далі) це не так просто.
Неправильно порівнювати Вагранта з Докером. У деяких сценаріях вони перетинаються, а в переважній більшості - ні. Насправді, більш вдалим порівнянням було б Vagrant порівняно з чимось на зразок Boot2Docker (мінімальна ОС, яка може запускати Docker). Vagrant є рівнем вище Докера з точки зору абстракцій, тому це не є справедливим порівнянням у більшості випадків.
Vagrant запускає речі для запуску програм / служб з метою розробки. Це може бути на VirtualBox, VMware. Він може бути віддаленим, як AWS, OpenStack. У тих випадках, якщо ви використовуєте контейнери, Vagrant не переймається і охоплює це: він може автоматично встановлювати, витягувати, створювати та запускати контейнери Docker, наприклад. З Vagrant 1.6 Vagrant має середовище розробки на основі докерів і підтримує використання Docker з тим же робочим процесом, що і Vagrant для Linux, Mac та Windows. Вагрант не намагається замінити Докера тут, він застосовує докерські практики.
Docker спеціально запускає контейнери Docker. Якщо ви порівнюєте безпосередньо з Vagrant: це конкретно більш конкретне (може запускати лише контейнери Docker), менш гнучкі (вимагає десь хоста Linux або Linux). Звичайно, якщо ви говорите про виробництво або ІС, порівняння з Вагрантом немає! Vagrant не живе в цих умовах, і тому Докера слід використовувати.
Якщо ваша організація працює лише з контейнерами Docker для всіх своїх проектів і має лише розробників, що працюють на Linux, то добре, Docker може точно працювати для вас!
Інакше я не бачу вигоди в спробі самостійно використовувати Docker, оскільки ви втрачаєте багато того, що може запропонувати Vagrant, які мають реальні переваги для бізнесу / підвищення продуктивності:
Vagrant може запускати машини VirtualBox, VMware, AWS, OpenStack тощо. Не має значення, що вам потрібно, Vagrant може запустити його. Якщо ви використовуєте Docker, Vagrant може встановити Docker на будь-який із них, щоб ви могли використовувати їх для цієї мети.
Vagrant - це єдиний робочий процес для всіх ваших проектів. Або кажучи іншим способом, це лише одне, що люди повинні навчитися запускати проект, чи є він у контейнері Docker чи ні. Якщо, наприклад, в майбутньому у конкурента виникне конкуренція безпосередньо з Докером, Вагрант зможе це також запустити.
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 з VM без Vagrant, вам доведеться це зробити вручну або їм доведеться винаходити Vagrant у цьому випадку.
Vagrant 1.6 має першокласну підтримку середовищ розробки на основі докерів . Це не запустить віртуальну машину в Linux, а автоматично запустить віртуальну машину на Mac і Windows. Кінцевим результатом є те, що робота з Docker є рівномірною на всіх платформах, а Vagrant все ще обробляє стомлювальні деталі речей, такі як мережа, синхронізовані папки тощо.
Щоб вирішити конкретні зустрічні аргументи, які я чув на користь використання Docker замість Vagrant:
"Це менш рухомі частини" - Так, це може бути, якщо ви використовуєте Docker виключно для кожного проекту. Вже тоді це жертвує гнучкістю для блокування Docker. Якщо ви коли-небудь вирішите не використовувати Docker для будь-якого проекту, минулого, сьогодення чи майбутнього, тоді у вас буде більше рухомих частин. Якщо ви використовували Vagrant, у вас є одна рухома частина, яка підтримує решту.
"Це швидше!" - Після того, як у вас є хост, який може запускати контейнери Linux, Docker, безумовно, швидше працює, ніж будь-яка віртуальна машина була б запущена. Але запуск віртуальної машини (або віддаленої машини) - це разова вартість. Протягом дня більшість користувачів Vagrant ніколи фактично не знищують свій VM. Це дивна оптимізація для середовищ розробки. У виробництві, де Докер дійсно світить, я розумію необхідність швидко розкручувати контейнери.
Я сподіваюся, що тепер зрозуміло, що порівняти Докера з Вагрантом дуже складно, і я вважаю, що це не правильно. Для середовищ розробників Vagrant є більш абстрактним, більш загальним. Докер (і різні способи змусити його вести себе як Вагрант) - це специфічний випадок використання Вагранта, ігноруючи все інше, що може запропонувати Вагрант.
На закінчення: у дуже специфічних випадках використання Docker, безумовно, є можливою заміною Vagrant. У більшості випадків використання це не так. Vagrant не перешкоджає вашому використанню Docker; він насправді робить все можливе, щоб зробити цей досвід більш гладким. Якщо ви вважаєте, що це не так, я радий приймати пропозиції щодо вдосконалення речей, оскільки мета Vagrant - однаково добре працювати з будь-якою системою.
Сподіваюсь, це все прояснить!
vagrant provision
).
Я автор Докера.
Коротка відповідь полягає в тому, що якщо ви хочете керувати машинами, ви повинні використовувати Vagrant. І якщо ви хочете створювати та запускати додатки, слід скористатися Docker.
Vagrant - це інструмент для управління віртуальними машинами. Docker - це інструмент для створення та розгортання програм, упаковуючи їх у легкі контейнери. Контейнер може містити майже будь-який програмний компонент разом із залежностями (виконувані файли, бібліотеки, файли конфігурації тощо) та виконувати його в гарантованому та повторюваному середовищі виконання. Це дозволяє дуже просто створити додаток один раз і розгорнути його в будь-якому місці - на своєму ноутбуці для тестування, потім на різних серверах для прямого розгортання тощо.
Поширена помилка, що ви можете використовувати Docker лише в Linux. Це неправильно; ви також можете встановити Docker на Mac та Windows. Встановлюючись на Mac, Docker поєднує крихітний VM Linux (25 Мб на диску!), Який виконує функцію обгортки вашого контейнера. Після встановлення це повністю прозоро; ви можете використовувати командний рядок Docker точно так само. Це дає вам найкраще з обох світів: ви можете протестувати та розробляти свою програму за допомогою контейнерів, які дуже легкі, прості для тестування та прості переміщення (див., Наприклад, https://hub.docker.com для спільного використання контейнерів для багаторазового використання з спільноту Докера), і вам не потрібно турбуватися про тонко-дрібні деталі управління віртуальними машинами, які все одно є лише засобом для досягнення мети.
Теоретично можна використовувати Vagrant як шар абстракції для Docker. Я рекомендую проти цього з двох причин:
По-перше, Вагрант не є хорошою абстракцією для Докера. Vagrant був розроблений для управління віртуальними машинами. Docker був розроблений для управління програмою виконання. Це означає, що Docker, за задумом, може взаємодіяти з додатком більш багатими способами та має більше інформації про час роботи програми. Примітиви Докера - це процеси, потоки журналів, змінні середовища та мережеві зв’язки між компонентами. Примітивами у Vagrant є машини, блокові пристрої та ssh-ключі. Vagrant просто сидить нижче в стеці, і єдиний спосіб, коли він може взаємодіяти з контейнером, це зробити вигляд, що це просто інший вид машини, який можна "завантажувати" та "входити в систему". Тож, звичайно, ви можете набрати "бродягу" плагіном Docker, і щось трапиться. Це замість повного розмаху того, що може зробити Докер? Спробуйте рідний Докер на пару днів і переконайтеся самі:
По-друге, аргумент блокування. "Якщо ви використовуєте Vagrant як абстракцію, ви не будете заблоковані в Docker!". З погляду Vagrant, який призначений для управління машинами, це має ідеальний сенс: хіба контейнери не є ще одним видом машини? Як і Amazon EC2 та VMware, ми повинні бути обережними, щоб не прив’язати наші засоби забезпечення до конкретного постачальника! Це створило б блокування - краще абстрагувати все подалі від Vagrant. За винятком цього, цілком не вистачає точки Докера. Докер не забезпечує машини; він обертає вашу програму у легкому портативному режимі виконання, який можна кинути в будь-якому місці.
Час виконання, який ви обираєте для своєї програми, не має нічого спільного з тим, як ви забезпечуєте свої машини! Наприклад, досить часто розгортати додатки на машинах, які надає хтось інший (наприклад, екземпляр EC2, розгорнутий вашим системним адміністратором, можливо, використовуючи Vagrant), або голі металеві машини, які Vagrant взагалі не може надати. І навпаки, ви можете використовувати Vagrant на машинах забезпечення, які не мають нічого спільного з розробкою вашої програми - наприклад, готовим до використання вікном Windows IIS чи іншим. Або ви можете використовувати Vagrant для забезпечення машинами для проектів, які не використовують Docker - можливо, вони використовують комбінацію рубігем і rvm, наприклад, для управління залежностями та пісочниці.
Підсумовуючи це: Vagrant призначений для управління машинами, а Docker - для створення та роботи прикладних середовищ.
Я передмовляю свою відповідь, визнаючи, що я не маю досвіду роботи з Докером, окрім як завзятого спостерігача за тим, як виглядає дійсно акуратне рішення, яке набирає великої тяги.
У мене є пристойний досвід роботи з Vagrant і можу дуже рекомендувати його. Це, звичайно, більш важке рішення з точки зору того, що воно засноване на ВМ замість LXC. Однак, я знайшов гідний ноутбук (8 ГБ оперативної пам’яті, процесор i5 / i7) не має проблем із запуском VM за допомогою Vagrant / VirtualBox поряд із інструментами для розробки.
Однією з дійсно чудових речей з Vagrant є інтеграція зі сценаріями Puppet / Chef / shell для автоматизації налаштування. Якщо ви використовуєте один з цих параметрів для налаштування виробничого середовища, ви можете створити середовище розробки, наближене до ідентичного, як ви збираєтеся отримати, і саме цього ви хочете.
Інша чудова річ з Vagrant - це те, що ви можете оновлювати свій Vagrantfile разом із кодом програми. Це означає, що всі інші члени вашої команди можуть поділитися цим файлом, і ви гарантовано працюєте з однаковою конфігурацією середовища.
Цікаво, що Вагрант і Докер насправді можуть бути безкоштовними. Vagrant може бути розширений для підтримки різних постачальників віртуалізації, і можливо, Docker є одним з таких постачальників, який отримає підтримку найближчим часом. Див. Https://github.com/dotcloud/docker/isissue/404 для останньої дискусії з цієї теми.
Вони дуже доповнюють один одного.
Я вже декілька місяців використовую комбінацію VirtualBox, Vagrant та Docker для всіх своїх проектів і сильно відчуваю наступні переваги.
У програмі Vagrant ви можете повністю зайнятись будь-яким забезпеченням шеф-кухаря, і все, що вам потрібно зробити, - це підготувати машину, яка запускає єдиний невеликий сценарій оболонки, який встановлює докер. Це означає, що мої 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, який виглядає приблизно так
#!/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
Конфігурація соло-шеф-кухаря без докера була б значно складнішою.
Остаточний великий плюс отримується, коли ви переходите до виробництва, переводячи середовище розробки на інфраструктуру хостів, які все одно, що їм достатньо конфігурації, щоб запустити докер - це дуже мало роботи.
Якщо ви зацікавлені, у мене є більш детальна стаття про середовище розробки на власному веб-сайті за адресою
Vagrant-lxc - плагін для Vagrant, який дозволить вам використовувати LXC для надання Vagrant. Він не має всіх функцій, які має VM для віртуального замовчування (VirtualBox), але він повинен забезпечити вам більшу гнучкість, ніж докер-контейнери. У посиланні є відео, яке показує його можливості, які варто переглянути.
З Vagrant тепер ви можете мати Docker як постачальника. http://docs.vagrantup.com/v2/docker/ . Провайдера Docker можна використовувати замість VirtualBox або VMware.
Зверніть увагу, що ви також можете використовувати Docker для забезпечення Vagrant. Це зовсім інакше, ніж використання Docker в якості постачальника. http://docs.vagrantup.com/v2/provisioning/docker.html
Це означає, що ви можете замінити шеф-кухаря чи лялечку на Докер. Ви можете використовувати комбінації, як Docker в якості постачальника (VM), а шеф-кухар як постачальник. Або ви можете використовувати VirtualBox в якості постачальника та Docker як постачальника.
Використання обох є важливою частиною тестування доставки додатків. Я тільки починаю займатися Docker і дуже важко замислююся над командою додатків, яка має жахливу складність у створенні та постачанні свого програмного забезпечення. Подумайте про класичний проект Phoenix / Постійна доставка.
Мислення іде приблизно так:
Це, мабуть, є логічним продовженням твердження Мітчелла про те, що Вагрант - це розробка, поєднана з мисленням Фарлі / Хамблса в постійній доставці. Якщо я, як розробник, зможу скоротити цикл зворотного зв’язку щодо тестування інтеграції та доставки додатків, піде більш висока якість та краще робоче середовище.
Той факт, що я як розробник постійно та послідовно постачаю контейнери до VM та більш телісно тестую додаток, означає, що виробничі випуски будуть додатково спрощені.
Тому я бачу, що Вагрант розвивається як спосіб використовувати деякі дивовижні наслідки, які матиме Докер для розгортання додатків.
Однозначно Докер на виграш!
Як ви знаєте, Vagrant призначений для управління віртуальною машиною, тоді як Docker - для управління контейнерами для програм. Якщо ви не знаєте про різницю, ось ось такий: Контейнер програмного забезпечення може спільно використовувати одну машину та ядро з іншими контейнерами програмного забезпечення. Використовуючи контейнери, ви економите гроші, оскільки не витрачаєте ресурси на декілька операційних систем (ядер), ви можете пакувати більше програмного забезпечення на одному сервері, зберігаючи хороший ступінь ізоляції.
Звичайно, це нова дисципліна, яку потрібно піклуватися про власні ловушки та проблеми.
Перейдіть на Docker Swarm, якщо ваші вимоги перевищують єдиний ліміт ресурсів машини.
У справжньому журналі Oracle Java є справді інформативна стаття про використання Docker у поєднанні з Vagrant (та лялькою):
Висновок
Легкі контейнери Docker швидше порівняно з класичними машинками та стали популярними серед розробників і як частина ініціатив CD та DevOps. Якщо ваша мета - ізоляція, Докер - відмінний вибір. Vagrant - це менеджер VM, який дозволяє вам конфігурувати конфігурації окремих віртуальних машин, а також здійснювати резервування. Однак це підвіконня VM, залежне від VirtualBox (або іншого менеджера VM) з відносно великими накладними витратами. Це вимагає, щоб ви працювали на холостому диску, який може бути величезним, вимагає багато оперативної пам'яті, а продуктивність може бути неоптимальною. Docker використовує ізоляцію груп ядер і простору імен через LXC. Це означає, що ви використовуєте те саме ядро, що і хост, і та сама система ile. Vagrant є рівнем вище Докера з точки зору абстракції, тому вони насправді не порівнянні. Інструменти управління конфігурацією, такі як Лялька, широко використовуються для забезпечення цільових середовищ. Повторне використання існуючих на основі лялькових рішень легко з Docker. Ви також можете нарізати своє рішення, щоб інфраструктура була забезпечена Лялькою; проміжне програмне забезпечення, сам бізнес-додаток або обидва вони надаються Docker; і Докер загортається Вагрантом. За допомогою цього набору інструментів ви можете зробити те, що найкраще підходить для вашого сценарію.
Як створювати, використовувати та упорядкувати Docker-контейнери в DevOps http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0