DockerでStreamlitのwebアプリを動かす
はじめに
この記事では、Streamlitで作成したwebアプリをDockerでコンテナを立てて動かすことを目標とします。
尚、この記事は身内向けのチュートリアルなので若干いい加減に書いていますが、ご容赦ください。
Dockerとは
Dockerは、コンテナ仮想化という技術を用いてアプリを開発・実行することが出来るプラットフォームです。開発したアプリをDockerを使ってコンテナ化すれば、別の環境でも同じように動作させることができます。
Dockerは2013年にDocker社から登場し、今ではVirtualBoxなどの仮想マシンなどに取って変わる仮想環境として世界中で利用されています。
Dockerでは、以下の画像の流れで仮想環境(コンテナ)を作ります。細かい内容については後述します。
https://www.kagoya.jp/howto/cloud/container/dockerimage/ より引用
Dockerを使うことで何が嬉しいのか
Dockerを使うことで
「自分の環境では動くけど、他の人の環境では動かない」
という問題を解消することが出来ます。現場でのチーム開発において、Dockerのスキルは必須と言えるでしょう。
Streamlit
Streamlitとは、PythonだけでWebアプリを作成出来るフレームワークです。
Streamlitには、データの可視化やデータ処理、機械学習モデルの開発などの機能があるので、Pythonで作った機械学習モデルやデータ分析プログラムなどをwebアプリ化したい場合などに使えます。
一方で高度なweb開発には向いてません。手軽にwebアプリを開発したい場合にオススメです。
Dockerのインストール
まずはDockerをインストールします。以下の手順に従ってください。
- Docker Desktopのインストーラを公式サイトからダウンロードします。
- インストーラからファイルを実行し、Docker Desktopをインストールします。
- インストールが完了したら、Docker Desktopを起動します。
- タスクトレイにDockerアイコンが表示されたら、インストールが完了です。
プロジェクトのクローン
Streamlitのwebアプリのリポジトリをクローン(ダウンロード)します。
今回は以下のプロジェクトを基にDocker環境を作っていきます。
コマンドラインで以下のコマンドを実行することで、リポジトリをクローンすることが出来ます。
git clone https://github.com/Jtwulf/stem_player
こうすることで、stem_player
というディレクトリがクローンされたことが確認出来ると思います。
Dockerfile
ここからは実際にDockerを触っていきます。
Dockerfileとは
まず、Dockerでコンテナを作成するにあたり、Dockerfile
というファイルを書く必要があります。Dockerfile
とは、Dockerイメージに含まれるパッケージやファイル、ポートの開放、環境変数などの設定を指定することが出来るファイルです。
要するに、コンテナの設計図のようなものです。このファイルの内容に従ってコンテナが作られます。
Dockerfileの記述
stem_player
ディレクトリ内で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について更に学びたい場合は、下の本がおすすめです。
参考文献
Discussion