【问题标题】:What's the difference between Docker and Python virtualenv?Docker 和 Python virtualenv 有什么区别?
【发布时间】:2018-12-01 03:58:24
【问题描述】:

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

【问题讨论】:

  • 这是一个很好的问题,但很可能会因为离题而被关闭。 virtualenv 不是真正的隔离,它是一个穷人使用路径黑客和符号链接的隔离——你仍然在你自己的操作系统中。 Docker 提供了更多的隔离,但不如一个完整的虚拟机。您可以将容器视为介于 virtualbox(重、昂贵)和 virtualenv(轻、便宜)之间的中间地带。在容器中创建 virtualenv 没有多大意义,因为隔离已经由 docker 提供,这样做没有多大意义。

标签: python docker virtualenv


【解决方案1】:

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

【讨论】:

  • 考虑到容器只会服务于烧瓶网络应用程序,在 docker 容器内创建虚拟环境有什么好处。
【解决方案2】:

virtualenv 仅封装 Python 依赖项。一个 Docker 容器封装了一个整个操作系统

使用 Python virtualenv,您可以轻松地在 Python 版本和依赖项之间切换,但您会被主机操作系统所困。

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

Docker images 有你能想到的各种操作系统和 Python 版本的组合,可以在任何安装了 Docker 的系统上下载和使用。

【讨论】:

  • 另外还有distroless images 表示来自 Google 的“仅包含编程语言运行时”的“几种流行的编程语言”(包括 Python)——来自 ArchWiki/Docker
【解决方案3】:

除此之外:有一个组合 docker 和 venv 的案例:一些操作系统附带安装了 python 以提供“OS-near”应用程序,例如,据我所知,apt on debian(及其衍生产品)。 python venv 使开发人员能够发布需要不同解释器版本的 python 应用程序,而不会影响随操作系统提供的 python。现在,由于 Docker 如上所述“隔离了整个操作系统”,因此同样适用于 Docker 映像。因此,在我看来,如果需要/需要 Docker 映像,最好在 Docker 映像中为您的 python 应用程序创建一个 venv。

【讨论】:

  • 这会减慢响应时间(两个虚拟化级别)吗?
  • Python 虚拟环境改变了 Python 环境,它不虚拟化 Python 解释器的执行。除非使用管理程序(Docker Machine)执行,否则 Docker 容器不会被虚拟化。
  • 我仍然认为在操作系统中挂载docker对我来说会很乏味,我通常这样做,我用shell语言编写pytohn外部项目的所有依赖项并自动执行它们,假设在生产中通过 ssh
  • 需要不同的解释器版本 - 这是错误的。 venv 与创建它的操作系统解释器版本相同
【解决方案4】:

“一个虚拟环境,一个自包含的目录树,其中包含特定版本 Python 的 Python 安装,以及一些额外的包”

一个docker容器提供了更高层次的抽象/隔离,它可以拥有自己的“进程空间、文件系统、网络空间、ipc空间等”

【讨论】:

    猜你喜欢
    • 2020-05-05
    • 2012-01-05
    • 2016-04-24
    • 2016-10-24
    • 2016-11-08
    • 1970-01-01
    • 2021-05-24
    • 2015-04-08
    相关资源
    最近更新 更多