Docker上で自作のwebアプリを動かす。(Flask)

自作のwebアプリが動く環境をdockerを使って構築します。
## まずメリット紹介
ライブラリインストールなど面倒な作業をスキップできる。
dockerで動かすアプリごとにリソース管理ができる。

## dockerインストール
インストールしてください。
win11を使っているので docker for windowsをインストールしました。
WSL2はONにしてください。

## まずライブラリインストールリストをつくる。(requirements.txt)
自分のwebアプリがあるディレクトリまで、cmdで移動してください。
```
cd C:\Users\sharisa\Videos\ラズベリーパイIpad
```
仮想環境があるならば仮想環境をアクティブにしてください。
requirements.txt作成コマンドを打ちます。
```
(myenv_pai) C:\Users\sharisa\Videos\ラズベリーパイIpad>pip freeze > requirements.txt
```
すると、、、C:\Users\sharisa\Videos\ラズベリーパイIpad　ここに、 requirements.txtが作られます。
これは、仮想環境にインストールされたライブラリになります。

## Dockerfile作成
ここからDocker上でwebアプリを動かすためのDocker関連ファイルが登場します。サクっと全体をお伝えします。
### Dockerfileとは、
役割: Docker イメージを作成するための設計図です。

内容: アプリケーションをコンテナで動かすために必要な指示や設定が記述されています。例えば、ベースとなるOS、必要な依存関係、ファイルのコピー、コンテナ内で実行するコマンドなどを定義します。

使い方: Dockerfile をもとに、docker build コマンドを使って Docker イメージを作成します。

### Docker イメージ (Docker Image)
役割: Dockerfile から生成された「完成した状態のテンプレート」です。イメージは、コンテナを実行するために必要なアプリケーション、依存関係、設定などがすべて含まれたパッケージです。

内容: コンテナのベースになるものです。イメージ自体は変更されませんが、イメージから作られるコンテナは動的に動作します。

使い方: docker run コマンドなどでイメージを基にコンテナを起動します。1つのイメージから何度でもコンテナを作成できます。

例: Pythonアプリ用のDockerイメージや、MySQLデータベースのDockerイメージ。


### Docker Compose
役割: 複数のコンテナ（サービス）を簡単に管理・起動するためのツールです。各サービスの設定や依存関係、ネットワークやボリュームの設定を一括で行えます。

内容: 複数のコンテナを連携させる設定を docker-compose.yml ファイルで定義し、すべてのコンテナを一括で管理・操作できます。例えば、ウェブアプリケーションとデータベースのコンテナを連携させる場合に便利です。

使い方: docker-compose up コマンドで、docker-compose.yml に記載された全てのサービスをまとめて起動します。

-----------------------
### Dockerfile作成に戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/643ffee4-8e7d-6ea9-3cfa-ec1ee0f6e29b.png)
まず、Dockerfileの場所。仮想環境とかflaskアプリと同じ階層。

Dockerファイルの中身を作成します。
```
# ベースイメージとしてPython 3.12.3の軽量バージョンを使用
FROM python:3.9-slim

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



# Pipを最新バージョンにアップデート
RUN pip install --upgrade pip

# requirements.txtをコンテナにコピー
COPY requirements.txt .

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

# アプリケーションファイルをすべてコンテナにコピー
COPY . .

# 環境変数の設定
ENV FLASK_APP=flaskr
ENV FLASK_ENV=development

# ポート5000を公開
EXPOSE 5000

# アプリを起動
CMD ["flask", "run", "--host=0.0.0.0", "--port=5000", "--debug"]

```

保存して閉じる。

## docker-compose.yml作成
docker-compose.yml
これを
C:\Users\sharisa\Videos\ラズベリーパイIpad

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/f1816259-b2f8-112a-6802-0a4df691dd11.png)

```
version: '3'
services:
  flask-app:
    image: ipad-flask-app
    ports:
      - "5000:5000"
    volumes:
      - .:/app
    environment:
      FLASK_ENV: development
    restart: always  # Docker起動時に自動起動する設定
```
保存して閉じる。

## flaskアプリをdockerで起動
Dockerfile をもとに、docker build コマンドを使って Docker イメージを作成
flask-app部分はイメージの名前になります。
```
docker build -t ipad-flask-app .
```
コンテナにアップロード稼働
flask-app部分はイメージの名前になります。
↓これはcomposeファイルを使ってアップロードする方法
```
docker-compose up -d
```
↓これはcomposeファイルを使わないで手動でアップロードする方法
```
docker run --reload -p 5000:5000 --name flaskr-container --restart always -e FLASK_ENV=development flask-app
```
--restart always：このオプションは、Dockerデーモンが再起動するたびにコンテナを自動的に再起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/7a394e63-248d-7f0a-d139-ea4c01c14e87.png)

Dcokerのコンテナ上でアプリが動き出せばOK。
※flask-appというのがImage名になります。

## デバック
いまのところローカルをマウントしてデバック実行できない。
dockerイメージを上げ直せば変更が反映される。
dockerイメージを上げ直すのが手間なので、開発段階ではflaskを通常起動させて、デバックするかな。
dockerで動かしつつデバックできる方法、教えてほしいです。