Docker コンテナで Python アプリケーションを実行する方法

DockerBeginner
オンラインで実践に進む

はじめに

Docker は、ソフトウェア開発の世界で革命を起こしています。開発者は、アプリケーションとその依存関係を、ポータブルで自己完結的な単位であるコンテナにパッケージ化できます。このチュートリアルでは、Docker コンテナ内で Python アプリケーションを実行する方法を、Docker の理解からコンテナ化されたアプリケーションのデプロイまで、必須のステップを踏んで解説します。

Docker の理解

Docker とは何か?

Docker は、開発者がコンテナ化された環境でアプリケーションを構築、デプロイ、実行するためのオープンソースプラットフォームです。コンテナは、アプリケーションを実行するために必要なコード、ランタイム、システムツール、ライブラリなど、すべてを含んだ軽量で独立した実行可能なソフトウェアパッケージです。Docker はこれらのコンテナをパッケージ化および配布する方法を提供し、さまざまな環境間でのアプリケーションのデプロイと管理を容易にします。

Docker の利点

  1. 一貫性: Docker コンテナは、基盤となるインフラストラクチャに関係なく、アプリケーションが同じ方法で実行されることを保証します。
  2. スケーラビリティ: Docker は、コンテナを追加または削除することで、必要に応じてアプリケーションをスケールアップまたはスケールダウンすることを容易にします。
  3. 効率性: Docker コンテナは軽量であり、従来の仮想マシンよりも少ないリソースを使用するため、コンピューティングリソースをより効率的に使用できます。
  4. 移植性: Docker コンテナは、開発、テスト、本番環境など、さまざまな環境間で簡単に移動できます。複雑な設定変更は必要ありません。

Docker アーキテクチャ

Docker アーキテクチャは、クライアント - サーバーモデルに基づいています。Docker クライアントは、Docker デーモンと通信します。Docker デーモンは、Docker コンテナの構築、実行、管理を担当します。Docker アーキテクチャの主要なコンポーネントは次のとおりです。

graph LR A[Docker クライアント] -- 通信 --> B[Docker デーモン] B -- 管理 --> C[Docker イメージ] B -- 管理 --> D[Docker コンテナ] B -- 管理 --> E[Docker ボリューム] B -- 管理 --> F[Docker ネットワーク]

Docker の開始

Docker を開始するには、システムに Docker エンジンをインストールする必要があります。Docker は公式 Docker ウェブサイト (https://www.docker.com/get-started) からダウンロードしてインストールできます。インストール後、docker コマンドラインインターフェース (CLI) を使用して Docker デーモンと対話し、コンテナを管理できます。

Docker を使用してシンプルな "Hello, World!" コンテナを実行する方法の例を次に示します。

$ docker run hello-world

このコマンドは、Docker Hub レジストリから hello-world イメージをプルし、新しいコンテナを作成し、コンテナ内でアプリケーションを実行します。

Python アプリケーションのコンテナ化

Python アプリケーションの Docker イメージの構築

Docker を使用して Python アプリケーションをコンテナ化するには、Docker イメージを作成する必要があります。Docker イメージは、アプリケーションを実行するために必要なコード、ランタイム、システムツール、ライブラリなど、すべてを含んだ軽量で独立した実行可能なパッケージです。

シンプルな Python アプリケーションの Docker イメージを作成する方法の例を次に示します。

  1. プロジェクト用の新しいディレクトリを作成し、ターミナルでそのディレクトリに移動します。

  2. app.py という新しいファイルを作成し、以下の Python コードを追加します。

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello():
        return 'Hello, LabEx!'
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5000)
  3. Dockerfile という新しいファイルを作成し、以下の内容を追加します。

    FROM python:3.9-slim
    WORKDIR /app
    COPY . /app
    RUN pip install --no-cache-dir -r requirements.txt
    CMD ["python", "app.py"]

    この Dockerfile は、Python アプリケーションの Docker イメージを構築するための手順を定義しています。python:3.9-slim ベースイメージから開始し、作業ディレクトリを /app に設定し、アプリケーションファイルのコピー、必要な依存関係のインストール、app.py スクリプトの実行を行います。

  4. requirements.txt という新しいファイルを作成し、以下の依存関係を追加します。

    flask
  5. 以下のコマンドを使用して Docker イメージを構築します。

    $ docker build -t my-python-app .

    このコマンドは、タグ my-python-app を持つ Docker イメージを構築します。

Docker コンテナでの Python アプリケーションの実行

Docker イメージができたら、以下のコマンドを使用して Docker コンテナで Python アプリケーションを実行できます。

$ docker run -p 5000:5000 my-python-app

このコマンドは、my-python-app コンテナを実行し、コンテナのポート 5000 をホストのポート 5000 にマッピングします。

これで、ウェブブラウザを開き、http://localhost:5000 にアクセスすることで Python アプリケーションにアクセスできます。「Hello, LabEx!」というメッセージが表示されるはずです。

Docker コンテナのデプロイ

Docker イメージのレジストリへのプッシュ

Docker コンテナをデプロイするには、まず Docker イメージを Docker Hub やプライベートレジストリなどのレジストリにプッシュする必要があります。これにより、他の環境にアプリケーションを共有および配布できます。

my-python-app イメージを Docker Hub にプッシュする方法を次に示します。

  1. Docker Hub アカウント (まだ作成していない場合) を https://hub.docker.com で作成します。

  2. docker login コマンドを使用して Docker Hub にログインします。

    $ docker login

    プロンプトが表示されたら、Docker Hub のユーザー名とパスワードを入力します。

  3. ローカルの my-python-app イメージに、Docker Hub のユーザー名とタグ (例:latest) を付けてタグ付けします。

    $ docker tag my-python-app username/my-python-app:latest
  4. タグ付けされたイメージを Docker Hub にプッシュします。

    $ docker push username/my-python-app:latest

これで、Docker イメージは Docker Hub レジストリで使用可能になり、他のシステムでプルしてデプロイできます。

Docker コンテナのデプロイ

本番環境で Docker コンテナをデプロイするには、Kubernetes や Docker Swarm などのコンテナオーケストレーションプラットフォームを使用できます。これらのプラットフォームは、スケーリング、ロードバランシング、コンテナのライフサイクル管理などの機能を提供します。

my-python-app コンテナを Docker Swarm を使用してデプロイする方法の例を次に示します。

  1. Docker Swarm クラスタを初期化します。

    $ docker swarm init
  2. my-python-app コンテナの新しいサービスを作成します。

    $ docker service create --name my-python-app -p 5000:5000 username/my-python-app:latest

    このコマンドは、my-python-app という名前の新しいサービスを作成し、username/my-python-app:latest イメージを実行します。コンテナのポート 5000 をホストのポート 5000 にマッピングします。

  3. サービスを複数のレプリカにスケールアップします。

    $ docker service scale my-python-app=3

    このコマンドは、my-python-app サービスを 3 つのレプリカにスケールアップします。これにより、アプリケーションの高可用性とロードバランシングが実現します。

  4. サービスの状態を監視します。

    $ docker service ls
    $ docker service logs my-python-app

    これらのコマンドは、my-python-app サービスの状態を表示し、ログを検査できます。

Docker Swarm などのコンテナオーケストレーションプラットフォームを使用することで、本番環境で Docker コンテナを簡単に管理、スケール、デプロイできます。

まとめ

このチュートリアルを終了するまでに、Docker と Python アプリケーションのコンテナ化に関する確かな理解を得ているはずです。Docker イメージの構築方法、コンテナの実行方法、一貫性、信頼性、スケーラビリティを備えたアプリケーションのデプロイ方法を学習します。Python 開発における Docker の習得により、ワークフローが効率化され、アプリケーションの移植性と管理性が向上します。