0
0

Docker入門3)WebAPI開発

Posted at

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起動

  1. Flaskアプリのビルドと実行:

    cd flask_api
    docker build -t flask-api .
    docker run -d -p 5000:5000 flask-api
    
  2. Streamlitアプリのビルドと実行:

    cd streamlit_app
    docker build -t streamlit-app .
    docker run -p 8501:8501 streamlit-app
    
  3. http://0.0.0.0:8501にアクセス
    以下のような文字とボタンだけの画面が表示される。
    image.png

  4. API呼び出しボタンをクリック
    ボタンをクリックしてAPIを呼び出し、レスポンスとして文字が返ってくれば、正常動作。
    image.png

  5. 後処理
    バックグラウンドで起動させたflask-apiコンテナを、以下の手順で停止させる。
    まず、下記コマンドを実行して、flask-apiコンテナのコンテナ名を確認する。(コンテナ名は、epic_aryabhataなど、自動的に割当られている)

docker ps 

次に、下記コマンドを実行して、コンテナを停止する。

docker stop [コンテナ名]

コンテナ名がepic_aryabhataの場合、以下の通り。

docker stop epic_aryabhata

以上で、API本体(Flask API)と API呼び出し画面(Streamlitアプリケーション)を別々のコンテナで独立して起動させ、WebAPI(HTTP通信)によりコンテナ間の連携が可能であることを確認できました。


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0