Docker和Python virtualenv有什么区别?


84

据我对Docker的了解,它是用于虚拟环境的工具。用他们的术语来说,它叫做“容器化”。这或多或少是Python的virtualenv所做的。但是,您可以Docker中使用virtualenv 。那么,它是虚拟环境内部的虚拟环境吗?我对这甚至如何工作感到困惑,所以有人可以澄清一下吗?


21
这是一个很好的问题,但很可能会成为题外话。virtualenv并不是真正的隔离,它是使用路径黑客和符号链接的穷人隔离-您仍在自己的操作系统中。Docker提供了更多的隔离,但不如完整的虚拟机那么多。您可以将容器看作是virtualbox(沉重,昂贵)和virtualenv(轻便,廉价)之间的中间地带。在容器内创建virtualenv并没有多大意义,因为docker已经提供了隔离,这样做没有多大意义。
6

Answers:


95

virtualenv仅封装Python依赖项。Docker容器封装了整个OS

借助Python virtualenv,您可以轻松地在Python版本和依赖关系之间进行切换,但您将无法使用主机操作系统。

使用Docker映像,您可以换出整个操作系统-在Ubuntu,Debian,Alpine甚至Windows Server Core上安装并运行Python。

您可以想到Docker映像,其中包含您可以想到的OS和Python版本的每种组合,随时可以将其下拉并在安装了Docker的任何系统上使用。


24

Python虚拟环境将仅“包含” Python运行时,即python解释器和python库,而Docker隔离整个系统(整个文件系统,所有用户空间库,网络接口)。因此,Docker比虚拟环境更接近虚拟机。


考虑到该容器仅用于Flask Web应用程序,在Docker容器中创建虚拟环境有什么好处?
thanos.a

9

添加到上述内容:有一种将docker和venv结合使用的情况:某些操作系统随附安装了python,以提供“接近OS”的应用程序,例如,据我所知,适用于debian(及其衍生产品)。python venv使开发人员可以发布需要不同解释器版本的python应用程序,而又不影响OS附带的python。现在,由于Docker如上所述“隔离了整个操作系统”,因此同样适用于Docker映像。因此,在我看来,如果需要/需要Docker映像,则最佳实践是在Docker映像内为python应用程序创建venv。


2
这会减慢响应时间(两个虚拟化级别)吗?
安德鲁·斯威夫特

2
Python虚拟环境会更改python环境,但不会虚拟化python解释器的执行。除非使用管理程序(Docker Machine)执行,否则Docker容器不会被虚拟化。
莫滕

我仍然认为将docker挂载到操作系统中对我来说很繁琐,我通常这样做,我用shell语言对pytohn外部项目的所有依赖项进行编程,然后自动执行它们,比如说在ssh中生产
亚历克斯·安科·卡瓦纳
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.