Docker 和 Python virtualenv 有什么区别?

What's the difference between Docker and Python virtualenv?

据我了解Docker,它是一个用于虚拟环境的工具。在他们的行话中,它被称为 "containerization"。这或多或少就是 Python 的 virtualenv 所做的。但是,您可以使用 virtualenv in Docker。那么,它是虚拟环境中的虚拟环境吗?我对这将如何工作感到困惑,所以有人可以澄清一下吗?

Python 虚拟环境将 "containerize" 仅 Python 运行时,即 python 解释器和 python 库,而 Docker 隔离整个系统(整个文件系统,所有 user-space 库,网络接口)。因此 Docker 比虚拟环境更接近于虚拟机。

一个virtualenv只封装了Python个依赖。 Docker 容器封装了 整个 OS.

使用 Python virtualenv,您可以轻松地在 Python 版本和依赖项之间切换,但您受限于主机 OS。

使用 Docker 映像,您可以换出整个 OS - 安装 运行 Python Ubuntu、Debian、Alpine,甚至Windows 服务器核心。

有 Docker images 以及您能想到的 OS 和 Python 版本的每种组合,随时可以下载并在任何系统上使用Docker 已安装。

添加到上面:有一个结合 docker 和 venv 的案例:一些 OSs 附带 python 安装以提供 'OS-near' 应用程序,例如,据我所知,apt on debian(及其衍生产品)。 python venv 使开发人员能够发布需要不同解释器版本的 python 应用程序,而不会影响附带的-OS python。现在,由于 Docker 'isolates the whole OS' 如上所述,这同样适用于 Docker 图像。因此,在我看来,如果 Docker 图像是 required/desired,最好的做法是在 Docker 图像内为您的 python 应用程序创建一个 venv。

“一个虚拟环境,一个独立的目录树,其中包含 Python 特定版本 Python 的安装,以及一些附加包”

一个docker容器提供了更高级别的abstraction/isolation,它可以有自己的“进程space、文件系统、网络space、ipcspace,等等