- TODOアプリを爆速で作りたい!
- できれば学習に時間はかけたくない…
- Djangoなどのフレームワークにこだわらない
このような方に向けて書きました。
この記事では、以下の2パターンでTODOアプリを作ります。
シナリオ | ゴール | 所要時間 |
---|---|---|
ローカル環境だけで動かす | run コマンドですぐ確認 | 5 〜 10 分 |
Docker 化して動かす | どこでも “同じ環境” を再現 | 10 〜 15 分 |
今回の開発は、以下の前提のもと行いました。
- OS: macOS
- Python 3.12 インストール済み(Docker版は不要)
普通に作る
仮想環境を作って、その上にStreamlitアプリを構築する一般的な方法をご紹介します。
Pythonは「Download Python」からダウンロードして、インストールを済ませておきましょう。
プロジェクトを作成する
streamlit-todo-app
フォルダを作って、そこで開発を進めましょう。

必要なファイル群を用意する
先ほど作ったstreamlit-todo-app
フォルダの中に、以下のファイルを用意しましょう。
- requirements.txt
- main.py
ファイルの内容は、この後に解説します。
requirements.txt
今回必要なライブラリ群は、requirements.txt
に記載します。
streamlit=1.45
pandas=2.3
matplotlib=3.10
watchdog=6.0
上記のようにバージョンもある程度固定しておくと、バージョンアップで動かなくなってしまうこともなくなります。
main.py
main.py
には、Streamlitアプリのメイン部分を書いていきます。
from datetime import datetime
import streamlit as st
# ページ設定
st.set_page_config(page_title="My TODO", page_icon="✅")
st.title("📋 シンプル TODO アプリ")
# セッションステート初期化
if "todos" not in st.session_state:
st.session_state.todos = []
# 入力フォーム
with st.form("add_todo", clear_on_submit=True):
new_task = st.text_input("やることを追加")
submitted = st.form_submit_button("追加")
if submitted and new_task:
st.session_state.todos.append(
{"task": new_task, "done": False, "ts": datetime.now()}
)
st.rerun()
# 未完了タスク
st.subheader("🔸 未完了タスク")
for idx, item in enumerate(st.session_state.todos):
if item["done"]:
continue
col1, col2 = st.columns([0.8, 0.2])
col1.write(f"- {item['task']}")
if col2.button("完了", key=f"done_{idx}"):
st.session_state.todos[idx]["done"] = True
st.rerun() # 1クリックでリストから消える
# 完了タスク
st.subheader("✅ 完了タスク")
for item in st.session_state.todos:
if item["done"]:
ts = item["ts"].strftime("%Y-%m-%d %H:%M")
st.write(f"- ~~{item['task']}~~ _({ts})_")
この段階ではまだStreamlitがインストールされていないので、import streamlit as st
のところには黄色いニョロニョロが出ているはずです。

この後のライブラリインストールで解消されるので、いったんは無視していきましょう。
仮想環境を構築する
まずは仮想環境を構築します。
python -m venv venv
これにより、現在のフォルダ直下にvenv
というフォルダが作られます。
続いて、作成した仮想環境に入りましょう。
source venv/bin/activate
venv
なしでpip install
コマンドは実行すると、OSの環境にライブラリがインストールされて複数バージョン管理が難しくなります。
venv
を作ると、このプロジェクト専用の領域を作ってそこにライブラリのインストールができるようになるわけです。
コマンドが成功すると、先頭に(venv)
の文字が表示されます。

続いて、先ほど作成したrequirements.txtに記載したライブラリをインストールしましょう。
以下のコマンドを実行します。
pip install -r requirements.txt
これでstreamlit
などのライブラリが仮想環境にインストールできました。
動作確認を行う
以下のコマンドを実行して、動作確認を行いましょう。
streamlit run main.py
次のような画面がブラウザで表示できていれば完成です。

作成したアプリをインターネット上に一般公開する方法
作成したTODOアプリは、インターネット上に公開することもできます。
方法については、「Streamlitで作成したTODOアプリを一般公開する方法」を参照してください。
Dockerを使った方法
手元のマシン上に直接アプリを構築するのではなく、新しく構築したDockerコンテナの中で実行する方法を解説します。
今回はPythonのインストールが不要な代わりに、「Docker Desktop」をダウンロードして、インストールしておいてください。
必要なファイル群を用意する
Dockerを使う方法では、少しファイル数が増えます。
- requirements.txt
- main.py
- Dockerfile
- .dockerignore
それぞれのファイルの内容を解説します。
requirements.txt
必要なライブラリを記載することは、普通にアプリを作る方法と同じです。
streamlit=1.45
pandas=2.3
matplotlib=3.10
watchdog=6.0
main.py
main.py
も、普通に作る方法とまったく同じでOKです。
from datetime import datetime
import streamlit as st
# ページ設定
st.set_page_config(page_title="My TODO", page_icon="✅")
st.title("📋 シンプル TODO アプリ")
# セッションステート初期化
if "todos" not in st.session_state:
st.session_state.todos = []
# 入力フォーム
with st.form("add_todo", clear_on_submit=True):
new_task = st.text_input("やることを追加")
submitted = st.form_submit_button("追加")
if submitted and new_task:
st.session_state.todos.append(
{"task": new_task, "done": False, "ts": datetime.now()}
)
st.rerun()
# 未完了タスク
st.subheader("🔸 未完了タスク")
for idx, item in enumerate(st.session_state.todos):
if item["done"]:
continue
col1, col2 = st.columns([0.8, 0.2])
col1.write(f"- {item['task']}")
if col2.button("完了", key=f"done_{idx}"):
st.session_state.todos[idx]["done"] = True
st.rerun() # 1クリックでリストから消える
# 完了タスク
st.subheader("✅ 完了タスク")
for item in st.session_state.todos:
if item["done"]:
ts = item["ts"].strftime("%Y-%m-%d %H:%M")
st.write(f"- ~~{item['task']}~~ _({ts})_")
Dockerfile
Dockerイメージを定義していきます。
# ベースイメージ
FROM python:3.12-slim AS base
# パッケージのインストール
RUN apt-get update && apt-get install -y \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# 作業ディレクトリ
WORKDIR /app
# ライブラリのインストール
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# アプリコピー
COPY . .
# ネットワーク公開
EXPOSE 8501
# 実行コマンド
CMD ["streamlit", "run", "main.py", "--server.port", "8501", "--server.address", "0.0.0.0"]
ファイル内に定義されている処理の流れは、大きく次のとおりです。
- Python 3.12のイメージを作成
- OSのパッケージのインストール
- ライブラリをインストール
- アプリをコンテナにコピー
- アプリ起動
このスクリプトが最後まで実行されると、streamlit run main.py
が実行された状態になります。
ただ、この段階では指示書に当たるものができただけに過ぎません。実際にアプリを動かすには、この後の「Dockerコンテナのビルド & 実行」のコマンドが必要です。
.dockerignore
.dockerignore
ファイルは、Dockerイメージに含めたくないファイル群を定義しておく除外リストです。
*.pyc
__pycache__/
venv/
.venv/
.git/
上記のように、不要なファイル群は.dockerignore
に放り込んでしまいましょう。
Dockerコンテナのビルド & 実行
まずはDockerイメージをビルドして、コンテナを作りましょう。
docker build -t todo-app .
作成したコンテナを実行するには、次のコマンドを実行します。
docker run --rm -p 8501:8501 todo-app
動作確認を行う
ブラウザでhttp://localhost:8501
を開きましょう。
以下の画面が表示されれば、無事にDocker上でStreamlitアプリが実行されています。

作成したアプリをインターネット上に一般公開する方法
作成したTODOアプリは、インターネット上に公開することもできます。
今回はDockerで構築しているので、普通に構築した場合とちょっとだけ手順が異なります。
方法は後日、「(準備中)StreamlitとDockerで作成したTODOアプリを一般公開する方法」としてアップ予定です。
まとめ
Streamlitアプリを「普通に作る方法」と「Dockerで作る方法」の2パターンで解説しました。
デスクトップで動作させるだけであれば、驚くほど簡単に実行できることがお分かりいただけたと思います。
でもStreamlitは、Webに一般公開するところまでやって本領発揮といえます。
ここまで構築して見た方は、ぜひ次回のVPSでの構築手順をお試しください!
- Streamlitで作成したTODOアプリを一般公開する方法
- (準備中)StreamlitとDockerで作成したTODOアプリを一般公開する方法
コメント