🤖

【2024年版】何も考えずにAPIサーバーをpythonを建てたい話(Docker+FastAPI+mongo)

2024/12/29に公開

何をしたいのか?

DockerとFastAPIを使ってpython製のAPIサーバーを簡単に建てる話です。
今回の記事は、自分のためのメモ書きみたいな意味を含んでいるので注意です。

コマンドの説明は、特に載せません。ググレカス。

今回、何も考えずにネットで拾った情報(公式リファレンスetc)を使いまくって繋ぎ合わせています。余計なコマンドがあるかもしれませんが、そこはそっと替えておいてください。

ちなみに、DBにmongoを使用していますが、これは他の方が使ってたElasticSearchを使ったシステムの引継ぎの影響を受けています。
なので、お好きなDBをお使いください。

前提

下記は既にインストール済みであることが、前提で書いています。
環境は、windows11のwsl2を使用しています。が、コマンド的にはlinuxでも同様に行けるはずです。

  • python3
  • docker

設定

0.ファイル階層

デフォルトのファイル階層は、下記の通りです。
参考にしてください。後ろに/が付いている項目は、フォルダです。

  • /
    • api-src/
      • main.py
      • requirements.txt
    • mongo/
    • docker-compose.yml
    • Dockerfile-api
    • .env

1.dockerのファイル設定

docker-compose.yml
services:

  mongo:
    image: mongo
    networks:
      - mongo-compose-network
    ports:
      - 27017:27017      
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    volumes:
      - ./mongo:/data/db
    user: ${UID}:${GID}

  mongo-express:
    networks:
      - mongo-compose-network
    image: mongo-express
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example
      ME_CONFIG_BASICAUTH_USERNAME: admin
      ME_CONFIG_BASICAUTH_PASSWORD: password
      ME_CONFIG_MONGODB_URL: "mongodb://root:example@mongo:27017/"
        
  api-sever:
    networks:
    - mongo-compose-network
    build:
      context: .
      dockerfile: Dockerfile-api
    ports:
      - 8080:8000
    volumes:
        - ./api-src:/usr/src/app:ro

networks:
  mongo-compose-network:
    driver: bridge
Dockerfile-api
FROM python:3

WORKDIR /usr/src/app

COPY ./api-src/requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
UID=1002
GID=1002

.envについては、自分が使用しているLinuxアカウントのUID,GIDを記入してください。

2.pythonのHelloWorldとrequirements.txt

main.py
from fastapi import FastAPI
app = FastAPI()


@app.get("/hello")
async def hello():
    return {"message": "hello world! (/Hello)"}

@app.get("/")
async def hello():
    return {"message": "hello world (Home)!"}

requirements.txtの生成は、下記のコマンドを打って生成します。
なお、requirements.txtの生成は、追加ライブラリがあるたびに、行います。

python3 -m pip freeze > requirements.txt

起動

Dockerfileやrequirements.txtを更新した場合

docker compose up --build

その他、起動のみの場合やソースコード変更の場合

docker compose up

なお、ソースコード変更をした場合は、コンテナを再起動せずとも、勝手にリロード入ります。

APIサーバーは、8080ポート(http://localhost:8080)で確認できます。
また、DBの中身を知る場合は、8081ポート(http://localhost:8081)で確認できます。

オワリ!

ここまで読んでくださり、乙であります!!!

Discussion