Multipass + Docker + FastAPI でローカル API サーバーを構築する

はじめに

ココネでフロントエンドエンジニアをしていますFと申します。
この記事ではmacOSでMultipassを使用してDockerFastAPIを動かす方法について紹介します。

環境は以下を前提としています。

  • 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アプリケーション開発ができると思います。参考になりましたら幸いです。

 


 

ココネでは一緒に働く仲間を募集中です。

ご興味のある方は、ぜひこちらの採用特設サイトをご覧ください。

https://www.cocone.co.jp/recruit/contents/

Category

Tag

%d人のブロガーが「いいね」をつけました。