¿Cuál es la diferencia entre Docker y Python virtualenv?

84

Por lo que entiendo sobre Docker, es una herramienta que se usa para entornos virtuales. En su jerga, se llama "contenerización". Esto es más o menos lo que hace virtualenv de Python. Sin embargo, puede usar virtualenv en Docker. Entonces, ¿es un entorno virtual dentro de un entorno virtual? Estoy confundido en cuanto a cómo funcionaría esto, entonces, ¿alguien podría aclararlo?

danielschnoll
fuente
21
Esta es una buena pregunta, pero probablemente se cerrará por estar fuera de tema. virtualenv no es un aislamiento real, es el aislamiento de un hombre pobre usando rutas de acceso y enlaces simbólicos; todavía estás dentro de tu propio sistema operativo. Docker proporciona más aislamiento, pero no tanto como una máquina virtual completa. Podría pensar en un contenedor como un término medio entre una caja virtual (pesada, cara) y una virtualenv (ligera, barata). Crear un virtualenv dentro de un contenedor no tiene mucho sentido porque el aislamiento ya lo proporciona Docker, no tendría mucho sentido hacerlo.
wim

Respuestas:

95

Un virtualenv solo encapsula las dependencias de Python. Un contenedor de Docker encapsula un sistema operativo completo .

Con un virtualenv de Python, puede cambiar fácilmente entre las versiones y dependencias de Python, pero está atascado con su sistema operativo host.

Con una imagen de Docker, puede cambiar todo el sistema operativo: instalar y ejecutar Python en Ubuntu, Debian, Alpine e incluso Windows Server Core.

Hay imágenes de Docker con cada combinación de versiones de SO y Python que se le ocurran, listas para desplegar y usar en cualquier sistema con Docker instalado.

sp0gg
fuente
24

El entorno virtual de Python "contenedorizará" solo el tiempo de ejecución de Python, es decir, el intérprete de Python y las bibliotecas de Python, mientras que Docker aísla todo el sistema (todo el sistema de archivos, todas las bibliotecas de espacio de usuario, interfaces de red). Por lo tanto, Docker está mucho más cerca de una máquina virtual que de un entorno virtual.

jil
fuente
¿Existe algún beneficio en la creación de un entorno virtual dentro de un contenedor docker considerando que el contenedor solo servirá para una aplicación web de matraz?
thanos.a
9

Agregando a lo anterior: existe un caso para combinar docker y venv: algunos sistemas operativos se envían con python instalado para proporcionar aplicaciones 'OS-near', por ejemplo, que yo sepa, apt en debian (y sus derivados). Python venv permite a un desarrollador enviar una aplicación de Python que requiere una versión de intérprete diferente sin afectar la Python enviada con el sistema operativo. Ahora, dado que Docker 'aísla todo el sistema operativo' como se indicó anteriormente, lo mismo se aplica a una imagen de Docker. Por lo tanto, en mi opinión, si se requiere / desea una imagen de Docker, es una buena práctica crear un venv dentro de la imagen de Docker para su aplicación de Python.

Blindfreddy
fuente
2
¿Esto ralentizaría el tiempo de respuesta (dos niveles de virtualización)?
Andrew Swift
2
El entorno virtual de Python cambia el entorno de Python, no virtualiza la ejecución del intérprete de Python. El contenedor Docker no se virtualiza a menos que se ejecute con un hipervisor (máquina Docker).
Morten
Sigo pensando que me resultará tedioso montar la ventana acoplable dentro de un sistema operativo, normalmente hago esto, programo en un lenguaje shell todas las dependencias del proyecto externas a pytohn y las ejecuto automáticamente, digamos en producción vía ssh
Alex Ancco Cahuana