【Flask】で作ったWebアプリをコンテナ化する


![alpine_linux_app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699739/aa424ebb-0005-9f58-ee85-91a8dc4c7ffd.png)

:::note warn 
以前作った[Webアプリ](https://qiita.com/MashCannu/items/2c4da7bbcf479070b67d)をコンテナ化するために改良
:::

### 修正のポイント
- コンテナ化するために軽量な「Alpine Linux」をベースとして選択する
- Jinja2のテンプレートを修正し全体のビジュアルを変更
- 追加インストールするLinuxコマンドを確認
- 追加するpythonのライブラリは、「pip freeze」コマンドでrequirements.txtにリストする

:::note alert
Flaskの簡易ウェブサーバー機能で動くように設定していので、Production環境では使わないように注意
:::

### ビルドするディレクトリ構成
```
pkg
  ├─ static
  |    ├─ css
  |    ├─ db
  |    └─ images
  ├─ templates 　(htmlファイルを格納)   
  ├─ alpine_app.py
  └─ Dockerfile
```


### Dockerファイルの設定
``` Dockerfile
# ベースイメージを指定する
FROM alpine:latest

# ADD/COPY、RUN実行時の作業ディレクトリを指定
WORKDIR /webapp

# イメージにファイルやフォルダを追加する
COPY . /webapp/

# イメージをビルドする際のコマンド（Alpineはapk）
RUN apk update \
    && apk add python3 \
    && apk add python3-dev \
    && apk add py3-pip \ 
    && apk add iproute2-ss \
    && apk add lsblk \
    && apk add procps

# pipでPythonライブラリをインストール
RUN pip install -U pip
RUN pip install -r /webapp/requirements.txt

# コンテナが外部と通信するポートを指定
EXPOSE 5555

# コンテナを起動するときに実行する既定のコマンドを指定
CMD ["python", "alpine_app.py"]

```

### イメージをビルドする
``` bash
docker build -t <Docker HUBユーザ名>/alpine_app:0.3 .
```
- -tでイメージを指定する際に、Dockerのユーザ名を指定しておかないとDocker HUBのリポジトリにpushできないので注意

``` bash
mashcannu@mac:~/GitHub/AlpineApp/pkg$ docker build -t mashcannu/alpine_app .
[+] Building 25.2s (11/11) FINISHED                                                      
 => [internal] load build definition from Dockerfile                                0.0s
 => => transferring dockerfile: 802B                                                0.0s
 => [internal] load .dockerignore                                                   0.0s
 => => transferring context: 2B                                                     0.0s
 => [internal] load metadata for docker.io/library/alpine:latest                    0.0s
 => [1/6] FROM docker.io/library/alpine:latest                                      0.0s
 => [internal] load build context                                                   0.0s
 => => transferring context: 18.61kB                                                0.0s
 => CACHED [2/6] WORKDIR /webapp                                                    0.0s
 => [3/6] COPY . /webapp/                                                           0.0s
 => [4/6] RUN apk update     && apk add python3     && apk add python3-dev     &&  11.0s
 => [5/6] RUN pip install -U pip                                                    7.4s
 => [6/6] RUN pip install -r /webapp/requirements.txt                               4.5s 
 => exporting to image                                                              2.0s 
 => => exporting layers                                                             2.0s 
 => => writing image sha256:5656a0860a8ed25d743c4d183f83eefe982e0ed46b6788b160e607  0.0s 
 => => naming to docker.io/library/alpine_app                                       0.0s 
```

### Docker Desktop で確認
![スクリーンショット 2023-02-05 15.12.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699739/cec1dea4-277d-3f4d-f99f-a366d09b5930.png)