Jaka jest różnica między Dockerem a Pythonem virtualenv?

90

Z tego, co rozumiem o Dockerze, jest to narzędzie używane w środowiskach wirtualnych. W ich języku nazywa się to „konteneryzacją”. Tak mniej więcej robi virtualenv w Pythonie. Możesz jednak używać virtualenv w Dockerze. Czy jest to zatem środowisko wirtualne w środowisku wirtualnym? Nie wiem, jak to w ogóle zadziała, więc czy ktoś mógłby to wyjaśnić?

danielschnoll
źródło
23
To dobre pytanie, ale prawdopodobnie zostanie zamknięte jako niezwiązane z tematem. virtualenv nie jest prawdziwą izolacją, to izolacja dla ubogich za pomocą hacków ścieżek i linków symbolicznych - nadal jesteś we własnym systemie operacyjnym. Docker zapewnia większą izolację, ale nie tak bardzo, jak w pełni włączona maszyna wirtualna. Można by pomyśleć o kontenerze jako o środku między virtualboxem (ciężki, drogi) a virtualenv (lekki, tani). Tworzenie virtualenv wewnątrz kontenera nie ma większego sensu, ponieważ izolacja jest już zapewniana przez docker, nie miałoby to większego sensu.
wim

Odpowiedzi:

102

Virtualenv hermetyzuje tylko zależności Pythona. Kontener Docker hermetyzuje cały system operacyjny .

Dzięki Python virtualenv możesz łatwo przełączać się między wersjami i zależnościami Pythona, ale utkniesz w systemie operacyjnym hosta.

Dzięki obrazowi Dockera możesz zamienić cały system operacyjny - zainstalować i uruchomić Python na Ubuntu, Debian, Alpine, a nawet Windows Server Core.

Istnieją obrazy Dockera z każdą kombinacją wersji systemu operacyjnego i Pythona, które możesz wymyślić, gotowe do ściągnięcia i użycia w dowolnym systemie z zainstalowanym Dockerem.

sp0gg
źródło
Dodatkowo istnieją obrazy bez rozpraszania dla „kilku popularnych języków programowania” (w tym Python) od Google, które „zawierają tylko środowisko wykonawcze języka programowania” - z ArchWiki / Docker
muthuh
25

Środowisko wirtualne Pythona "konteneruje" tylko środowisko uruchomieniowe Pythona, tj. Interpreter języka Python i biblioteki Pythona, podczas gdy Docker izoluje cały system (cały system plików, wszystkie biblioteki przestrzeni użytkownika, interfejsy sieciowe). Dlatego Docker jest znacznie bliżej maszyny wirtualnej niż środowisko wirtualne.

jil
źródło
Czy jest jakaś korzyść z tworzenia środowiska wirtualnego w kontenerze docker, biorąc pod uwagę, że kontener będzie obsługiwał tylko aplikację internetową flask.
thanos. A
10

Dodając do powyższego: istnieje argument za połączeniem docker i venv: niektóre systemy operacyjne są dostarczane z zainstalowanym pythonem w celu dostarczania aplikacji „OS-near”, np. Według mojej wiedzy apt na debianie (i jego pochodnych). Python venv umożliwia deweloperowi dostarczenie aplikacji w języku Python, która wymaga innej wersji interpretera bez wpływu na język Python dostarczany z systemem operacyjnym. Teraz, ponieważ Docker „izoluje cały system operacyjny”, jak wspomniano powyżej, to samo dotyczy obrazu Dockera. Dlatego moim zdaniem, jeśli obraz Dockera jest wymagany / pożądany, najlepszą praktyką jest utworzenie wenv wewnątrz obrazu Dockera dla aplikacji Python.

Blindfreddy
źródło
4
Czy spowolniłoby to czas odpowiedzi (dwa poziomy wirtualizacji)?
Andrew Swift
3
Środowisko wirtualne Pythona zmienia środowisko Pythona, ale nie wirtualizuje wykonania interpretera języka Python. Kontener Dockera nie jest zwirtualizowany, chyba że jest wykonywany za pomocą hiperwizora (Docker Machine).
Morten
Nadal uważam, że montowanie dockera wewnątrz systemu operacyjnego będzie dla mnie żmudne, zwykle to robię, programuję w języku powłoki wszystkie zależności projektu poza pytohn i wykonuję je automatycznie, powiedzmy na produkcji przez ssh
Alex Ancco Cahuana