簡體   English   中英

Docker 和 Python virtualenv 有什么區別?

[英]What's the difference between Docker and Python virtualenv?

據我了解Docker,它是一個用於虛擬環境的工具。 在他們的行話中,它被稱為“容器化”。 這或多或少就是 Python 的 virtualenv 所做的。 但是Docker可以使用virtualenv 那么,是不是虛擬環境里面的虛擬環境呢? 我對這將如何工作感到困惑,所以有人可以澄清一下嗎?

virtualenv 僅封裝 Python 依賴項。 一個 Docker 容器封裝了整個操作系統

使用 Python virtualenv,您可以輕松地在 Python 版本和依賴項之間切換,但您會被主機操作系統困住。

使用 Docker 映像,您可以更換整個操作系統——在 Ubuntu、Debian、Alpine 甚至 Windows Server Core 上安裝和運行 Python。

Docker鏡像包含您能想到的各種操作系統和 Python 版本的組合,隨時可以下載並在安裝了 Docker 的任何系統上使用。

Python 虛擬環境將“容器化”僅 Python 運行時,即 Python 解釋器和 Python 庫,而 Docker 隔離整個系統(整個文件系統、所有用戶空間庫、網絡接口)。 因此,Docker 比虛擬環境更接近於虛擬機。

添加到上述內容:有一個結合 docker 和 venv 的情況:一些操作系統附帶安裝了 python 以提供“OS-near”應用程序,例如,據我所知,適用於 debian(及其衍生產品)。 python venv 使開發人員能夠發布需要不同解釋器版本的 python 應用程序,而不會影響隨操作系統提供的 python。 現在,由於 Docker 如上所述“隔離了整個操作系統”,這同樣適用於 Docker 鏡像。 因此,在我看來,如果需要/需要 Docker 映像,最佳做法是在 Docker 映像中為您的 Python 應用程序創建一個 venv。

虛擬環境是一組依賴項的集成,可確保一個或多個應用程序可以無縫協同工作。 它為感興趣的應用程序提供了一組運行時保證。 虛擬環境將給定的一組依賴項與系統的應用程序隔離開來,允許用戶和開發人員根據需要擁有盡可能多的應用程序上下文。

特別地,Python 虛擬環境被設計為將綁定到特定版本 Python 的特定依賴集與系統 Python 隔離。這樣,用戶可以擁有多個系統 Python 版本,每個版本都可以擁有相應的虛擬環境集每個都有獨立的依賴關系。 因為 Python 虛擬環境僅適用於 Python,所以系統中安裝的任何非 Python 應用程序將以完全相同的方式被所有 Python 虛擬環境看到。 具體來說,可以將 Python3.7 到 Python3.11 作為系統 Python 安裝,同時擁有四個 Python3.10 虛擬環境( venv1 - venv4 ),每個環境都有不同版本的requests庫。 venv2中的應用程序可能僅適用於該虛擬環境中的特定版本的requests ,而不適用於其他版本。

另一方面,Anaconda 虛擬環境將依賴項集擴展到 Python 之外,幾乎包括任何應用程序。 這意味着它們可以包括系統應用程序(非 Python)以及完全獨立於系統應用程序的完整底層庫集。 例如,具有 HDF5 庫的 Apple Silicon 上的 anaconda 虛擬環境將僅在虛擬環境中為 Apple Silicon 提供完整的 HDF5 構建。 在這個 Anaconda 虛擬環境之外運行的任何應用程序將完全不知道 HDF5 的存在。

Docker,或一般意義上的容器,是一種完全不同的技術,僅在 Linux 機器上可用,其中應用程序實際上通過名稱空間彼此隔離 每個容器都提供一個虛擬進程空間,只能由該容器中的應用程序訪問,這些應用程序由容器運行時外部管理(例如 Docker、Containerd、podman 等)。 因此,可以擁有具有 Anaconda 個虛擬環境的容器。 容器運行時也可以移植到非 Linux 操作系統,但仍然需要 Linux kernel 來啟用底層進程命名空間。 這就是 Docker 在 Windows 和 macOS 上工作的原因,即使它們本身不支持進程命名空間。

總之,有兩種主要的虛擬化類型:

  • 應用程序依賴虛擬化(Python 和 Anaconda 虛擬環境),這可以被認為是“靜態”虛擬化,以及
  • 通過容器處理虛擬化,這可以被認為是“動態”虛擬化。

但是,我可能是錯的...

“一個虛擬環境,一個自包含的目錄樹,其中包含用於特定 Python 版本的 Python 安裝,以及一些附加包”

一個 docker 容器提供了更高級別的抽象/隔離,它可以擁有自己的“進程空間、文件系統、網絡空間、ipc 空間等”。

首先,容器與虛擬環境不同。

為了更好地管理 Python 資源,建議創建虛擬環境並為每個版本只配置包。

https://docs.python.org/3/tutorial/venv.html

使用 Docker 容器時,您已經進行了過程工程封裝,您可以在其官網查看

https://www.docker.com/resources/what-container/#

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM