Was ist der Unterschied zwischen Docker und Python virtualenv?

84

Nach meinem Verständnis von Docker handelt es sich um ein Tool, das für virtuelle Umgebungen verwendet wird. In ihrer Umgangssprache heißt es "Containerisierung". Dies ist mehr oder weniger das, was Pythons Virtualenv tut. Sie können virtualenv jedoch in Docker verwenden. Ist es also eine virtuelle Umgebung in einer virtuellen Umgebung? Ich bin verwirrt darüber, wie das überhaupt funktionieren würde. Könnte jemand bitte klarstellen?

danielschnoll
quelle
21
Dies ist eine gute Frage, wird aber wahrscheinlich als Off-Topic geschlossen. virtualenv ist keine echte Isolation, sondern die Isolation eines armen Mannes mithilfe von Pfad-Hacks und Symlinks - Sie befinden sich immer noch in Ihrem eigenen Betriebssystem. Docker bietet mehr Isolation, jedoch nicht so viel wie eine voll funktionsfähige virtuelle Maschine. Sie können sich einen Container als Mittelweg zwischen einer Virtualbox (schwer, teuer) und einer Virtualbox (leicht, billig) vorstellen. Das Erstellen einer virtuellen Umgebung in einem Container ist wenig sinnvoll, da die Isolierung bereits vom Docker bereitgestellt wird. Es wäre nicht sinnvoll, dies zu tun.
wim

Antworten:

95

Eine virtuelle Umgebung kapselt nur Python-Abhängigkeiten. Ein Docker-Container kapselt ein gesamtes Betriebssystem .

Mit einer virtuellen Python-Version können Sie problemlos zwischen Python-Versionen und Abhängigkeiten wechseln, aber Sie bleiben bei Ihrem Host-Betriebssystem hängen.

Mit einem Docker-Image können Sie das gesamte Betriebssystem austauschen - installieren und ausführen Sie Python unter Ubuntu, Debian, Alpine und sogar Windows Server Core.

Es gibt Docker- Images mit jeder erdenklichen Kombination von Betriebssystem- und Python-Versionen, die auf jedem System mit installiertem Docker heruntergefahren und verwendet werden können.

sp0gg
quelle
24

Die virtuelle Python-Umgebung "containerisiert" nur die Python-Laufzeit, dh Python-Interpreter und Python-Bibliotheken, während Docker das gesamte System (das gesamte Dateisystem, alle User-Space-Bibliotheken, Netzwerkschnittstellen) isoliert. Daher ist Docker einer virtuellen Maschine viel näher als einer virtuellen Umgebung.

jil
quelle
Gibt es einen Vorteil beim Erstellen einer virtuellen Umgebung in einem Docker-Container, wenn man bedenkt, dass der Container nur eine Flask-Web-App bedient?
thanos.a
9

Hinzu kommt, dass Docker und Venv kombiniert werden müssen: Einige Betriebssysteme werden mit Python geliefert, das installiert ist, um "OS-nahe" Apps bereitzustellen, z. B. meines Wissens für Debian (und seine Derivate). Mit dem Python-Venv kann ein Entwickler eine Python-App ausliefern, für die eine andere Interpreter-Version erforderlich ist, ohne die mit dem Betriebssystem gelieferte Python zu beeinträchtigen. Da Docker nun wie oben angegeben das gesamte Betriebssystem isoliert, gilt dies auch für ein Docker-Image. Wenn aus meiner Sicht ein Docker-Image erforderlich / erwünscht ist, empfiehlt es sich daher, im Docker-Image ein Venv für Ihre Python-App zu erstellen.

Blindfreddy
quelle
2
Würde dies die Reaktionszeit verlangsamen (zwei Virtualisierungsebenen)?
Andrew Swift
2
Die virtuelle Python-Umgebung ändert die Python-Umgebung und virtualisiert die Ausführung des Python-Interpreters nicht. Der Docker-Container wird nur virtualisiert, wenn er mit einem Hypervisor (Docker Machine) ausgeführt wird.
Morten
Ich denke immer noch, dass es für mich mühsam sein wird, Docker in einem Betriebssystem zu mounten. Normalerweise mache ich das. Ich programmiere in einer Shell-Sprache alle Abhängigkeiten des Projekts außerhalb von pytohn und führe sie automatisch aus, sagen wir in der Produktion über ssh
Alex Ancco Cahuana