はじめに
プログラミングを始めたばかりの頃、ターミナルでサーバーを起動するコマンド(例えば uvicorn main:app)を打った後、画面が止まったままになり、新しいコマンドが打てなくなった経験はありませんか?
「あれ?フリーズしたかな?」と不安になって Ctrl + C を押してしまうこともあるかもしれません。しかし、この止まった状態こそが、Webサーバーが正常に仕事をしている証拠なのです。
この記事では、FastAPIの main.py を実行し続ける意味と、それがDockerコンテナの仕組みとどう関係しているのかを解説します。
1. プログラムには「終わるもの」と「続くもの」がある
プログラムには、大きく分けて2つの種類があります。
終わるプログラム(バッチ処理など)
計算やファイル操作など、やるべきことを終えたらすぐに終了するプログラムです。Pythonの学習で最初に書く print("Hello") などもこれにあたります。
- イメージ: 手紙をポストに投函して帰る(用が済んだら終わり)
続くプログラム(Webサーバーなど)
起動すると、誰かからの連絡(リクエスト)が来るのを布団でずっと待ち続けるプログラムです。自分から終了しようとしない限り、動き続けます。これを常駐プロセスと呼んだりします。
- イメージ: 電話の前で着信を待ち続ける(いつ電話が来てもいいように待機し続ける)
2. FastAPI(main.py)を動かすとなにが起きている?
FastAPIなどのWebアプリケーションフレームワークを使う際、以下のようなコマンドを実行します。
uvicorn main:app --reload
このコマンドを実行したとき、裏側では「無限ループ」の状態に入っています。
プログラムは終了せず、指定されたポート(例: 8000番)という窓口を開けっ放しにして、「誰か僕にデータを送ってくれないかな?」と24時間365日ずっと監視し続けているのです。
つまり、main.pyを実行し続けること = Webサーバー(お店)を開店し続けることと言えます。これを途中で止めてしまうのは、営業時間中にお店を閉めてしまうのと同じことです。
3. Dockerとの関係
この「プログラムが終了しない」という特性は、Dockerコンテナにとっても非常に重要です。
Dockerには以下の鉄則があります。
コンテナは、その中で動いているメインのコマンドが実行中である間だけ存在する
つまり、Dockerコンテナが生き続けるためには、その中身であるWebサーバー(uvicorn)が終了せずに動き続けている必要があります。
- FastAPIがリクエスト待ちで頑張っている → Dockerコンテナも「よし、仕事中だな」と判断して起動し続ける
- FastAPIがエラーや完了で終了してしまう → Dockerコンテナは「やるべきことが終わった」と判断して、コンテナ自体を停止(Exited)させる
Dockerfile の最後に CMD でサーバー起動コマンドを書くのは、「このコンテナが立ち上がったら、すぐにWebサーバーを常駐させてね(そうしないとコンテナがすぐ死んじゃうから)」という意味が込められています。
まとめ
- Webサーバーを立ち上げるとターミナルが止まるのは、リクエストを待ち続ける常駐モードに入っているから
- FastAPIの
main.pyを実行し続けることは、APIサーバーとしての機能を提供し続けるために不可欠 - Dockerコンテナは、この中身のプログラムが動き続けているおかげで、コンテナとしての生存を維持できている
「画面が止まって何もできなくなった」と思ったら、それはサーバーが元気にリクエストを待ち構えている証拠です。安心してそのままにしてあげてください。