やりたいこと
Dockerを活用し、SynologyのNAS上にPythonのフレームワーク「Streamlit」でデータのダッシュボードを実現したいが、最新かつ横断的な記事が見つからなかったので自分でやったことをまとめることにした。
使用機器・環境
-
DS220+
-
メモリ4GBを増設
- DS220+の仕様上最大の6GBまで拡張。※資金に余裕があるなら増設を強く推奨。
- DSM 7.2-64570 Update 1
- DSM = SynologyのNASの管理システム
- Container Manager
- DSMのパッケージセンターからダウンロード可能。Synologyのナレッジセンターによれば、Synology用にに最適化されたDockerと理解すれば良いようだ。
-
メモリ4GBを増設
- PC
- Windows 11 Home (Core i7-10870H / 16GB)
- Docker Desktop
- Visual Studio Code(以下VSC)
大まかな手順
- 環境構築 (使用機器・環境参照、以降では説明省略)
- Dockerfileの作成
- Dockerイメージのビルド
- Dockerイメージのファイル出力
- DockerイメージをContainer Managerにインポート
- コンテナの作成と起動
Dockerfileの作成
Shanch blogさんの記事がシンプルでとても分かりやすい。これをベースに、最新のStreamlit公式の情報を反映させた手順は以下の通り。
-
まず、VSCにて作業用のフォルダを開く。
- 作業用のフォルダはどこでも構わない。今回は「Streamlit」というフォルダをデスクトップに作成。
- フォルダを開く際に「信頼するか?」云々のメッセージが出たらYesでOK。
-
Streamlitの公式から以下のコードをコピペ。
FROM python:3.9-slim
WORKDIR /app
RUN apt-get update && apt-get install -y
build-essential
curl
software-properties-common
git
&& rm -rf /var/lib/apt/lists/*
RUN git clone https://github.com/streamlit/streamlit-example.git .
RUN pip3 install -r requirements.txt
EXPOSE 8501
HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
ENTRYPOINT ["streamlit", "run", "streamlit_app.py", "--server.port=8501", "--server.address=0.0.0.0"]
Dockerイメージのビルド
同じく、Shanch blogさんの記事を参考にする。
- VSCにて作成したDockerfileを右クリックし、Build Imageを選択。
- イメージ名が自動生成されるので、これで良ければEnterを押下。
- (参考1)ターミナルに処理の詳細が出力された様子。
- (参考2)Dockerのイメージとしてstreamlitが生成された様子。
- (参考3)イメージを起動して任意のブラウザで http://localhost:8501 にアクセスするとStreamlitのデモページが開く。
Dockerイメージのファイル出力
VSCのターミナルにて、
docker save -o streamlit.tar streamlit
と入力すると、生成したイメージをファイルとして出力することができる。出力先はコマンドを入力した際のカレントフォルダで、今回はVSCで開いていた作業フォルダ。最終的にstreamlit.tarというファイルが生成される。
DockerイメージをContainer Managerにインポート
以降はDS220+をDSM上で操作していく。
- Container Manager上にてイメージ⇒操作⇒インポート⇒ファイルから追加⇒ローカルデバイスからの順で選択し、ファイル選択画面にて上で生成したstreamlit.tarを選択すると読み込みが始まる。
- 1~2分で読み込みが終わり(通信環境等に依存する可能性有)、イメージ一覧の中にstreamlitが追加される。
コンテナの作成と起動
同じく、Container Manager上で作業を継続する。
- コンテナ⇒作成にて全般設定のウィンドウが開くので、イメージとしてstreamlit:latestを選択する。
- お好みのコンテナ名を入力して次へ。
- ポートの設定を行う。Streamlitのポート(プログラムを区別する番号みたいなものととらえれば良いか)は標準で8501だが、コンテナに任意のポートの番号を割り当てることができる。例えばここでは1234とすると、コンテナ内部では8501に変換してStreamlitにアクセスできる。なお、このウィンドウの下方にはその他にも設定項目があるが、デフォルトのままで次に進む。
- 特に問題が無ければ完了。コンテナが自動で起動する。
動作確認
任意のブラウザにて、DS220+のIPアドレス:ポート番号を入力すると、Streamlitのデモページが開く。例えばIPアドレスが123.456.789.012、ポートが1234の場合、http://123.456.789.012:1234と入力すればよい。
あとがき
細かい説明は省き、とにかくSynologyのNAS上でStreamlitをDockerコンテナで動かしたい、という目的に特化した内容となった。実際にどのようにカスタマイズしていくかは別途記事化していきたい。