初学者向け：Dockerを使ってシンプルなFlaskアプリケーションを起動する方法

## はじめに
この記事では、前回簡単に解説した Dockerfile を使い、ローカル環境で **PythonのFlaskアプリケーション** を実際に動かす方法を解説します。

:::note warn
***自分の備忘録を兼ねて、基礎的な部分を体系的にまとめていますので、初学者の方にも役立つ内容になっています。***
:::

次回の記事では、**Docker Compose** を使い、複数のコンテナを一度に操作できる ```docker-compose.yaml``` ファイルについて解説する予定です。

## 前提条件
以下の環境が整っていることを前提に、実際にハンズオンを進めていきます。

:::note info
- **Dockerがインストールされていること**
- **PythonのFlaskアプリケーションが動作可能であること**
:::

また、Dockerの基礎知識については、以下の記事で解説していますので、参考にしてください。

https://qiita.com/free-honda/items/6273289e813eabcbd9d9

## ディレクトリ構成

本記事で作成するプロジェクトのディレクトリ構成は以下の通りです。

```ディレクトリ構成.
flask_docker/
├── app.py              # Flaskアプリケーションのコード
├── requirements.txt    # Pythonの依存パッケージ
└── Dockerfile          # Dockerの設定ファイル
```

シンプルでわかりやすいディレクトリ構成にしています。

## 実際にやってみた

### プロジェクトの準備

ターミナルで以下のコマンドを実行し、プロジェクト用のディレクトリを作成します。

```bash
mkdir flask_docker
cd flask_docker
```

## 必要なファイルを作成

次に、以下の3つのファイルをプロジェクトディレクトリに作成します。

:::note info
- ***app.py***: Flaskアプリケーションコード
- ***requirements.txt***: 必要なパッケージを記述
- ***Dockerfile***: Dockerの設定ファイル
:::

### app.py
以下のコードを記述し、シンプルなFlaskアプリケーションを作成します。

```app.py
# app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, Docker!'

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

### requirements.txt
Flaskをインストールするための依存関係を記述します。

```requirements.txt
Flask==2.0.1
Werkzeug==2.0.3
```

### Dockerfile
以下の内容でDockerfileを作成します。

```Dockerfile
# ベースとなるイメージを指定
FROM python:3.9-slim

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

# 必要なファイルをコンテナにコピー
COPY requirements.txt .

# 必要なパッケージをインストール
RUN pip install -r requirements.txt

# アプリケーションコードをコピー
COPY . .

# コンテナ内で実行するコマンドを指定
CMD ["python", "app.py"]
```

##  Dockerイメージのビルド

プロジェクトディレクトリ内で以下のコマンドを実行し、Dockerイメージをビルドします。

```bash
docker build -t flask_docker .
```

このコマンドにより、```Dockerfile``` の内容に基づいてコンテナイメージが作成されます。

![スクリーンショット 2024-12-10 20.59.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/3eb28102-2db6-d881-cc94-1ab51a6074d2.png)

私のローカル環境でも、Dockerイメージが正常にビルドされたことを確認できました。

## コンテナを実行
次に、以下のコマンドを実行して、Flaskアプリケーションをコンテナ内で起動します。

```bash
docker run -p 5000:5000 flask_docker
```

Flaskアプリケーションが正常にコンテナ内で起動したことが、以下の画面で確認できます。

![スクリーンショット 2024-12-10 21.01.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/cb58ea06-8bd2-1865-84d4-4d4dd7ee56e6.png)


## アプリケーションの確認

コンテナが正常に起動したら、ブラウザで以下のURLにアクセスし、アプリケーションが動作しているかを確認します。

```bash
http://localhost:5000
```

ブラウザに「```Hello, Docker!```」と表示され、ハンズオンが成功したことが確認できます。

![スクリーンショット 2024-12-10 21.02.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/3486f281-5fca-a1a7-7018-d8e16645d3ef.png)

実際にブラウザで確認できるため、ハンズオンを進める中で達成感を感じやすいですね！

## まとめ
最後までお読みいただき、ありがとうございました！

:::note warn
***今回はDockerの基礎的な内容を扱いましたが、基本をしっかり理解することで、Dockerやコンテナに関する知識がさらに深まります。***
:::

今後もDocker関連の知識を整理しながら発信していきますので、この記事が誰かの技術的な参考になれば嬉しいです。

## おまけ：シェルスクリプトで一括作成してみた

手動でディレクトリとファイルを作成するのは少し面倒に感じたので、ディレクトリ構造と必要なファイルを一括で作成するシェルスクリプトを作成しました。

```test.sh
#!/bin/bash

# プロジェクトディレクトリ名
PROJECT_DIR="flask_docker"

# プロジェクトディレクトリ作成
mkdir -p "$PROJECT_DIR"
cd "$PROJECT_DIR" || exit

# app.py を作成
cat <<EOF > app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, Docker!'

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

# requirements.txt を作成
cat <<EOF > requirements.txt
Flask==2.0.1
Werkzeug==2.0.3
EOF

# Dockerfile を作成
cat <<EOF > Dockerfile
# ベースとなるイメージを指定
FROM python:3.9-slim

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

# 必要なファイルをコンテナにコピー
COPY requirements.txt .

# 必要なパッケージをインストール
RUN pip install -r requirements.txt

# アプリケーションコードをコピー
COPY . .

# コンテナ内で実行するコマンドを指定
CMD ["python", "app.py"]
EOF

echo "プロジェクト '${PROJECT_DIR}' の初期ファイルを作成しました！"
```

***このスクリプトを実行すれば、ディレクトリ構造と初期ファイルが自動で作成されます。***

## 関連記事

https://qiita.com/RyutoYoda/items/c260d3a1067ff853b18e

https://zenn.dev/tatausuru/articles/35e123034b98ba

https://qiita.com/Pitts7/items/542196eaec6bc0b77c38