ホームページ  >  記事  >  バックエンド開発  >  Dockerを使ってPythonアプリケーションをデプロイする方法まとめ

Dockerを使ってPythonアプリケーションをデプロイする方法まとめ

高洛峰
高洛峰オリジナル
2017-03-23 16:10:271734ブラウズ

この記事は、Supervisor、Gunicorn および Nginx は、Python を使用して Web アプリケーションを開発する際に最も一般的に使用されるソフトウェアであるため、著者チームによって要約された貴重な経験に基づいて作成されています。 Docker を使用して Python アプリケーションをデプロイする場合、これらのベスト プラクティスは非常に参考になります。同時に、日々の練習の中で出会った「落とし穴」や貴重な経験も共有し、みんなで一緒に進歩していけたらと思います!

Docker を使用すると、Python アプリケーションを簡単かつ効率的にデプロイできます。同時に、デプロイメントをスムーズに完了するためのベスト プラクティスがいくつかあります。もちろん、これらのベスト プラクティスが展開を完了する唯一の方法だというわけではありませんが、私たちのチームは、これらのベスト プラクティスは可用性が高く、保守が簡単であることを発見しました。この記事のほとんどの内容は私の立場を表しているだけであることに注意してください。Docker に基づいた実装は数多くありますので、お好みに合わせて選択してください。 Volume については別のトピックで説明する必要があるため、この記事ではあまり紹介しません。通常、ソース コードを実行するたびに再構築するのではなく、ボリュームを使用してソース コードをコンテナにコピーします。

DEBIAN_FRONTEND

Docker ユーザーは、ユーザー入力を取得する場所をオペレーティング システムに指示するこの環境変数についてよく知っている必要があります。 「非対話型」に設定すると、ユーザーに入力を要求せずにコマンドを直接実行できます (翻訳者注: すべての操作は非対話型です)。これは、apt-get コマンドを実行する場合に特に便利です。これは、ユーザーがどのステップに進んでいるのかを常に確認するメッセージが表示され、常に確認が必要となるためです。非対話型モードでは、デフォルトのオプションが選択され、できるだけ早くビルドが完了します。

このオプションは、ENV コマンドを使用してグローバルに設定するのではなく、Dockerfile で呼び出される RUN コマンドでのみ設定するようにしてください。ENV コマンドは、コンテナーの実行プロセス全体で有効になるため、 BASH を介したコンテナ このとき、グローバル設定を行うと問題が発生します。例は次のとおりです。

# 正确的做法 - 只为这个命令设置ENV变量
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y python3
# 错误地做法 - 为接下来的任何命令都设置ENV变量,包括正在运行地容器
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get install -y python3

requirements.txt

基本コード (コードベース) と比較して、アプリケーションの依存関係はほとんど変更されないため、プロジェクトの依存関係を Dockerfile にインストールでき、後続のビルドも高速化できます (後のビルドのみ)変更されたコードをビルドする必要があります)。 Docker コンテナの階層構造は依存関係のインストール プロセスをキャッシュできるため、依存関係の再ダウンロードやビルドが必要ないため、その後のビルドは非常に高速になります。

ファイルの順序

上記の考え方 (キャッシュを使用) に従って推測すると、ファイルがコンテナに追加される順序が重要です。キャッシュを最大限に活用して Docker ビルド プロセスを高速化するには、頻繁に変更されるファイルを Dockerfile の下に配置する必要があります。たとえば、アプリケーション構成、システム構成、依存関係がほとんど変更されない場合は、それらを Dockerfile の先頭に置くことができます。ルーティング ファイル、ビュー、データベース コードなどのソース ファイルは変更されることが多いため、Dockerfile の下に配置できます。これは Docker 構成コマンド (EXPOSE、ENV など) の下にあることに注意してください。

また、ファイルを Docker にコピーする方法については考えないでください。アプリケーションのソース ファイルなど、ほとんどのファイルはまったく使用されないため、ビルドは高速化されません。

アプリケーション キー

以前は、アプリケーション キーをアプリケーションに安全に渡す方法がわかりませんでしたが、後に docker run命令中的env-file パラメーターを使用できることがわかりました。すべてのキーと構成を app_config.list ファイルに入れ、このファイルを通じてアプリケーションに配信します。具体的には:

docker run -d -t -—env-file app_config.list <image:tag>

このメソッドを使用すると、コンテナーを再構築せずに、アプリケーションの設定とキーを簡単に変更できます。

注: app_config.list が .gitignore ファイルのレコードにあることを確認してください。そうでない場合、ソース ファイルにチェックインされません。

Gunicorn

Gunicorn をコンテナ内のアプリケーション サーバーとして使用します。Gunicorn は非常に安定しており、ワーカーの数と種類 (グリーン スレッド、gevent) を指定する機能など、多くの構成オプションを備えています。など)、最適なパフォーマンスを得るために負荷に基づいてアプリケーションを調整できます。

Gunicorn の起動は簡単です:

# 安装
pip3 install gunicorn

# 运行服务器
gunicorn api:app -w 4 -b 127.0.0.1:5000

最後のステップは、負荷分散 ができるように Nginx の背後でアプリケーション サーバーを実行することです。

supervisord

コンテナ内で複数のプロセスを実行することについて考えたことはありますか? Supervisord は間違いなく最高の補助ツールだと思います。 Nginx リバース プロキシと Gunicorn アプリケーションを含むコンテナをデプロイするとします。おそらく BASH スクリプトを使用して実行できますが、もう少し単純にしてみましょう。

スーパーバイザーは、「ユーザーが UNIX のようなオペレーティング システム上の一部のプロセスを監視および制御できるようにするプロセス制御システム」です。いいね!まず、Docker コンテナ内に Supervisor をインストールする必要があります。

RUN DEBIAN_FRONTEND=noninteractive apt-get install -y
supervisor

スーパーバイザーが何を実行するか、どのようにプロセスを管理するかを知るために、次にその設定ファイルを記述する必要があります。

[supervisord]
nodaemon = true  # 这个会让supervisord运行在前端

[program:nginx]  # 你想运行的第一个程序的命名
command = /usr/sbin/nginx  # nginx可执行程序的路径
startsecs = 5  # 如果nginx保持开启5s,我们视为启动成功

[program:app-gunicorn]
command = gunicorn api -w 4 -b 127.0.0.1:5000
startsecs = 5

これは非常に基本的な構成であり、制御ログ、stdout/stderr リダイレクト、再起動戦略などの多くの構成項目もあります。このツールは本当に素晴らしいです。

構成が完了したら、Docker がそれをコンテナーにコピーしていることを確認します。

ADD supervisord.conf /etc/supervisord.conf

スーパーバイザーをコンテナーの自己起動コマンドとして機能させます。

CMD supervisord -c /etc/supervisord.conf

它将会在容器启动的时候,运行Gunicorn和Nginx。如果已经配置过了,那将会按需重启它们。

学到的东西以及未来的目标

我们已经花了很长时间在Docker中部署代码,并且接下来会投入更多的时间。在使用Docker的过程中,我们学到的最重要经验就是如何最小化思考(think minimally)。在一个容器中运行你的整个系统真的很诱人,但是在应用各自的容器中运行应用进程却更容易维护。一般情况下,我们会在容器中运行Nignx和Web服务器,并且在一些场景中,使用单独的容器来运行Nginx却没有任何优势,它可能只会增加复杂度。我们发现对于大多数情况,它在容器中的开销是可接受的。

我希望这些信息对各位有价值!当我们团队学到更多最佳实践时,我会更新这篇文章。

以上がDockerを使ってPythonアプリケーションをデプロイする方法まとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。