
Multipass + Docker + FastAPI でローカル API サーバーを構築する
-
2023年4月25日
はじめに
ココネでフロントエンドエンジニアをしていますFと申します。
この記事ではmacOSでMultipassを使用してDockerでFastAPIを動かす方法について紹介します。
環境は以下を前提としています。
- macOS 12.6
- Homebrew 4.0.6
Multipass + Docker
Docker Desktopが有料化されたため、代替手段としてMultipassが使いやすいと感じました。MultipassはUbuntu VM環境であり、仮想化on仮想化という点が冗長に感じられますが、現在(2023.3)はDockerのイメージが事前に用意されているため、簡単に利用できます。
Install Multipass
Multipass をインストールします。
% brew install --cask multipass
インストールが完了したら、バージョンを確認します。
% multipass version
multipass 1.11.1+mac
multipassd 1.11.1+mac
Launch a Docker VM
Dockerのイメージが用意されているため、それを利用します。最初に起動する際は、しばらく時間がかかります。
% multipass launch docker
Launched: docker
次に、dockerインスタンスでdockerコマンドを実行して動作を確認します。
% multipass exec docker docker
Usage: docker [OPTIONS] COMMAND
...
...
エイリアスの作成
インスタンスのコマンドをホストで同じように使えるよう、エイリアスを作成し、表示されたパスを設定ファイル(.bashrc、.zshrcなど)に追加します。
% multipass alias docker:docker
You'll need to add this to your shell configuration (.bashrc, .zshrc or so) for aliases to work without prefixing with `multipass`:
PATH="$PATH:/Users/<user>/Library/Application Support/multipass/bin"
これでDockerおよびdocker-composeコマンドが利用できるようになるので、動作を確認してみます。
% docker version
Client: Docker Engine - Community
Version: 23.0.1
API version: 1.42
...
...
% docker-compose version
docker-compose version 1.29.2, build unknown
docker-py version: 5.0.3
CPython version: 3.10.6
OpenSSL version: OpenSSL 3.0.2 15 Mar 2022
プロジェクトディレクトリ作成
プロジェクトディレクトリを作成し、必要なファイルを用意します。ファイルは以下のように配置しています。
fastapi
├─ app/
│ └─ main.py
├─ docker/
│ ├─ Dockerfile
│ ├─ docker-compose.yml
│ └─ requirements.txt
└─ log/
FROM python:3-slim
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
CMD ["python", "./main.py"]
version: "3"
services:
python3:
container_name: "FastAPI"
build: .
ports:
- "8080:8080"
volumes:
- ../app:/app
- ../log:/var/log
environment:
TZ: "Asia/Tokyo"
fastapi
uvicorn
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
import uvicorn
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins='*',
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
async def read_root():
return {"Hello": "World"}
if __name__ == "__main__":
uvicorn.run("main:app", host='0.0.0.0', port=8080, reload=True)
ディレクトリのマウント
プロジェクトディレクトリをDockerコンテナにマウントするために、まずmultipassインスタンスにマウントします。
% multipass mount /<path>/fastapi docker:/home/ubuntu/fastapi
マウントされているディレクトリを確認するには、multipassインスタンスの情報を表示します。
% multipass info docker
コンテナ起動
Dockerコンテナをバックグラウンドで起動します。
% cd /<path>/fastapi/docker
% docker-compose up -d
Dockerコンテナが起動したら、multipassインスタンスのIPアドレスを確認します。IPアドレスは環境によって異なりますが、この例では192.168.64.4です。
% multipass list
Name State IPv4 Image
docker Running 192.168.64.4 Ubuntu 22.04 LTS
172.17.0.1
172.18.0.1
Dockerコンテナが起動したら、WebブラウザからAPIの動作確認を行うことができます。以下のURLを入力してアクセスすると、APIの動作確認ができます。
http://<multipass_instance_ip_address>:8080/
APIが正しく動作していれば、以下のようなJSONが表示されます。
{"Hello":"World"}
APIの停止は以下のコマンドで行います。
% docker-compose down
さいごに
この記事では、Multipassを使用してDockerでFastAPIを動かす方法を紹介しました。
フロントエンド開発ではさまざまな開発環境がありますが、API サーバーをローカルで手軽に用意できることで、効率よくWebアプリケーション開発ができると思います。参考になりましたら幸いです。
ココネでは一緒に働く仲間を募集中です。
ご興味のある方は、ぜひこちらの採用特設サイトをご覧ください。