🎧

DockerでStreamlitのwebアプリを動かす

2023/05/10に公開

はじめに

この記事では、Streamlitで作成したwebアプリをDockerでコンテナを立てて動かすことを目標とします。

尚、この記事は身内向けのチュートリアルなので若干いい加減に書いていますが、ご容赦ください。

Dockerとは

Dockerは、コンテナ仮想化という技術を用いてアプリを開発・実行することが出来るプラットフォームです。開発したアプリをDockerを使ってコンテナ化すれば、別の環境でも同じように動作させることができます。

Dockerは2013年にDocker社から登場し、今ではVirtualBoxなどの仮想マシンなどに取って変わる仮想環境として世界中で利用されています。

https://frontier.networld.co.jp/useful-container/virtualmachine-vs-container/#index_id0

Dockerでは、以下の画像の流れで仮想環境(コンテナ)を作ります。細かい内容については後述します。

https://www.kagoya.jp/howto/cloud/container/dockerimage/ より引用

Dockerを使うことで何が嬉しいのか

Dockerを使うことで

「自分の環境では動くけど、他の人の環境では動かない」

という問題を解消することが出来ます。現場でのチーム開発において、Dockerのスキルは必須と言えるでしょう。

Streamlit

Streamlitとは、PythonだけでWebアプリを作成出来るフレームワークです。

Streamlitには、データの可視化やデータ処理、機械学習モデルの開発などの機能があるので、Pythonで作った機械学習モデルやデータ分析プログラムなどをwebアプリ化したい場合などに使えます。

一方で高度なweb開発には向いてません。手軽にwebアプリを開発したい場合にオススメです。

Dockerのインストール

まずはDockerをインストールします。以下の手順に従ってください。

  1. Docker Desktopのインストーラを公式サイトからダウンロードします。
  2. インストーラからファイルを実行し、Docker Desktopをインストールします。
  3. インストールが完了したら、Docker Desktopを起動します。
  4. タスクトレイにDockerアイコンが表示されたら、インストールが完了です。

プロジェクトのクローン

Streamlitのwebアプリのリポジトリをクローン(ダウンロード)します。

今回は以下のプロジェクトを基にDocker環境を作っていきます。

https://github.com/Jtwulf/stem_player

コマンドラインで以下のコマンドを実行することで、リポジトリをクローンすることが出来ます。

git clone https://github.com/Jtwulf/stem_player

こうすることで、stem_playerというディレクトリがクローンされたことが確認出来ると思います。

Dockerfile

ここからは実際にDockerを触っていきます。

Dockerfileとは

まず、Dockerでコンテナを作成するにあたり、Dockerfileというファイルを書く必要があります。Dockerfileとは、Dockerイメージに含まれるパッケージやファイル、ポートの開放、環境変数などの設定を指定することが出来るファイルです。
要するに、コンテナの設計図のようなものです。このファイルの内容に従ってコンテナが作られます。

Dockerfileの記述

stem_playerディレクトリ内でDockerfileを作成し,Dockerfileに以下のコードを書いてください。

Dockerfile
FROM python:3.7.12-slim-buster

WORKDIR /app

COPY requirements.txt .

RUN apt-get update && \
    apt-get -y upgrade && \
    apt-get install -y ffmpeg && \
    pip install -r requirements.txt

EXPOSE 8501

COPY . /app

ENTRYPOINT ["streamlit", "run"]

CMD ["main.py"]

各行について上から順に説明していきます。

FROM python:3.7.12-slim-buster

FROM命令は、ベースとなるDockerイメージを指定する命令です。StreamlitはPython3.9~3.7が推奨環境(だったはず)なので、ここではPython3.7.12をベースとするイメージを使用しています。また、イメージを軽量化する為に、-slim-busterを付けて余計なパッケージが削られた軽量版を選択しています。

WORKDIR /app

WORKDIR命令は、イメージ内で作業するディレクトリを指定する命令です。ここでは、/appディレクトリを作業ディレクトリに設定しています。あんま気にしなくていいです。

COPY requirements.txt .

COPY命令は、ローカルファイルシステムからファイルをコピーする命令です。ここでは、requirements.txtというファイルを、イメージ内のカレントディレクトリにコピーしています。最後の"."は、カレントディレクトリを表します。
requirements.txtとは、インストールしたいPythonのパッケージを記述したファイルです。この中に記述されているパッケージがコンテナに積まれることになります。

RUN apt-get update && \
    apt-get -y upgrade && \
    apt-get install -y ffmpeg && \
    pip install -r requirements.txt

RUN命令は、Dockerに実行してもらうコマンドを書きます。
3行目では、アプリ内で使用しているspleeterという音源分離ライブラリがffmpegというパッケージを必要とするので、ffmpegをインストールする命令を行っています。
4行目では、requirements.txtに記述されたパッケージを全てインストールする命令を行っています。

EXPOSE 8501

EXPOSE命令は、Dockerコンテナが外部に公開するポートを指定する命令です。ここでは、8501番ポートを公開するように指定しています。

COPY . /app

さっきと同じCOPY命令です。

ENTRYPOINT ["streamlit", "run"]
CMD ["main.py"]

ENTRYPOINT命令とCMD命令は、コンテナが起動した際に実行するコマンドを指定する命令です。
ここでは、ENTRYPOINTでStreamlitを起動するように指定し、CMDで実行するPythonファイルを指定しています。

Dockerのbuild

Dockerfileでコンテナの設計図を書き終えたので、次は設計書を基にDockerイメージを作成します。

Dockerfileからイメージのbuid

Dockerイメージを作成するにはdocker buildコマンドを使います。
コマンドラインで以下のコマンドを入力してください。

docker build -t stem_player:latest .

これでDockerイメージが作成されました。
作成したDockerイメージを確認するには、コマンドラインで以下のコマンドを入力します。

docker images

これでstem_playerという名前のイメージがあればOKです。

Dockerのrun

いよいよDockerイメージからコンテナを作成します。

Dockerイメージからコンテナの作成・起動

コンテナを作成するにはdocker runコマンドを使用します。
コマンドラインで以下のコマンドを入力してください。

docker run -p 8501:8501 stem_player:latest 

その後、http://localhost:8501/ にアクセスすると、以下の画像のようにwebアプリが起動します。

おわりに

Dockerイメージやコンテナは大きな容量を占める場合があるので、最後に下記コマンドでDockerのリソースを全て削除しておきましょう。

docker system prune --volumes

まとめ

今回はDockerのインストールからStreamlitアプリにおけるDockerコンテナの起動まで解説しました。チーム開発では、今回作成したコンテナを使うことで環境差が無く開発を進めることが出来ます。

Dockerについて更に学びたい場合は、下の本がおすすめです。

https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59

参考文献

https://docs.docker.jp/index.html

https://www.kagoya.jp/howto/cloud/container/dockerimage/

Discussion