GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

Minicondaを使用してPythonアプリケーションをDocker化する方法[ハイブリッドアプローチ]

Dockerに精通している場合は、Dockerfileを使用してカスタムDockerイメージを作成できることをおそらくご存知でしょう。詳細について書きました。

Dockerfileを使用してカスタムDockerイメージを作成する方法[非常に簡単]Dockerの真の力は、ベースのDockerイメージを要件に合わせて調整することにあります。これにより、カスタムDockerイメージからコンテナーを実行することで、カスタムLinux環境を簡単かつ迅速にデプロイできます。 LinuxハンドブックAvimanyuBandyopadhyay

このチュートリアルでは、同じアイデアに従う方法を示しますが、Pythonアプリケーションのみを対象としています。これは、ユーザーと開発者の両方に役立ちます。

最小限のPythonイメージを使用します。そのイメージを変更および修正すると、Pythonアプリケーションを別のオペレーティングシステムにインストールすることを心配する必要がなくなります。毎回Dockerを使用してPythonアプリケーションをすぐに実行できます。したがって、これらのホストベースのインストールの問題に別れを告げることができます。

PythonアプリケーションのDockerイメージを作成する

ここではMinicondaを使用します。 Minicondaは、condaの無料の最小限のインストーラーであり、Pythonアプリケーションを実行するために必要な最低限の必要なものだけを備えたAnacondaの小さなブートストラップバージョンを提供します。

なぜミニコンダなのか

複数の理由があります:

Minicondaをホストにインストールする場合、オペレーティングシステムのパッケージマネージャーによって提供されるPythonバージョンを実際に使用しているわけではありません。 Minicondaは、独自のPython環境を持つ別の場所にインストールされます。したがって、これにより、Dockerコンテナで実行した場合の分離レベルが向上します。

上記の点により、別の利点も得られます。condaを使用しているためです。 Minicondaがインストールされている場合、このツールを使用して、必要に応じて、アプリケーションの関連するPythonバージョンを変更できます。これは、Python 3のさまざまなバージョンに基づくアプリケーションの開発者にとって大きな助けになります。たとえば、3.6、3.7、3.8、3.9、またはそれ以前のバージョンでもかまいません。

たとえば、デフォルトでPython 3.9を実行しているが、関連する依存関係のためにPythonアプリケーションでPython 3.7が必要な場合、どうしますか?

ここがconda あなたを助けられる。これを使用すると、conda install python=3.7を実行できます。 必要なすべての依存関係を使用してインストールすることにより、必要なPythonバージョンを変更します。

  • Minicondaを使用すると、Python2とPython3の両方のアプリケーションをインストールできます。 Python 2は正式に廃止されましたが、2to3で新しいPython 3ポートを監査しなくても、この環境で古いアプリケーションをテストできます。
  • Minicondaで実行されているPythonアプリケーションがPython以外のホスト側の依存関係(たとえば、g++)を探す多くのユースケースもあります。 )。これは、MinicondaとDockerを組み合わせたパワーが優れたソリューションになるときです!
  • condaを使用して、独自のPythonアプリケーション環境を作成してアクティブ化することもできることを忘れました。 ?再び隔離!
  • いつでも、DockerコンテナのデフォルトのPythonバージョンとMinicondaのバージョンを切り替えるオプションがあります。これにより、いつでも必要なときに変更を加えて新しいイメージを再構築できるため、柔軟性が向上します。

それでは、MinicondaとDockerを使用して新しいPythonアプリケーションイメージを作成してみましょう!

前提条件

まだインストールしていない場合は、Ubuntuまたは使用しているLinuxディストリビューションにDockerをインストールしてください。 sudoなしでdockerを実行できるように、必ずdockerグループに自分を追加してください。ベースDockerイメージをダウンロードするには、アクティブなインターネット接続が必要です。

サンプルのPythonアプリケーションでは、単純な「HelloWorld!」を使用しています。 python-app.pyという名前の例 Docker上のMinicondaを介して実行する方法を理解しやすくするため。

さまざまなPythonライブラリを使用する本格的なPythonアプリケーションは、特にMinicondaのさまざまな依存関係の規定により、同じ手順から大きな恩恵を受けるでしょう。

ステップ1:Dockerイメージを取得する[オプション]

この例では、AlpineLinuxの代わりにPythonSlimを選択しました。後者は非常に小さいですが、アプリケーションの実行に関してはパフォーマンスに大きな影響を与える可能性があります。ただし、PythonSlimのサイズはDebianBusterとPython3.9.1に基づいて約40MBです。

このステップはオプションです。前のDockerfileチュートリアルのように、カスタマイズされたPythonアプリケーションイメージと比較できることを示すために含めました。

docker pullを使用してPythonSlimの最新のdockerイメージをプルします コマンド:

docker pull python:slim

ステップ2:必要なカスタマイズを使用してDockerfileを作成する

次に、touchコマンドを使用してDockerfileという名前の新しい空のファイルを作成しましょう。ただし、最初にDockerアプリのディレクトリを作成します。

mkdir python-docker
cd python-docker
touch Dockerfile

ファイルのステップバイステップのウォークスルーを介してイメージ構築プロセス内のステップを説明し終えたら、以下に完全なDockerfileを同封します。

イメージの作成を開始および進行する方法は次のとおりです。

ベースイメージを準備する

Python Slimをベースイメージとして使用して、最新のデフォルトパッケージを更新します。

FROM python:slim
RUN apt-get update && apt-get -y upgrade \
非Pythonパッケージの依存関係をインストールする

PythonアプリのPython以外の依存関係をインストールします(たとえば、g++ およびその他の要件に応じて)。

  && apt-get install -y --no-install-recommends \
    git \
    wget \
    g++ \
    gcc \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/*

GitとWgetは、さまざまなリポジトリやURLからPythonアプリケーションをフェッチするときに非常に便利です。最後に、rm -rf /var/lib/apt/lists/*を使用してスペースをクリーンアップします。 最終的なDockerイメージサイズを最小化するため。

ミニコンダをインストール

インストール後、Minicondaは.bashrcを更新して独自のPythonバージョンに切り替えます。

ENV PATH="/root/miniconda3/bin:${PATH}"
ARG PATH="/root/miniconda3/bin:${PATH}"
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \
    && mkdir /root/.conda \
    && bash Miniconda3-latest-Linux-x86_64.sh -b \
    && rm -f Miniconda3-latest-Linux-x86_64.sh \

ここでは、環境変数がコンテナシステムパス内に設定されています。 ENV イメージとARGで実行するコンテナを対象としています 初めて構築するときに作成される中間コンテナを対象としています。

したがって、ENVの違い およびARG 上記のコードブロックの説明では、後者はイメージのビルド中にのみ使用できます。この美しい説明をここでチェックしてください。

wgetを使用 、公式のAnacondaリポジトリからMinicondaの最新バージョンをダウンロードします。重要な構成ディレクトリを作成したら、それをインストールし、最後にインストーラーを削除します。

ミニコンダをBashシェルに構成する

Minicondaをインストールした後、確認のためにバージョン番号を表示し、コンテナ用のBashシェルに初期化します。 。 2行目は、デフォルトの.bashrcを更新します ファイル:

	&& echo "Running $(conda --version)" && \
    conda init bash && \
新しい変更でBashをリロードします

DockerビルドシステムのBashをリロードして、Debian(ベースOSイメージ)ではなくMinicondaPythonバージョンに切り替えます。

	. /root/.bashrc && \

また、デフォルトでバンドルされている現在のMinicondaパッケージを更新します。

	conda update conda && \
アプリ用のConda環境を準備します

Pythonアプリケーション用に別のConda環境を作成してアクティブ化します。

    conda create -n python-app && \
    conda activate python-app && \

アプリに必要な関連するPythonバージョンをインストールします。アプリケーションがPython3.6に基づいていると仮定して、このバージョンをPipとともに新しい仮想環境内に設定します。これは、Pythonアプリケーションを管理するときにも非常に便利です。

    conda install python=3.6 pip && \
Pythonアプリケーションをインストールする

アプリの使用方法に応じて、次のいずれかを行うことができます。

私。従来はsetup.pyを使用していたpipを使用してインストールします リポジトリで利用可能なファイル。これは前に説明したのと同じツールですが、ここでは代わりにConda経由で使用しています。

	git clone replace-me-with-repo-url
	cd repo-name
	pip install -e .

ii。 ..またはpythonで直接実行する コマンド:

	git clone replace-me-with-repo-url
	cd repo-name
	python python-app.py

デモのDockerfileでは、「HelloWorld!」を使用します。コンテナを起動するか、Dockerを使用してbashシェル内で直接実行する方法を理解しやすくするための例。したがって、2番目の方法を使用しているとしましょう:

    echo 'print("Hello World!")' > python-app.py

上記の行を含めたので、python-app.pyというファイルを追加しました。 コマンドpython python-app.pyを使用して実行するたびにHelloWorldメッセージを生成することになっているが作成されます 。

Minicondaのように、アプリの.bashrcファイルを更新します。

conda init bashを実行すると、Minicondaインストーラーが.bashrcファイルを自動的に更新します。 前に示したように。 Pythonアプリケーションでも同じことができます。コンテナーbashを実行するたびに、環境がアクティブ化され、Pythonアプリケーション名をコマンドとして使用して実行することもできます。ここでは、名前をpython-appとして使用しました :

RUN echo 'conda activate python-app \n\
alias python-app="python python-app.py"' >> /root/.bashrc
最終実行のためにアプリを準備します

最後に、エントリポイントを作成し、このイメージに基づいてコンテナを実行するたびにエントリポイントを実行できるようにするコマンドを割り当てます。

ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
CMD ["python python-app.py"]
完全なDockerfile

VimやNanoなどのエディターを使用するか、catを使用できます 上記の行をDockerfileに追加するコマンド。

FROM python:slim
RUN apt-get update && apt-get -y upgrade \
  && apt-get install -y --no-install-recommends \
    git \
    wget \
    g++ \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/*
ENV PATH="/root/miniconda3/bin:${PATH}"
ARG PATH="/root/miniconda3/bin:${PATH}"
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \
    && mkdir /root/.conda \
    && bash Miniconda3-latest-Linux-x86_64.sh -b \
    && rm -f Miniconda3-latest-Linux-x86_64.sh \
    && echo "Running $(conda --version)" && \
    conda init bash && \
    . /root/.bashrc && \
    conda update conda && \
    conda create -n python-app && \
    conda activate python-app && \
    conda install python=3.6 pip && \
    echo 'print("Hello World!")' > python-app.py
RUN echo 'conda activate python-app \n\
alias python-app="python python-app.py"' >> /root/.bashrc
ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
CMD ["python python-app.py"]

独自のアプリを試す場合は、echo 'print("Hello World!")' > python-app.pyを置き換えてください 上記の行に、Pythonアプリケーションのインストールで説明されている2つの方法のいずれかを入力します。 上記のセクション。

ステップ3:Dockerfileを使用してPythonアプリケーションイメージをビルドする

ご存知かもしれませんが、Dockerfileから変更されたDockerイメージをビルドするコマンドは次のようになります。

docker build -t python-app PATH_to_Dockerfile

-tタグを使用して、アプリのDockerイメージの名前を指定します。 python-appとして設定しました 上記のコマンド例で。

Dockerfileが現在のディレクトリにあることを考慮して、次のようにPythonアプリケーションの新しいDockerイメージを作成できます。

docker build -t python-app .
[email protected]:~/python-docker$ docker build -t python-app .
Sending build context to Docker daemon   2.56kB
Step 1/8 : FROM python:slim
 ---> 677f7ac99e48
Step 2/8 : RUN apt-get update && apt-get -y upgrade   && apt-get install -y --no-install-recommends     git     wget     g++     ca-certificates     && rm -rf /var/lib/apt/lists/*
 ---> Using cache
 ---> 15ee9c47c83b
Step 3/8 : ENV PATH="/root/miniconda3/bin:${PATH}"
 ---> Using cache
 ---> cfd5ed6b5ec9
Step 4/8 : ARG PATH="/root/miniconda3/bin:${PATH}"
 ---> Using cache
 ---> e70d06b5ff10
Step 5/8 : RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh     && mkdir /root/.conda     && bash Miniconda3-latest-Linux-x86_64.sh -b     && rm -f Miniconda3-latest-Linux-x86_64.sh     && echo "Running $(conda --version)" &&     conda init bash &&     . /root/.bashrc &&     conda update conda &&     conda create -n python-app &&     conda activate python-app &&     conda install python=3.6 pip &&     echo 'print("Hello World!")' > python-app.py
 ---> Using cache
 ---> 8a7957a6abb2
Step 6/8 : RUN echo 'conda activate python-app \nalias python-app="python python-app.py"' >> /root/.bashrc
 ---> Running in e3193e93b631
Removing intermediate container e3193e93b631
 ---> 948f45eb6024
Step 7/8 : ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
 ---> Running in 621624951dcf
Removing intermediate container 621624951dcf
 ---> 6e8824889502
Step 8/8 : CMD ["python python-app.py"]
 ---> Running in dc97f9d0d8fe
Removing intermediate container dc97f9d0d8fe
 ---> 01bae0a9903c
Successfully built 01bae0a9903c
Successfully tagged python-app:latest

上記の出力はキャッシュされたデータに基づいていますが、初めて実行する場合は時間がかかり、はるかに長いログ出力が生成されます。

次に、変更したDockerイメージに、コンテナーを実行してサンプルアプリがインストールされていることを確認しましょう。

docker run python-app
[email protected]:~/python-docker$ docker run python-app
Hello World!

そのため、DockerとMinicondaを使用すると、事前のインストールを必要とせずにプログラムを直接実行できるようになります。今後、必要なのは画像だけです。

このコンテナ内のbashシェルにログインしてみましょう:

docker run -ti python-app bash
[email protected]:~/python-docker$ docker run -ti python-app bash
(python-app) [email protected]:/# 

ご覧のとおり、これで、Dockerfileを使用して以前に作成したCondaアクティブ化環境内にいます。 -ti フラグは、インタラクティブな端末を作成するために使用されます。代わりに、エイリアスしたコマンドを使用してアプリを実行することもできます:

(python-app) [email protected]:/# python-app
Hello World!

また、デフォルトのPythonバージョンではなく、MinicondaPythonバージョンを実際に使用していることを確認しましょう。

(python-app) [email protected]:/# python --version
Python 3.6.12 :: Anaconda, Inc.

先に述べたように、MinicondaはAnacondaの小型化バージョンです。

すべての設定が完了したら、GitHub、GitLab、Gitea、Bitbucket、またはその他のリポジトリでオープンソースPythonアプリケーションをホストしている場合は、最終的なイメージをDockerHubにプッシュできます。

ターミナルでexitと入力して、コンテナを終了します。コンテナーを停止し、コンテナーを削除し、Dockerイメージを(必要に応じて)削除して、ディスク領域を解放します。

おめでとうございます! Pythonアプリケーション用に独自のDockerイメージを作成する方法を学びました。

役に立ちましたか?

つまり、Minicondaは、アプリケーションをユーザーレベルでより柔軟で将来にわたって利用できるようにするだけでなく、開発者の役割もはるかに簡単にします。

PyCharmでこれを設定するのがどれほど便利か考えてみてください! MinicondaとPythonアプリケーションは、ホストシステムと同じようにインストールしますが、Dockerイメージとしてビルドして保存するため、1回限りのプロセスになります!

必要に応じて、「Hello World!」の代わりに、この前のチュートリアルで示したさまざまな例を試すことができます。これで使用した例。

お役に立てれば!ご質問やご提案がございましたら、下にコメントを残してください。


Docker
  1. Dockerを使用してOpenVPNサーバーをインストールしてホストする方法

  2. Dockerを使用してJenkinsをインストールする方法

  3. Dockerを使用してマイクロサービスをデプロイする方法

  1. ランチャーでアプリをデプロイする方法

  2. LinodeにDockerを使用してnginxコンテナをデプロイする方法

  3. Dockerイメージを他の人と共有する方法

  1. Dockerを使用してWordPressをインストールする方法、わかりやすいガイド

  2. Anaconda Python DataScienceDockerコンテナを構築する方法

  3. Minicondaを使用してPythonアプリケーションをDocker化する方法