サイトアイコン アマチュア無線局JS2IIU

【Streamlit】Dockerfile構成とデプロイコマンドまとめ

こんにちは、JS2IIUです。

Pythonで手軽にWebアプリケーションを作成できるフレームワークとして、StreamlitはもはやデータサイエンティストやAIエンジニアにとって必須のツールとなりました。手元のローカル環境でstreamlit run app.pyと叩くだけで、見栄えの良いダッシュボードが立ち上がる体験は感動的ですらあります。

しかし、開発が進むにつれて必ず直面する壁があります。「このアプリ、どうやって他の人に使ってもらおう?」というデプロイの問題です。

「自分のPCでは動くけれど、サーバーに置くとエラーが出る」「ライブラリのバージョンが合わない」といった環境依存のトラブルは、開発者の時間を奪う最大の敵です。そこで登場するのがDockerです。アプリケーションをコンテナ化してしまえば、どこでも同じ動作を保証できます。

今回は、Streamlitの公式ドキュメントで推奨されているベストプラクティスに基づき、AIアプリケーションをDocker化して起動するまでの完全な手順を解説します。今回は単なるHello Worldではなく、PyTorchを使用した機械学習アプリを想定し、より実践的な内容でお届けします。

1. なぜStreamlitアプリをDocker化するのか

具体的なコードに入る前に、なぜDockerを使うべきなのかを少しだけ整理しておきましょう。

Streamlitアプリをクラウド(AWS ECS, Google Cloud Run, Azureなど)にデプロイする場合、サーバー上でPython環境を一から構築するのは非効率です。Dockerを使えば、OS、Pythonのバージョン、ライブラリの依存関係をまるごと「イメージ」としてパッケージ化できます。

特にStreamlitの場合、ネットワーク設定(ポートやアドレス)が正しく設定されていないと、コンテナ起動後に「画面が表示されない」というトラブルに陥りやすい傾向があります。公式ドキュメントが推奨する構成を守ることで、これらの落とし穴を確実に回避できます。

2. アプリケーションの準備(PyTorchサンプル)

まずは、コンテナ化するためのアプリケーションを用意しましょう。今回は、テックブログ読者の皆様向けに、PyTorchを使って簡単なテンソル計算を行うアプリを作成します。

プロジェクト用のディレクトリを作成し、以下のファイルを配置してください。

2.1 ソースコード (streamlit_app.py)

これは、ユーザーが入力したサイズのランダムなテンソルを行列積(Matmul)で計算し、結果を表示するシンプルなアプリです。PyTorchが正しく動作しているかの確認にもなります。

Python
import streamlit as st
import torch
import numpy as np

# ページの基本設定
st.set_page_config(page_title="PyTorch Matrix Multiplier", page_icon="🧮")

st.title("PyTorch Docker Demo")
st.write("Dockerコンテナ上でPyTorchが動作していることを確認するデモアプリです。")

# サイドバーでの設定
st.sidebar.header("設定")
matrix_size = st.sidebar.slider("行列のサイズ (N x N)", min_value=10, max_value=1000, value=100, step=10)

if st.button("計算実行"):
    try:
        # デバイスの確認(GPUが使える環境ならcuda、なければcpu)
        device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
        st.info(f"使用デバイス: {device}")

        # ランダムなテンソルの生成
        st.write(f"{matrix_size} x {matrix_size} のランダム行列を2つ生成中...")
        tensor_a = torch.randn(matrix_size, matrix_size, device=device)
        tensor_b = torch.randn(matrix_size, matrix_size, device=device)

        # 行列積の計算
        result = torch.matmul(tensor_a, tensor_b)

        st.success("計算完了!")

        # 結果の一部を表示
        st.write("結果の行列(先頭 5x5):")
        st.dataframe(result[:5, :5].cpu().numpy())

        # テンソルの形状確認
        st.text(f"Result Tensor Shape: {result.shape}")

    except Exception as e:
        st.error(f"エラーが発生しました: {e}")

2.2 依存関係ファイル (requirements.txt)

次に、必要なライブラリを記述します。Dockerビルド時にこのファイルを読み込んでインストールを行います。

Python
streamlit
torch
numpy

※ 本番環境では streamlit==1.50.0 のようにバージョンを固定することを強く推奨しますが、今回は簡略化しています。また、PyTorchのDockerイメージはサイズが大きくなりがちなので、CPU版を指定する場合がありますが、ここでは標準的な指定とします。

3. 【解説】Streamlit公式推奨のDockerfile

ここが今回の記事の核心部分です。プロジェクトディレクトリに Dockerfile(拡張子なし)という名前でファイルを作成し、以下の内容を記述してください。

この構成はStreamlit公式チュートリアルに基づき、セキュリティや安定性を考慮した設定が含まれています。

Dockerfile
# 1. ベースイメージの指定
# Python 3.9の軽量版(slim)を使用します
FROM python:3.9-slim

# 2. 作業ディレクトリの設定
# コンテナ内の作業場所を /app に定めます
WORKDIR /app

# 3. 必要なツールのインストール
# ヘルスチェックのために curl をインストールします
# apt-getリストを削除してイメージサイズを削減するお作法も含めています
RUN apt-get update && apt-get install -y \
    build-essential \
    curl \
    software-properties-common \
    git \
    && rm -rf /var/lib/apt/lists/*

# 4. ファイルのコピー
# まずソースコードを現在のディレクトリからコンテナ内の /app にコピーします
COPY . .

# 5. ライブラリのインストール
# requirements.txt に記載されたパッケージをインストールします
RUN pip3 install -r requirements.txt

# 6. ポートの公開
# Streamlitのデフォルトポートである8501を明示します
EXPOSE 8501

# 7. ヘルスチェックの設定
# コンテナが正しく動作しているか定期的にチェックするコマンドです
# 失敗するとコンテナの状態が unhealthy になります
HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health

# 8. 起動コマンド(ENTRYPOINT)
# Streamlitアプリを起動します
# アドレス設定(0.0.0.0)が非常に重要です
ENTRYPOINT ["streamlit", "run", "streamlit_app.py", "--server.port=8501", "--server.address=0.0.0.0"]

コードの詳細解説

ここで特に気をつけるべきポイントを3つピックアップして解説します。

ポイント1:HEALTHCHECK の記述

Dockerfile
HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health

これは「コンテナが生きているか」をDockerエンジンに伝えるための設定です。Streamlitにはヘルスチェック用のエンドポイント _stcore/health が用意されています。クラウド環境(AWS ECSなど)にデプロイした際、ロードバランサーがこのチェックを使って「コンテナへの通信を許可してよいか」を判断するため、実運用ではほぼ必須の設定です。

ポイント2:--server.address=0.0.0.0

Dockerfile
ENTRYPOINT ["streamlit", ..., "--server.address=0.0.0.0"]

ここが最大のハマりポイントです。デフォルトではStreamlitは localhost(自分自身)からのアクセスのみを受け付けます。しかし、Dockerコンテナはホストマシンから見ると「外部」の存在です。
0.0.0.0 を指定することで、コンテナ外部(あなたのPCのブラウザやインターネット)からのアクセスを許可する設定になります。これを忘れると、コンテナは起動しているのにブラウザで接続できないという現象が起きます。

ポイント3:軽量イメージ python:3.9-slim

AI系のライブラリはサイズが大きいため、ベースとなるOSイメージはできるだけ軽いものを選ぶのが定石です。slim 版はDebianベースの必要最小限の構成になっており、フルバージョンのPythonイメージよりも大幅に容量を節約できます。

4. ビルドと実行コマンド

ファイルの準備ができたら、実際に動かしてみましょう。ターミナル(WindowsならPowerShellやコマンドプロンプト)を開き、ファイルがあるディレクトリに移動してコマンドを実行します。

4.1 イメージのビルド

まずは Dockerfile をもとに、Dockerイメージを作成(ビルド)します。

Bash
docker build -t my-pytorch-app .

PyTorchのインストールが含まれるため、通信環境によっては数分かかる場合があります。コーヒーでも飲みながら待ちましょう。

4.2 コンテナの起動

ビルドが完了したら、以下のコマンドでコンテナを起動します。

Bash
docker run -p 8501:8501 my-pytorch-app

4.3 動作確認

ブラウザを開き、以下のアドレスにアクセスしてください。

http://localhost:8501

先ほど作成したPyTorchの計算アプリが表示されれば成功です!スライダーを動かして「計算実行」ボタンを押し、行列計算が行われることを確認してください。

5. 応用:知っておくと便利なこと

ここまでの手順で基本はバッチリですが、中級者としてステップアップするための知識を補足します。

キャッシュ対策

何度もビルドを繰り返すと、pip install の実行時間が気になることがあります。その場合、Dockerfileの COPY . . の記述位置を工夫します。

変更前:

Bash
COPY . .
RUN pip3 install -r requirements.txt

変更後:

Bash
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY . .

こうすることで、ソースコード(.pyファイル)だけを変更した際は、重い pip install の工程がDockerのキャッシュ機能によってスキップされ、ビルドが一瞬で終わるようになります。これは開発効率を劇的に向上させるテクニックです。

GPUの利用

今回の例ではPyTorchをCPUで動かしていますが、もしNVIDIA GPU搭載のマシンでDocker上のPyTorchをGPU駆動させたい場合は、以下の変更が必要です。

  1. NVIDIA Container Toolkit をホストマシンにインストールする。
  2. docker run コマンドに --gpus all オプションを追加する。
    bash docker run --gpus all -p 8501:8501 my-pytorch-app

これでコンテナ内からGPUリソースが見えるようになります。

6. まとめ

今回は、StreamlitアプリケーションをDocker化するための公式推奨手順と、PyTorchアプリを用いた実践的なデプロイ方法を解説しました。

重要なポイントをおさらいします。

  1. 構成ファイル: streamlit_app.py, requirements.txt, Dockerfile の3つが基本セット。
  2. Dockerfileの肝: HEALTHCHECK による状態監視と、ENTRYPOINT での起動オプション指定。
  3. ネットワーク: 外部から接続するために --server.address=0.0.0.0 が必須。
  4. ポート接続: 実行時に -p 8501:8501 でコンテナとホストを繋ぐ。

Dockerによるパッケージ化ができれば、あとはこのイメージをGoogle Cloud RunやAWS Fargateなどのコンテナ実行サービスにアップロードするだけで、世界中にあなたのAIアプリを公開できます。「自分のPCでしか動かない」状態から脱却し、より多くの人にあなたの技術を届けてみてください。

最後まで読んでいただきありがとうございました。

モバイルバージョンを終了