0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

エンジニア管理ツールでも作る③Flask・Gunicorn環境用意

Last updated at Posted at 2024-05-08

前回

Next.jsの環境を作りました。

今回の目標

DockerでFlask + Gunicorn環境を作る

Dockerfileの用意

# api/Dockerfile
FROM python:3-slim

WORKDIR /app

RUN pip install --upgrade pip

COPY requirements.txt ./
RUN pip install -r requirements.txt

現時点でpython:3-slimのバージョンは3.12.3でした。

pipはとりあえずupdrageしておきます。

requirements.txtには必要なパッケージ一覧を羅列する予定です。

RUN pip install -r requirements.txtDockerfileに書くかは好みの問題なのかもしれませんが、今回は書いています。
イメージがPythonパッケージをインストールした状態で作成されます。
じゃあ他にどういう方法があるんだというと、docker-compose.ymlcommandsのところに書く方法があります。

Dockerfileの方に書いておくと、docker compose restartなどしたときにPythonパッケージはインストール済みなのですぐにリスタートされます。
そのかわり、requirements.txtを編集する度にdocker compose buildしてやる必要があります。

docker-compose.ymlの書いておくと、requirements.txtを編集する度にdocker compose buildする必要は無くなりますが、docker compose restartなどしたときにPythonパッケージのインストールが挟まり、リスタートが少し遅れます。

Dockerイメージのタグについて

DockerfileにFROM XXXと書いた場合、基本的にdocker hubというところからイメージをpull(ダウンロード)してきます。

今回、FROM python:3-slimと指定しましたが、pythonの部分が基本となるイメージ名、3-slimの部分がタグというものになります。

docker hubのpythonのページを確認すると、
image.png

3-slim3.12.3-slimとかと同じところに書かれていますね。
pythonの公式は現時点でこのバージョンをオススメしているわけです。

なので、時間が経つと3-slimは移動して3.13-slimとかを指すことになるはずです。

現時点でpython:3-slimのバージョンは3.12.3でした。

ここで「現時点で」という言葉を使ったのはそのためです。

docker-compose.ymlの用意

# docker-compose.yml
services:
  api:
    build: api
    image: sk-api
    volumes:
      - ./api:/app
    ports:
      - "8001:8000"
    command: 'gunicorn'

gunicorn一発で立ち上がるように設定を頑張ります。

requirements.txtの用意

# api/requirements.txt
Flask
gunicorn

とりあえず今はこれだけあればOKです。

flaskアプリ

from flask import Flask

app = Flask(__name__)

@app.route('/api')
def hello():
    return {"hello": 200}

最小構成でやってみます。

Gunicorn設定

Gunicornとは

WSGI(Web Server Gateway Interface)サーバーというやつです。
「ウィズギー」と読みます。

Flaskだけでも動作自体はするんですけど、
Gunicornは複数のワーカープロセスを生成し、それぞれがリクエストを処理することで並行処理を実現します。
これにより、複数のクライアントからの同時リクエストに対応でき、高負荷時でも安定して動作します。

Flaskはリクエストを受け取って実際の処理をするもの。
Gunicornはリクエストの送受信を制御するもの。
と考えればいいと思います。

設定

# api/gunicorn.conf.py
import os

wsgi_app = 'app:app'

reload = True
bind = '0.0.0.0:8000'

workers = os.cpu_count()

gunicorn.conf.pyというファイルを作ると自動で読み込んでくれます。

wsgi_appにflaskで作ったアプリを設定します。
app.pyの中のappモジュールがflaskアプリなので'app:app'と設定します。

reload = Trueとすることで、コードを変更したときに勝手にワーカーを再起動してくれます。

bind = '0.0.0.0:8000'でどのIPのどのポートで起動するかを設定します。

workersにはワーカーの数を設定します。デフォルトは1です。
公式からの推奨値は(CPU * 2) +1です。
私のPCのCPUは3で、とりあえずこれで十分なのでworkers = os.cpu_count()としてます。
画面を作っていく上で動きがもっさりしてきたら、ここの値を変更していこうと思います。

ディレクトリ構成

api
├── Dockerfile
├── app.py
├── gunicorn.conf.py
└── requirements.txt

最終的にはこんな感じです。

起動

docker compose up -d

localhost:8001/apiにアクセスしてみましょう。

image.png

ちゃんとjsonが返ってきてますね。

ね、簡単でしょう?

次回

Nginxの環境用意

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?