WSL2のDocker環境で、API本体とAPI呼び出し画面を同時に起動する方法
この記事では、Flaskをバックエンドとして使用し、Streamlitをフロントエンドとして使用するアプリケーションを、Docker Composeを使わずに、それぞれのコンテナを起動する方法を説明します。
1. ディレクトリ構成
以下のように各アプリケーションのDockerfileとソースコードを配置します。
/
|-- flask_api/
| |-- Dockerfile
| |-- app.py
| |-- requirements.txt
|-- streamlit_app/
|-- Dockerfile
|-- app.py
|-- requirements.txt
2. Flask側
Dockerfile (flask_api/Dockerfile):
# Pythonの公式イメージをベースに使用
FROM python:3.8-slim
# 作業ディレクトリを設定
WORKDIR /app
# 依存関係ファイルをコンテナにコピー
COPY requirements.txt .
# 依存関係をインストール
RUN pip install --no-cache-dir -r requirements.txt
# アプリケーションのソースコードをコンテナにコピー
COPY . .
# Flaskが外部からの接続を受け付けられるようにする
EXPOSE 5000
# コンテナが起動するときにFlaskアプリケーションを実行
CMD ["flask", "run", "--host=0.0.0.0"]
requirements.txt (flask_api/requirements.txt):
flask
app.py (flask_api/app.py):
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World! API呼び出しに成功しました!!'
if __name__ == '__main__':
app.run()
3. Streamlit側
Dockerfile (streamlit_app/Dockerfile):
# Pythonの公式イメージをベースに使用
FROM python:3.8-slim
# 作業ディレクトリを設定
WORKDIR /app
# 依存関係ファイルをコンテナにコピー
COPY requirements.txt .
# 依存関係をインストール
RUN pip install --no-cache-dir -r requirements.txt
# アプリケーションのソースコードをコンテナにコピー
COPY . .
# Streamlitが外部からの接続を受け付けられるようにする
EXPOSE 8501
# コンテナが起動するときにStreamlitアプリケーションを実行
CMD ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"]
requirements.txt (streamlit_app/requirements.txt):
streamlit
requests
app.py (streamlit_app/app.py):
import streamlit as st
import requests
st.title('Streamlit Frontend')
if st.button('API呼び出し'):
# 注意: localhostではなく、WSL2のIPアドレスを指定すること
response = requests.get('http://172.30.52.163:5000/')
st.write(response.text)
[補足] WSL2のIPアドレスは、以下のコマンドを実行すれば、 inet
の直後に記載されている(例:172.30.52.163)。
ip addr show eth0
4. Docker起動
-
Flaskアプリのビルドと実行:
cd flask_api docker build -t flask-api . docker run -d -p 5000:5000 flask-api
-
Streamlitアプリのビルドと実行:
cd streamlit_app docker build -t streamlit-app . docker run -p 8501:8501 streamlit-app
-
http://0.0.0.0:8501にアクセス
以下のような文字とボタンだけの画面が表示される。
-
後処理
バックグラウンドで起動させたflask-apiコンテナを、以下の手順で停止させる。
まず、下記コマンドを実行して、flask-apiコンテナのコンテナ名を確認する。(コンテナ名は、epic_aryabhataなど、自動的に割当られている)
docker ps
次に、下記コマンドを実行して、コンテナを停止する。
docker stop [コンテナ名]
コンテナ名がepic_aryabhataの場合、以下の通り。
docker stop epic_aryabhata
以上で、API本体(Flask API)と API呼び出し画面(Streamlitアプリケーション)を別々のコンテナで独立して起動させ、WebAPI(HTTP通信)によりコンテナ間の連携が可能であることを確認できました。