Docker での FastAPI デプロイの詳細なプロセス

Docker での FastAPI デプロイの詳細なプロセス

Docker 学習

https://www.cnblogs.com/poloyy/p/15257059.html

プロジェクト構造

。
├── アプリ
│ ├── __init__.py
│ └── main.py
├── Dockerファイル
└── 要件.txt

FastAPI アプリケーションの main.py コード

入力からインポート オプション

fastapiからFastAPIをインポートする

アプリ = FastAPI()

@app.get("/")
read_root() を定義します:
    {"Hello": "World"} を返します

@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    {"item_id": item_id, "q": q} を返します

Dockerファイル

# 1. 公式PythonベースイメージFROM python:3.9から起動します

# 2. 現在の作業ディレクトリを/codeに設定する
# requirements.txt ファイルとアプリケーション ディレクトリ WORKDIR /code を配置する場所です。

# 3. まず requirements.txt ファイルをコピーします。# このファイルは頻繁に変更されないため、Docker はこれを検出してこのステップでキャッシュを使用し、次のステップでもキャッシュを有効にします。COPY ./requirements.txt /code/requirements.txt

# 4. pip コマンドを実行して依存関係をインストールします。RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

# 5. FastAPIプロジェクトコードをコピーします。COPY ./app /code/app

# 6. サービス CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] を実行します。

ステップ4: pipコマンド分析を実行する

pip install --no-cache-dir --upgrade -r /code/requirements.txt を実行します。

  • --no-cache-dir オプションは、ダウンロードしたパッケージをローカルに保存しないように pip に指示します。これは、同じパッケージをインストールするために pip を再度実行する場合にのみ必要ですが、コンテナーを使用する場合はそうではありません。
  • --no-cache-dir は pip にのみ関連し、Docker やコンテナには関連しません。
  • --upgrade オプションは、すでにインストールされているパッケージをアップグレードするように pip に指示します。
  • 前の手順でコピーされたファイルは Docker キャッシュによって検出される可能性があるため、Docker キャッシュが利用可能な場合はこの手順も使用されます。
  • このステップでキャッシュを使用すると、開発中にイメージを何度もビルドするときに、毎回すべての依存関係をダウンロードしてインストールする必要がなく、多くの時間を節約できます。

Docker キャッシュ

ここで重要なトリックがDockerfileにあります。まず、FastAPIアプリケーションコードではなく、依存関係のファイルのみをコピーします。

 ./要件.txt /コード/要件.txt
  • Docker やその他のツールは、これらのコンテナ イメージを段階的に構築し、レイヤーを 1 つずつ追加します。
  • Dockerfileの先頭(最初の行)から、Dockerfile内の各命令は任意のファイルを作成します。
  • Docker やその他のツールも、イメージを構築するときに内部キャッシュを使用します。
  • コンテナ イメージが最後にビルドされてからファイルが変更されていない場合は、ファイルを再度コピーして新しいレイヤーを最初から作成するのではなく、前回作成されたのと同じレイヤーが再利用されます。
  • ファイルコピーを避けるだけでは必ずしも状況は改善されませんが、そのステップでキャッシュを使用するので、次のステップでもキャッシュを使用することができます。
  • 例えば、依存関係をインストールするための指示にキャッシュを使用することができます。

pip install --no-cache-dir --upgrade -r /code/requirements.txt を実行します。

  • requirements.txt は頻繁に変更されないため、ファイルをコピーすることで、Docker はこのステップでキャッシュを使用できます。
  • Dockerはキャッシュを使用してこれらの依存関係をダウンロードしてインストールすることができ、これにより多くの時間が節約されます。
  • パッケージの依存関係のダウンロードとインストールには数分かかる場合がありますが、キャッシュを使用すると数秒しかかかりません。
  • コンテナイメージは開発プロセス中に何度もビルドされ、コードの変更が有効かどうかをチェックするため、累積的な時間を大幅に節約できます。

./app /コード/app

  • Dockerfileの最後にFastAPIアプリケーションコードをコピーします
  • これは最も頻繁に変更されるものなので、最後に配置してください。このステップ以降はキャッシュを使用できなくなります。

Dockerイメージのビルド

Dockerfileでコマンドラインを開く

イメージをビルドします。

ミラーを見る

Docker イメージ

Dockerコンテナを起動する

docker run -d --name mycontainer -p 80:80 myimage

コンテナを表示

ドッカーps

127.0.0.1/にアクセス

127.0.0.1/docs にアクセスしてください

Gunicorn を使用した公式 Docker イメージ - Uvicorn

  • このイメージには、利用可能なCPUコアに基づいてワーカープロセスの数を設定する自動調整メカニズムが含まれています。
  • 適切なデフォルト設定がありますが、環境変数や設定ファイルを使用してすべての設定を更新できます。
  • このイメージ上のプロセスの数は、利用可能なCPUコアに基づいて自動的に計算され、CPUから可能な限り多くのパフォーマンスを引き出そうとします。
  • しかし、これはまた、プロセスの数はコンテナが稼働しているCPUに依存するため、消費されるメモリの量もこれに依存することを意味します。
  • したがって、アプリケーションが大量のメモリを消費し (たとえば、機械学習モデルを使用している場合)、サーバーの CPU コアは多数あるがメモリが少ない場合、コンテナーは使用可能なメモリよりも多くのメモリを使用することになり、パフォーマンスが大幅に低下する (またはクラッシュする) 可能性があります。

公式栗

tiangolo/uvicorn-gunicorn-fastapi:python3.9 から
コピー ./requirements.txt /app/requirements.txt
pip install --no-cache-dir --upgrade -r /app/requirements.txt を実行します。
コピー ./app /app

アプリケーションシナリオ

  1. Kubernetes を使用しており、クラスターレベルのレプリケーションを設定している場合は、このイメージを使用せず、最初からイメージを構築することをお勧めします。
  2. アプリケーションがシンプルで、CPU に基づいてデフォルトのプロセス数を設定するだけで十分な場合は、クラスタ レベルでレプリケーションを手動で構成する必要はなく、アプリケーションで複数のコンテナを実行する必要もありません。
  3. または、Docker Compose を使用してデプロイし、単一のサーバー上で実行する場合など。

詩のDockerイメージを使用する

# ステージ 1: Poetry をインストールし、Poetry の pyproject.toml ファイルからプロジェクトの依存関係を含む requirements.txt を生成するためにのみ使用されます。
tiangolo/uvicorn-gunicorn:python3.9 から requirements-stage として

# /tmp を現在の作業ディレクトリとして設定します。ここで requirements.txt ファイルが生成されます。WORKDIR /tmp

# 詩をインストールする
pip install poetry を実行します。

# ./pyproject.toml ./poetry.lock* /tmp/ をコピーします

# requirements.txt を生成する
poetry export -f requirements.txt --output requirements.txt --without-hashes を実行します。

# これは最終段階です。これ以降の内容は最終的なコンテナイメージに残ります。 FROM python:3.9

# 現在の作業ディレクトリを /code に設定する
WORKDIR /コード

# requirements.txt をコピーします。このファイルは前の Docker ステージにのみ存在するため、--from-requirements-stage を使用してコピーします。COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt

# コマンド RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt を実行します。

# コピー ./app /code/app

# サービス CMD を実行 ["uvicorn", "app.1_Quick Start:app", "--host", "0.0.0.0", "--port", "80"]
  • 最初のステージの Docker は Dockerfile の一部です。これは、後のステージで使用するいくつかのファイルを生成するためだけに使われる一時的なコンテナ イメージです。
  • Poetryを使用する場合、Dockerマルチステージビルドを使用するのが理にかなっています
  • 最終的なコンテナ イメージに Poetry とその依存関係を実際にインストールする必要はないため、プロジェクトの依存関係をインストールするために必要なのは、生成された requirements.txt ファイルだけです。

詩の詳細なチュートリアル

https://www.jb51.net/article/195070.htm

Docker にデプロイされた FastAPI に関するこの記事はこれで終わりです。Docker にデプロイされた FastAPI に関するその他の関連コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Docker で onlyoffice をインストールして展開する詳細なプロセス
  • Docker で Confluence をデプロイする
  • docker を使用して Spring Boot をデプロイし、Skywalking に接続する方法

<<:  IE 環境での css-vars-ponyfill の使用に関する詳細な説明 (nextjs ビルド)

>>:  HTML ではスペースはどのように表現されますか (どのような意味ですか)?

推薦する

Linux は、ディレクトリが存在するかどうかを判断するために if を使用します。

Linux で if を使用してディレクトリが存在するかどうかを判断する方法方法は次のとおりです。...

MySQL データベースのインデックスとトランザクション

目次1. 索引1.1 コンセプト1.2 機能1.3 索引作成の原則1.3.1 ディスクアクセス回数を...

グリーンスタイルのウェブデザイン作品18点の最新コレクション

トイ・ストーリー3 オンラインマーケティングウェブサイトゼンモバイル鉄から鉄へスプラウトファンドバー...

JS での Reduce Fold Unfold の使用法の詳細な説明

目次折りたたむ(減らす) for...of の使用whileループの使用折り畳み実装に近い展開する配...

React で遅延読み込みを使用して最初の画面の読み込み時間を短縮する方法

目次使用インストールルーティングでどのように使用しますか?読み込み速度の比較最近、中間およびバックエ...

Vue+SSMは画像アップロードのプレビュー効果を実現します

現在の要件は、ファイルのアップロード ボタンがあることです。ボタンをクリックすると、アップロードする...

Vueはログインジャンプを実装する

この記事では、ログインジャンプを実装するためのVueの具体的なコードを例として紹介します。具体的な内...

入力タイプの制限(複数の方法)

1. 入力・貼り付けできるのは中国語のみ<input onkeyup="value=...

この記事では、Viteがブラウザのリクエストに対して何を行うかを説明します。

目次動作原理:ブラウザは何をするのですか?ホストファイル index.htmlメイン.jsその他のベ...

MySQL インデックスが失敗するいくつかの状況の概要

1. インデックスはnull値を保存しないより正確に言うと、単一列インデックスには null 値は格...

MySQL ストレージ エンジン MyISAM と InnoDB の違いの概要

1. MySQLのデフォルトストレージエンジンの変更MySQL 5.1 より前のバージョンでは、デフ...

Win10 + Ubuntu20.04 LTS デュアルシステムブートインターフェースの美化

エフェクト表示組み込みのブートインターフェースがあまりにも醜いので、テーマをダウンロードして美しくし...

Centos7 で crontab + シェル スクリプトによる定期的な自動ファイル削除の問題を解決する

問題の説明:最近、rsyncで毎回同期するデータ量が多いが、データベースのbakファイルを保持する必...

HTML テーブルタグチュートリアル (35): 列間属性 COLSPAN

複雑なテーブル構造では、一部のセルが垂直方向に複数のセルにまたがるため、列間属性 COLSPAN を...

JavaScript配列の一般的なメソッドの概要

目次1. はじめに2. フィルター() 3. マップ() 4. ソート() 5. 減らす() 6. ...