Python応用

Flask APIをDockerでコンテナ化する完全ガイド【Ubuntu対応】

「自分のパソコンでは動くのに、本番環境に持っていったら動かなくなった…」

こういう経験、ありますよね? 開発あるあるのなかでも、とくに心が折れる瞬間のひとつです😅

そんな悩みを根本から解決してくれるのがDockerです。今回は、PythonのWebフレームワーク「Flask」で作ったAPIをDockerでコンテナ化する方法を、ゼロからわかりやすく解説していきます!

Ubuntu環境での動作確認済みなので、VPSやクラウドサーバーへのデプロイを考えている方にもぴったりです👍

🐳 Dockerって何がすごいの?

Docker Flask container
Docker Flask container / Photo by Wolfgang Weiser via Pexels

ざっくり言うと、Dockerは「アプリを箱ごと丸ごとパッケージする仕組み」です。

イメージとしては、引越しのときに家具を一個一個バラして運ぶのではなく、部屋まるごとトラックに積む感じ。どこに持っていっても、同じ状態で動きます。

これによって、開発環境・本番環境の差異(いわゆる「環境依存問題」)を一気に解決できるんですよね。

Dockerなし Dockerあり
環境ごとにセットアップが必要 どこでも同じ環境が再現できる
「自分のPCでは動く」問題が起きやすい 開発・本番環境の差異をなくせる
チームでのバージョン管理が大変 Dockerfileで構成をコードとして管理できる

🛠️ 事前準備:Dockerをインストールしよう(Ubuntu)

まだDockerをインストールしていない方は、以下の手順でUbuntuにインストールします。

# パッケージを最新化
sudo apt update
sudo apt upgrade -y

# 必要パッケージのインストール
sudo apt install -y ca-certificates curl gnupg lsb-release

# DockerのGPGキーを追加
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# リポジトリを追加
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 -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# インストール確認
docker --version

インストールが完了したら、sudoなしでdockerコマンドを実行できるようにしておきましょう。

sudo usermod -aG docker $USER
newgrp docker

📁 まずはFlask APIを用意しよう

最小構成のFlask APIから始めます。以下のようなディレクトリ構成で進めていきます。

flask-docker-app/
├── app.py
├── requirements.txt
└── Dockerfile

まずはFlaskアプリのコードを書いてみましょう。

# app.py
from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/')
def index():
    return jsonify({'message': 'Hello from Flask on Docker!', 'status': 'ok'})

@app.route('/health')
def health():
    return jsonify({'status': 'healthy'})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=False)

⚠️ ポイント: host='0.0.0.0' を指定しているのが重要です。これを書かないと、Dockerコンテナの外からアクセスできなくなってしまいます。

次に、必要なライブラリを記述した requirements.txt を作成します。

# requirements.txt
flask==3.0.3
gunicorn==22.0.0

本番環境では開発用サーバーではなく Gunicorn(グリーン・ユニコーン)を使います。Flaskの組み込みサーバーは開発専用のため、本番運用には向いていません。

🐋 Dockerfileを書こう

いよいよDockerの核心、Dockerfileを書いていきます。Dockerfileとは「どんな環境でアプリを動かすか」を記述した設計書のようなものです。

# Dockerfile

# ベースイメージ:軽量なPython 3.11を使用
FROM python:3.11-slim

# 作業ディレクトリを設定
WORKDIR /app

# まずrequirements.txtだけコピー(キャッシュ効率を上げるため)
COPY requirements.txt .

# ライブラリをインストール
RUN pip install --no-cache-dir -r requirements.txt

# アプリのコードをコピー
COPY . .

# ポート5000を開放
EXPOSE 5000

# Gunicornでアプリを起動
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "--workers", "2", "app:app"]

各行の意味をざっくり解説します👇

命令 意味
FROM ベースとなるDockerイメージを指定
WORKDIR コンテナ内の作業ディレクトリを設定
COPY ホストのファイルをコンテナ内にコピー
RUN ビルド時にコマンドを実行
EXPOSE コンテナが使用するポートを宣言
CMD コンテナ起動時に実行するコマンド

🚀 Dockerイメージをビルドして起動しよう

ファイルが揃ったら、いよいよビルドです! flask-docker-app/ ディレクトリで以下を実行してください。

# イメージをビルド(flask-appという名前をつける)
docker build -t flask-app .

# ビルドされたイメージを確認
docker images

ビルドに成功したら、コンテナを起動します。

# コンテナをバックグラウンドで起動(ホストの8080番→コンテナの5000番に転送)
docker run -d -p 8080:5000 --name my-flask-app flask-app

# 起動しているコンテナを確認
docker ps

ブラウザで http://localhost:8080 にアクセスするか、curlで確認してみましょう。

curl http://localhost:8080/
# → {"message": "Hello from Flask on Docker!", "status": "ok"}

curl http://localhost:8080/health
# → {"status": "healthy"}

うまくレスポンスが返ってきたら成功です🎉

🗂️ .dockerignoreファイルも作っておこう

Gitの .gitignore と同じように、Dockerイメージに含めたくないファイルを指定できます。プロジェクトルートに .dockerignore を作成しましょう。

# .dockerignore
__pycache__/
*.pyc
*.pyo
.env
.git
.gitignore
*.md
venv/
.venv/

これを書いておくことで、イメージのサイズを小さく保てるうえに、機密情報(.envファイルなど)を誤ってイメージに含めてしまうリスクも減らせます。

⚙️ Docker Composeでさらに便利に管理しよう

毎回 docker run コマンドを打つのは面倒ですよね。Docker Compose を使えば、設定をファイルで管理してワンコマンドで起動できます。

プロジェクトルートに docker-compose.yml を作成します。

# docker-compose.yml
version: '3.8'

services:
  flask-app:
    build: .
    container_name: my-flask-app
    ports:
      - "8080:5000"
    environment:
      - FLASK_ENV=production
    restart: unless-stopped

あとは以下のコマンドだけで起動・停止ができます。

# 起動(バックグラウンド)
docker compose up -d

# ログを確認
docker compose logs -f

# 停止
docker compose down

💡 ワンポイント: 旧バージョンでは docker-compose(ハイフンあり)でしたが、最新のDocker Compose V2では docker compose(スペース)が推奨です。

🔧 よくあるエラーと対処法

❌ ポートがすでに使われている

Error: Bind for 0.0.0.0:8080 failed: port is already allocated

別のプロセスがそのポートを使っています。ポート番号を変更するか、競合しているプロセスを停止してください。

# 使用中のポートを確認
sudo lsof -i :8080

# または別のポートで起動
docker run -d -p 9090:5000 --name my-flask-app flask-app

❌ コンテナがすぐに終了してしまう

ログを見てエラーの原因を調べましょう。

# 停止したコンテナのログも確認できる
docker logs my-flask-app

❌ イメージのビルドが失敗する

requirements.txt のライブラリ名・バージョンが正しいか確認してください。また、ネットワーク環境によってはPyPIへのアクセスがタイムアウトすることもあります。その場合は再度ビルドを試みてください。

🧹 Dockerリソースのお掃除コマンド

試行錯誤していると、使わないイメージやコンテナが溜まってきます。定期的にお掃除しましょう。

# 停止中のコンテナをすべて削除
docker container prune

# 使われていないイメージを削除
docker image prune

# 使われていないすべてのリソースをまとめて削除
docker system prune

📝 まとめ

今回やったことを振り返ってみましょう!

  • ✅ Dockerの基本概念(なぜ使うのか)を理解した
  • ✅ UbuntuにDockerをインストールした
  • ✅ Flask APIのコード(app.py)を作成した
  • Dockerfile を書いてイメージをビルドした
  • .dockerignore で不要ファイルを除外した
  • docker-compose.yml でラクに管理できるようにした

Dockerを使いこなせるようになると、開発の再現性・チームでの共有・本番へのデプロイがグッと楽になります。最初は「なんか難しそう…」と感じるかもしれませんが、一度動かしてみると意外とシンプルな仕組みだとわかるはずです😊

次のステップとしては、Nginxをリバースプロキシとして組み合わせる方法や、環境変数を使って設定を外部化する方法なども挑戦してみてください。より実践的な構成に近づいていきますよ!

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る
徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る
実践Claude Code入門―現場で活用するためのAIコーディングの思考法

もしも

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

AIコーディングの現場活用法を学ぶ一冊

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です