「自分のパソコンでは動くのに、本番環境に持っていったら動かなくなった…」
こういう経験、ありますよね? 開発あるあるのなかでも、とくに心が折れる瞬間のひとつです😅
そんな悩みを根本から解決してくれるのがDockerです。今回は、PythonのWebフレームワーク「Flask」で作ったAPIをDockerでコンテナ化する方法を、ゼロからわかりやすく解説していきます!
Ubuntu環境での動作確認済みなので、VPSやクラウドサーバーへのデプロイを考えている方にもぴったりです👍
🐳 Dockerって何がすごいの?

ざっくり言うと、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をリバースプロキシとして組み合わせる方法や、環境変数を使って設定を外部化する方法なども挑戦してみてください。より実践的な構成に近づいていきますよ!





