Отказ от ответственности: я написал 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 - одинаково хорошо работать с любой системой.
Надеюсь, это прояснит ситуацию!
Я обнаружил, что django-logging очень помогает при разработке
from IPython.Shell import IPShellEmbed
ipshell = IPShellEmbed()
ipshell() # This call anywhere in your program will start IPython.
Таким образом, когда вы находитесь в представлении, вы можете войти в командную строку и изучить его. Все необходимые модели в любом случае будут импортированы и являются простой заменой shell_plus
. На мой взгляд, он даже заменяет runserver_plus
из django-command-extensions
.
(Поскольку я нашел то, что часто использую, это не распространенная идея, я ответил на нее сам .)
Я использую django-extensions в каждом проекте. Там много вещей, которые я никогда не использую, но это того стоит только для команд управления shell_plus и runserver_plus .
Shell_plus просто автоматически загружает все ваши модели: значительно экономит время ( РЕДАКТИРОВАТЬ : забыл кое-что не менее важное: он также использует ipython , если он установлен, для завершения табуляции и других удобств). Runserver_plus (требуется Werkzeug) предоставляет интерактивную страницу отладки ошибок 500. Вы можете перейти в консоль AJAX в любой момент трассировки - великолепно.
Команда print_user_for_session также удобна, если вы получаете электронное письмо с ошибкой на работающем сайте и хотите связаться с пользователем, у которого возникла ошибка.
обновление : встроенная оболочка управления Django также теперь использует IPython, если он доступен. И относительно легко создать профиль пользователя IPython для автоматического импорта моделей и всего остального, что вы хотите автоматически импортировать. Я больше не использую django-extension.
С одной стороны, я люблю раздражающий django метод render_to
.
@render_to('template.html')
def foo(request):
bar = Bar.objects.all()
return {'bar': bar}
# equivalent to
def foo(request):
bar = Bar.objects.all()
return render_to_response('template.html',
{'bar': bar},
context_instance=RequestContext(request))
Я не использовал ни один из других все же, хотя я смотрел на django-debug-toolbar.
Единственный наиболее полезный аддон для разработки Django, который мы используем, - это django-evolution . Это решение для обновления схемы, которое требует значительного количества ручной работы по внесению изменений в существующие модели. Это сэкономило мне бесчисленное количество часов работы.