多くの開発者は、自分のコンピューターを使用してプログラムを開発し、イントラネットにデプロイします。イントラネットがインターネットにアクセスできない場合、展開は非常に面倒であり、アプリケーションが依存するパッケージをイントラネットに転送する必要があります。 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つの手順を実行する必要があります。
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