Pythonアプリケーションを3分でコンテナ化

多くの開発者は、自分のコンピューターを使用してプログラムを開発し、イントラネットにデプロイします。イントラネットがインターネットにアクセスできない場合、展開は非常に面倒であり、アプリケーションが依存するパッケージをイントラネットに転送する必要があります。 Pythonアプリケーションの場合は、pipを使用して依存関係パッケージをインストールする必要もあります。コンパイルが必要な一部のパッケージでは、Windows環境でのインストールプロセス中にエラーが報告され、Linuxで必要なヘッダーファイルがないことを確認する場合があります。これらの依存関係パッケージをインストールすると、コストが高くなります。この時間は、実際にはあなた自身の技術的改善には役立ちません。可能な限り避ける必要があります。

一度展開してどこでも実行できますか?実際、この質問は少し時代遅れです。質問しないでください。質問はdockerです。dockerを知っているなら、コンテナの形でアプリケーションを公開することが非常に人気になっていることをご存知でしょう。

この記事では、Pythonアプリケーションをコンテナ化する方法について説明します。コンテナ化後、アプリケーションはDockerを使用して他のサーバーに簡単に移行できます。Dockerサーバーがインターネットに接続されていない場合でも、Dockerイメージをイントラネットにコピーするだけで済みます。展開を完了し、展開を実現し、どこでも実行して、アプリケーションの展開の効率を向上させます。

Python Webアプリケーションindex.pyがある場合、falskによって作成されたHelloworldは次のとおりです。

from flask import Flask
app =Flask(__name__)
@ app.route("/")
def hello():return"Hello World!"if __name__ =="__main__":
 app.run(host="0.0.0.0", port=int("5000"), debug=True)

python index.pyを実行した後、ブラウザで http://127.0.0.1:5000にアクセスすると、ブラウザに「Hello World!」と表示され、プログラムに問題がないことを示します。このファイルを誰かに送信する場合、その人はWebアプリケーションを起動するために次の3つの手順を実行する必要があります。

  1. Pythonインタープリターをインストールします
  2. フラスコライブラリをインストールします
  3. pythonindex.pyを実行します

実際の状況では、手順2で多くの依存関係が存在する可能性があります。ここでは、すべての依存ライブラリを requirements.txtファイルに配置します。

Flask==1.1.2

次に、アプリケーションのルートディレクトリ(ここにindex.pyが配置されているディレクトリ)にDockerfileという名前のテキストファイルを作成し、次のコードを貼り付けます。

FROM python:alpine3.8
COPY ./app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 5000
CMD python ./index.py

FROM命令はpython:alpine3.7を指していることに注意してください。これは、Dockerコンテナに使用するベースイメージを指示し、使用するPythonバージョン(この場合は3.8)を暗黙的に選択します。 Docker Hubには、ほぼすべてのPythonバージョンのベースイメージがあります。この例では、Alpine Linux(最小限のLinuxディストリビューション)にインストールされたPythonを使用します。これは、Dockerイメージを小さくするのに役立ちます。 Debian Jessieのような基本的なイメージを使用する正当な理由がない限り、Alpineを選択することをお勧めします。

また、requirements.txtファイルから依存関係をインストールするためにpipを呼び出すRUN命令にも注意してください。

Dockerfileの残りの命令は非常に単純です。 CMD命令は、アプリケーションを起動する対象を実行するようにコンテナに指示します。この場合、index.pyを実行するようにPythonに指示します。 COPYコマンドは、アプリケーションをコンテナイメージに移動するだけで、WORKDIRは作業ディレクトリを設定し、EXPOSEはFlaskが使用するポートをバインドします。

イメージをビルドするには、Dockerfileディレクトリで、ターミナルで dockerbuildコマンドを実行します。

docker build --tag somenzz-app ./

基本イメージをダウンロードしてビルドするのを待つと、somenzz-appのミラーが表示されます。

$ docker images | grep somenzz
somenzz-app                                         latest              b7e2359056bb        3 hours ago         89.1MB
somenzz/my-kali                                     latest              975cbe3a4619        2 weeks ago         1.83GB

この画像のサイズはわずか89.1MBであることがわかります。次に、他の画像がすでに利用可能であるように:

$ docker run --name python-app -p 5000:5000 somenzz-app
 * Serving Flask app "index"(lazy loading)* Environment: production
 WARNING: This is a development server. Do not use it in a production deployment.
 Use a production WSGI server instead.* Debug mode: on
 * Running on http://0.0.0.0:5000/(Press CTRL+C to quit)* Restarting with stat
 * Debugger is active!* Debugger PIN:201-219-912172.17.0.1--[14/Oct/202022:32:05]"GET / HTTP/1.1"200-

この時点で、コンテナは正常に起動され、ローカル5000ポートはコンテナの5000ポートにマップされます。したがって、 127.0.0.0:5000にアクセスすることは、コンテナの5000ポートにアクセスすることと同じです。

コンテナをバックグラウンドで実行する場合は、 -dパラメータを追加できます。

$ docker run -d  --name python-app -p 5000:5000 somenzz-app
259 d09fbbf77a6fd680cd7527600d055cb76fe3d6792063846103b47360210f9
$ docker container list | grep somenzz-app
259 d09fbbf77        somenzz-app                                         "/bin/sh -c 'python …"20 minutes ago      Up 20 minutes       0.0.0.0:5000->5000/tcp                           python-app

前の記事のステップ7を組み合わせる[ハンドタッチ、ドッカーに移動](http://mp.weixin.qq.com/s?__biz=MzU0OTg3NzU2NA==&mid=2247484908&idx=1&sn=64c49a211286ba9f1113ee0a75b5aef0&chksm=fba867bfccdfeea95fd2dca7a6de43cca02db4413347f3a5ef46652e20b68fdd4a0ca4f4ca60&scene=21#wechat_redirect):イメージを公開し、他のユーザーが使用できるようにコンテナーをネットワークに公開できます。

Dockerfileに慣れていない場合は、Dockerイメージを作成して公開する簡単な方法があります。これは、イメージをダウンロードして起動し、コンテナーにログインして変更し、依存関係をインストールして、新しいイメージとして保存し、最後に公開することです。もちろん、効率はさらに高くなります。時間があれば、Dockerfileを学ぶことをお勧めします。公式チュートリアルは次のとおりです。

https://docs.docker.com/engine/reference/builder/

当然、この記事は単純なHelloWorldWebアプリケーションです。より複雑なシナリオでは詳細にさらに注意を払う必要がありますが、ほとんどのPythonアプリケーションのコンテナ化プロセスは同じです。この記事が、お役に立てば幸いです。

Pythonの7番、より満足のいく7番を実行し、毎週Pythonのトリックを学び、注意を払うことを歓迎します。

Recommended Posts

Pythonアプリケーションを3分でコンテナ化
pythonの関数
03.Pythonエントリの演算子
Pythonの結合関数
12.Python3でのネットワークプログラミング
pythonでステートメントを印刷する
Pythonでの同時リクエスト
Ubuntuにpythonをインストールする
Pythonでのコンテキスト管理
pythonの算術演算子
pythonでguiを書く
PythonでのMongoDBの使用
PythonのStr文字列
Pythonでの計算ジオメトリ
Pythonでの同時リクエスト(パート2)
Pythonのタプルの添え字
Pythonでの継承について話す
pythonのイントロスペクションとは何ですか
pythonのオブジェクト指向とは何ですか
Pythonのジェネレーターとイテレーター
Pythonで文字列について話す
Python開発でのパンダの使用
pythonでnohupコマンド命令を使用する
pythonのリスト内包表記とは何ですか
pythonに関数のオーバーロードはありますか
PythonでNumpyを使い始める
詳細な並べ替えアルゴリズム(Pythonで実装)
pythonコードでラップする方法
Pythonでのrc1の意味
Python開発でのnumpyの使用
pythonのdefは何をしますか
Pythonで括弧を省略する方法
Pythonでの辞書の詳細な使用法
pythonでのosパッケージの使用
Pythonでのガベージコレクションについて学ぶ
pythonでクラスを書く方法
pythonで数値をフィルタリングする方法
Pythonの数字は何ですか?
Pythonにはいくつかのキーワードがあります
Pythonのすべてがオブジェクトです
pythonでエラーを表示する方法
npはpythonで何をしますか
pythonでreturnを書く方法
Pythonのモジュールについて話す
Pythonで変数を理解する方法
pythonで変数をクリアする方法
pythonでのタプルの使用法
PythonでSQLiteを使用する方法
pythonmysqlのパラメータ化の説明