DockerとPythonvirtualenvの違いは何ですか?


84

Dockerについて私が理解していることから、Dockerは仮想環境で使用されるツールです。彼らの用語では、それは「コンテナ化」と呼ばれています。これは多かれ少なかれPythonのvirtualenvが行うことです。ただし、Dockerではvirtualenv使用できます。それで、それは仮想環境内の仮想環境ですか?これがどのように機能するかについて私は混乱しているので、誰かが明確にしてくれませんか?


21
これは良い質問ですが、トピックから外れる可能性があります。virtualenvは本当の分離ではなく、パスハックとシンボリックリンクを使用した貧乏人の分離です-あなたはまだあなた自身のオペレーティングシステム内にいます。Dockerはより多くの分離を提供しますが、完全な仮想マシンほどではありません。コンテナーは、virtualbox(重い、高価)とvirtualenv(軽い、安い)の間の中間点と考えることができます。コンテナー内にvirtualenvを作成することは、分離が既にdockerによって提供されているため、あまり意味がありません。それを行う意味はあまりありません。
WIM

回答:


95

virtualenvは、Pythonの依存関係のみをカプセル化します。DockerコンテナはOS全体をカプセル化します

Python virtualenvを使用すると、Pythonのバージョンと依存関係を簡単に切り替えることができますが、ホストOSで立ち往生しています。

Dockerイメージを使用すると、OS全体を交換できます。PythonをUbuntu、Debian、Alpine、さらにはWindows ServerCoreにインストールして実行します。

考えられるOSとPythonのバージョンのすべての組み合わせを備えたDockerイメージがあり、Dockerがインストールされている任意のシステムでプルダウンして使用する準備ができています。


24

Python仮想環境は、Pythonランタイム、つまりpythonインタープリターとpythonライブラリのみを「コンテナ化」しますが、Dockerはシステム全体(ファイルシステム全体、すべてのユーザースペースライブラリ、ネットワークインターフェイス)を分離します。したがって、Dockerは仮想環境よりも仮想マシンにはるかに近いです。


コンテナーがフラスコWebアプリのみを提供することを考えると、Dockerコンテナー内に仮想環境を作成することに利点はありますか?
thanos.a

9

上記に加えて、dockerとvenvを組み合わせる場合があります。一部のOSには、「OS-near」アプリを提供するためにPythonがインストールされて出荷されます。たとえば、私の知る限り、debian(およびその派生物)に適しています。python venvを使用すると、開発者は、OSに同梱されているPythonに影響を与えることなく、異なるインタープリターバージョンを必要とするPythonアプリを出荷できます。さて、上記のようにDockerは「OS全体を分離する」ので、同じことがDockerイメージにも当てはまります。したがって、私の見解では、Dockerイメージが必要/望ましい場合は、PythonアプリのDockerイメージ内にvenvを作成することをお勧めします。


2
これにより、応答時間が遅くなりますか(2レベルの仮想化)?
アンドリュー・スウィフト

2
Python仮想環境は、Pythonインタープリターの実行を仮想化しないPython環境を変更します。Dockerコンテナーは、ハイパーバイザー(Docker Machine)で実行されない限り、仮想化されません。
モーテン

それでも、オペレーティングシステム内にdockerをマウントするのは面倒だと思います。通常はこれを行い、pytohnの外部にあるプロジェクトのすべての依存関係をシェル言語でプログラムし、それらを自動的に実行します。たとえば、sshを介した本番環境では
Alex Ancco Cahuana
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.