В чем разница между Docker и Python virtualenv?

90

Насколько я понимаю, Docker - это инструмент, используемый для виртуальных сред. На их жаргоне это называется «контейнеризация». Это более или менее то, что делает virtualenv Python. Однако вы можете использовать virtualenv в Docker. Итак, это виртуальная среда внутри виртуальной среды? Я не понимаю, как это вообще будет работать, так что кто-нибудь может уточнить?

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

Ответы:

102

Virtualenv инкапсулирует только зависимости Python. Контейнер Docker инкапсулирует всю ОС .

С помощью Python virtualenv вы можете легко переключаться между версиями Python и зависимостями, но вы застряли в своей ОС.

С помощью образа Docker вы можете заменить всю ОС - установить и запустить Python в Ubuntu, Debian, Alpine и даже в Windows Server Core.

Существуют образы Docker со всеми возможными комбинациями версий ОС и Python, готовые к загрузке и использованию в любой системе с установленным Docker.

sp0gg
источник
Кроме того, существуют образы без дистрибутивов для «нескольких популярных языков программирования» (включая Python) от Google, которые «содержат только среду выполнения языка программирования» - из ArchWiki / Docker
muthuh
25

Виртуальная среда Python будет «контейнеризовать» только среду выполнения Python, то есть интерпретатор Python и библиотеки Python, тогда как Docker изолирует всю систему (всю файловую систему, все библиотеки пользовательского пространства, сетевые интерфейсы). Поэтому Docker намного ближе к виртуальной машине, чем к виртуальной среде.

Джил
источник
Есть ли какие-либо преимущества в создании виртуальной среды внутри контейнера докеров, учитывая, что контейнер будет обслуживать только веб-приложение фляги.
thanos.a
10

Добавим к вышесказанному: есть случай для объединения docker и venv: некоторые ОС поставляются с установленным python для предоставления приложений, близких к ОС, например, насколько мне известно, apt на debian (и его производных). Python venv позволяет разработчику поставлять приложение python, для которого требуется другая версия интерпретатора, не затрагивая питон, поставляемый с ОС. Теперь, поскольку Docker «изолирует всю ОС», как указано выше, то же самое относится и к образу Docker. Следовательно, на мой взгляд, если требуется / желателен образ Docker, лучше всего создать venv внутри образа Docker для вашего приложения python.

Blindfreddy
источник
4
Уменьшит ли это время отклика (два уровня виртуализации)?
Эндрю Свифт
3
Виртуальная среда Python изменяет среду Python, она не виртуализирует выполнение интерпретатора Python. Контейнер Docker не виртуализируется, если он не выполняется с помощью гипервизора (Docker Machine).
Мортен
Я все еще думаю, что мне будет утомительно монтировать докер внутри операционной системы, я обычно делаю это, я программирую на языке оболочки все зависимости проекта, внешние по отношению к pytohn, и выполняю их автоматически, скажем, в производстве через ssh
Alex Ancco Cahuana