注: この記事は元々、2023 年 11 月 4 日にここで公開されたものです。より多くの読者に読んでいただけるよう、ここに再公開されました。
最新化、サーバーレス プラットフォーム、統合された DevOps の実践に焦点を当てて、レガシー アプリをオンプレミスからクラウドに移行するプロセスを説明するシリーズの最初の記事へようこそ。
この記事では、アプリのコンテナ化に焦点を当てます。ただし、アプリを最初から構築する場合は、まったく問題ありません (実際、そのほうがよいでしょう)。この例では、この DigitalOcean ガイドを使用して、Python (Flask) とデータベースとして MongoDB を使用する単純な TODO アプリを構築します。見た目を良くするためにいくつかのカスタマイズを行いましたが、主なポイントは、今後の作業で必要になるため、NoSQL ドキュメントベースのデータベースを使用するものを構築することです。
独自にアプリを構築していない場合は、GitHub でアプリのリポジトリのクローンを作成できます。
アプリを構築したら、始めましょう!
これはコンテナ化するアプリケーション ディレクトリの構造であり、その後に Dockerfile が続きます。
. ├── app.py ├── LICENSE ├── README.md ├── requirements.txt ├── static │ └── style.css └── templates └── index.html
app.py ファイルは、Flask アプリ コードを含むメイン アプリケーション ファイルです。 requirements.txt ファイルには、アプリケーションに必要な Python 依存関係のリストが含まれています。 static/ ディレクトリには、CSS、JavaScript、画像などの静的ファイルが含まれています。 templates/ ディレクトリには、Flask アプリで使用される HTML テンプレートが含まれています。
# Use a minimal base image FROM python:3.9.7-slim-buster AS base # Create a non-root user RUN useradd -m -s /bin/bash flaskuser USER flaskuser # Set the working directory WORKDIR /app # Copy the requirements file and install dependencies COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # Add the directory containing the flask command to the PATH ENV PATH="/home/flaskuser/.local/bin:${PATH}" # Use a multi-stage build to minimize the size of the image FROM base AS final # Copy the app code COPY app.py . COPY templates templates/ COPY static static/ # Set environment variables ENV FLASK_APP=app.py ENV FLASK_ENV=production # Expose the port EXPOSE 5000 # Run the app CMD ["flask", "run", "--host=0.0.0.0"]
Dockerfile のウォークスルーと内訳は次のとおりです。
Dockerfile は、使用するベース イメージを指定する FROM 命令で始まります。この場合、それは python:3.9.7-slim-buster であり、Python 3.9.7 といくつかの重要なライブラリを含む最小限の基本イメージです。
次の命令では、RUN および useradd コマンドを使用して、flaskuser という名前の非 root ユーザーを作成します。これは、コンテナを root ユーザーとして実行しないようにするためのセキュリティのベスト プラクティスです。
WORKDIR 命令は、作業ディレクトリを /app に設定します。ここにアプリケーション コードがコピーされます。
COPY 命令は、requirements.txt ファイルをコンテナーの /app ディレクトリにコピーします。
RUN 命令は、pip を使用して、requirements.txt にリストされている依存関係をインストールします。 --no-cache-dir オプションは、ダウンロードされたパッケージのキャッシュを回避するために使用されます。これにより、イメージ サイズを小さく保つことができます。
ENV 命令は、flask コマンドを含むディレクトリを PATH 環境変数に追加します。これは、後で flask コマンドを実行するために必要です。
FROM 命令は、前に定義したベース イメージを使用して新しいビルド ステージを開始します。これは、最終イメージのサイズを最小限に抑えるのに役立つ複数段階のビルドです。
COPY 命令は、アプリケーション コード (app.py)、テンプレート (templates/)、および静的ファイル (static/) をコンテナーの /app ディレクトリにコピーします。
ENV 命令は FLASK_APP および FLASK_ENV 環境変数を設定します。 FLASK_APP はメイン アプリケーション ファイルの名前を指定し、FLASK_ENV は環境を運用環境に設定します。
EXPOSE 命令は、Flask で使用されるデフォルトのポートであるポート 5000 を公開します。
CMD 命令は、コンテナーの起動時に実行するコマンドを指定します。この場合、--host=0.0.0.0 オプションを指定して flask run コマンドを実行し、すべてのネットワーク インターフェイスにバインドします。
この Dockerfile を使用すると、アプリケーションをコンテナ化して実行できます。ただし、アプリには、実行中に作成または生成されたデータを保存するためのデータベースが必要であることに注意することが重要です。もちろん、MongoDB データベース イメージを個別に取得して、独立して実行することもできます。次に、アプリがデータベースにデータを正常に保存できるように、両側で調整を行って 2 つのコンテナー間の通信を確立します。このアプローチは機能しますが、時間がかかり、少し面倒になる可能性があります。プロセスを合理化するために、代わりに Docker Compose の使用を進めます。 Docker Compose では、すべてが YAML ファイルで宣言され、docker-compose up コマンドを使用することで、さまざまなサービスをシームレスに開始および操作できるため、時間と労力を節約できます。
これは、プロセスを合理化するために使用する基本的な Docker Compose YAML ファイルです。
version: '3.9' services: db: image: mongo:4.4.14 ports: - "27017:27017" volumes: - mongo-data:/data/db web: build: . container_name: "myflaskapp" ports: - "5000:5000" environment: - MONGO_URI=mongodb://db:27017 depends_on: - db volumes: mongo-data:
この Docker Compose YAML ファイルは、MongoDB データベース (db) と Web アプリケーション (web) の 2 つのサービスをセットアップするように構成されています。内訳は次のとおりです:
Version: 使用されている Docker Compose ファイル形式のバージョン (この場合は 3.9) を指定します。
サービス:
データベース (db):
Aplikasi Web (web):
Jilid:
Ringkasnya, fail Docker Compose ini mengatur penggunaan pangkalan data MongoDB dan aplikasi web Flask, memastikan ia boleh berkomunikasi dan berfungsi bersama dengan lancar.
Sekarang navigasi ke direktori dengan fail Docker Compose dan jalankan docker-compose untuk memulakan MongoDB dan apl web Flask. Akses apl di http://localhost:5000 untuk memastikan semuanya berfungsi seperti yang diharapkan.
Untuk berhenti, gunakan docker-compose down.
Semua baik? Seterusnya: memindahkan aliran kerja ke Kubernetes dalam artikel seterusnya.
以上がレガシーからクラウドサーバーレスへ - パート 1の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。