はじめに
今回はpythonの高速webフレームワークであるFastAPIの環境構築を行う。環境構築にはdockerを利用し、エディタとしてVisual Studio Codeを利用する。
FastAPIとは
pythonではDjangoやFlaskといったwebフレームワークが有名であるが、一般的にこれらはNode.jsと比較して遅いと言われている。その欠点を改善したのが、FastAPIとなる。ざっくりいうと、従来のフレームワークは同期式(WSGI)であったのに対し、FastAPIは非同期式(ASGI)であるため、待ち時間を有効活用できるため高速に動作するということらしい。
その他、フレームワークの比較は公式サイトで言及されているので、そちらを参照のこと。
- FastAPI 公式 – 「代替ツールから受けたインスピレーションと比較」
VSCode (Visual Studio Code)
python開発でよくつわかれるエディタにはVisual Studio Code(VSCode)とatomが存在するが、atomが開発停止となるため本サイトではVSCodeを利用していく。
インストール
インストールには、環境に合わせたインストーラを以下からダウンロードして実行する。
-
windows , linux , Macに対応。
Linux版(Ubuntu)について、2022年からapt-keyが非推奨(Deprecated APT key management utility)となるため、代替手段が周知されるまでは素直にdebパッケージをダウンロードしてインストールするのが良さそう。ちなみに、snapによるインストールは楽そうに見えるが、日本語入力できないという事象が発生する可能性があるため注意が必要。
VSCodeインストール後は、このみで以下の機能追加や設定を実施する。
設定内容 | 方法 |
---|---|
日本語化 | プラグイン「Japanese Language Pack for Visual Studio Code」 |
python | プラグイン「python」 |
markdown | プラグイン「Markdown All in One」 |
UML | プラグイン「PlantUML」 |
HTMLサーバ | プラグイン「Live Server」 ステータスバー「Go Liveから起動」 |
ミニマップの非表示 | 「ファイル – ユーザ設定 – 設定」から「テキストエディター – ミニマップ」で、ミニマップを非表示にする。 |
VSCodeでよく使いそうなショートカット・機能。
ショートカット | 機能 |
---|---|
grep | 「SHIFT」+「Ctl」+「F」 |
ターミナル起動 | 「Ctl」+「`」 |
矩形選択 | 「SHIFT」+「Alt」 |
コマンドパレット | 「SHIFT」+「Ctl」+「P」 ソートコマンド:「sort …」 diffコマンド:「compare …」 目次作成コマンド:「Markdown All in One:Create Table Of Contents」 目次更新コマンド:「Markdown All in One:Update Table Of Contents」 |
docker
python環境を簡単に作成+使い回しできるように、dockerでサーバを構築する。以下はLinux(ubuntu)での環境構築。
dockerとは
dockerは、VMwareやVirtual Boxのような仮想マシン実行環境。dockerを利用するメリットは、仮想マシンのOSのインストールや設定等を簡単にスクリプト化・自動化できる点。
このため、一つ仮想マシンを作ってしまえば、以降はコマンド一つで同じ環境が作成できるため、新規参入した開発者が環境構築で1日潰れるということもなくなる。また、dockerイメージをそのまま本番環境とにデプロイすることも可能。
イメージとコンテナ
一般にOSのインストールでは、ISOファイルをDVD等に焼いて、開発マシンにインストールすることになる。dockerではそれぞれ、以下のように呼ばれる。
- 「ISOファイル」に該当するもの … イメージ
- 「開発マシン」に該当するもの … コンテナ
compose.yamlとDockerfile
OSインストールや設定は、compose.yamlとDockerfileというファイルにスクリプト化する。Dockerfileでは、使用するイメージ(OS)の指定や初期設定を指定し、compose.yamlではコンテナ(仮想マシン)とホストマシンとの関連性を定義する。
環境構築
環境構築の手順を以下に示す。
docker
docker公式に従う。
# 前提ソフトのインストール
sudo apt update
sudo apt-get install ca-certificates curl gnupg lsb-release
# dockerのキーを追加
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# dockerリポジトリの追加
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# dockerのインストール
sudo apt update
sudo apt install docker-ce
docker-compose(ver2系)
dockerを使う上での便利ツール。docker v20.10.13 以降はdocker composeコマンド(Ver2系)を利用可能。docker-compose(ver1系)は非推奨となっている。
sudo apt install docker-compose-plugin
FastAPIイメージ作成
フォルダ構成
以下のdockerFile及びcompose.yamlを利用して、fastapiのイメージを作成する。そのうちコンテナが増えていくと思うので(mysql等)、Dockerfileはフォルダを切って配置している。
root
┣ compose.yaml
┣ app
┃ ┗ main.py
┗ docker_config
┗ python
┗ Dockerfile
compose.yaml
「build」でDockerfileの場所を指定したり、container_nameでコンテナ名を指定している。
services:
fastapi:
build: ./docker_config/python
volumes:
- ./app:/app
ports:
- 8000:80
container_name: fastapi
上記で作成したイメージは以下の動作となる。
- ホストマシンの「app」フォルダは、仮想マシンの「/app」フォルダと同期する
- fastapiコンテナのwebサービスは、ブラウザから以下のURLでアクセスできる
Dockerfile
fastapiの公式イメージを利用する。開発用に、ファイルを更新すると自動でリロードする設定を追加。
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.6
CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "80"]
main.py
webサイトのメインページ。アクセスするとjson「{"Hello": "World"}」を返す。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
FastAPIコンテナ実行
上記フォルダ構成を準備したら、compose.yamlのフォルダに移動してコマンドを実行する。
起動(イメージとコンテナの作成)
以下コマンドを実行後、ブラウザからURLにアクセスして、「{"Hello": "World"}」が表示されればOK。
cd root
sudo docker compose up -d
終了
コンテナを落として終了する。
cd root
sudo docker compose down --volumes --remove-orphans
イメージを作り直したい場合、名前が競合するので以下で削除してから「compose up」する。
sudo docker compose down --rmi all --volumes --remove-orphans
その他のdockerコマンド
よく使うコマンドは以下の通り。
コマンド | 内容 |
---|---|
search | イメージを検索(web) |
pull | イメージを取得(web) |
images | イメージ一覧(local) |
run | イメージからコンテナを生成して起動 |
start | 停止中のコンテナを起動 |
ps -a | コンテナ一覧 |
exec | コンテナ内でコマンド実行 例)sudo docker exec -it (コンテナ名) /bin/bash |
cp | ホストとコンテナ間でのファイルコピー |
stop | コンテナを停止 |
commit | コンテナをイメージ化 |
rm | コンテナを削除 |
rmi | イメージを削除 |