Docker で作ったWebサーバ(app.py by Flask)を動かすテスト

Docker を使って、GCPを使って、いろいろやりたいなー、と思っていましたが、冬休みももう終わりそうです。

Docker の使い方がメインで、できたのは以下です。

1. Dockerfile を書く
2. Docker image を作る (docker build)
3. ローカルで動かす (docker run)
4. ローカルで確認 (localhost をWEBブラウザで見る)

サーバとして動いているのは、下記のContainer で動いているものです。

![mydockerimage20190104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/5f080d97-8c01-d75f-8506-be5b67483e28.png)



## 1. Dockerfile とsource file の用意

こんな`Dockerfile`を作りました。

```dockerfile
# our base image
FROM ubuntu

# Install python and pip
RUN apt update -y
RUN apt install python3  -y -qq --no-install-recommends 
RUN apt install python3-pip -y -qq  --no-install-recommends
RUN pip3 install --upgrade pip

# install Python modules needed by the Python app
COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt

# copy files required for the app to run
COPY app.py /usr/src/app/
COPY templates/index.html /usr/src/app/templates/

# tell the port number the container should expose
EXPOSE 5000

# run the application
CMD ["python3", "/usr/src/app/app.py"]
```

Dockerfile では、

- ubuntu をbase image にして作る
- python3 と pipをインストールする
- app.py をコピーする
- 最後にCMD で実行する

と読めます。Dockerfile が置いてあるディレクトリをもとにimage を構成しています。実際のファイルは[ここ](https://github.com/xtkd77/test-docker-python/tree/master/samples/docker-python-flask-20200104)からダウンロードできます。

# 2. Docker Image を作る

```
> docker build --no-cache -t myapp .
```

最後にこんなメッセージが。Windows での権限の設定の仕方はいまだに分かりませんが、今のところ問題にはなっていません。

```
Successfully tagged myapp:latest
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.
```

# 3. ローカルで動かす

```
> docker run -it --rm -p 8001:8000 myapp
```

```
* Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://0.0.0.0:8000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 335-299-345
172.17.0.1 - - [03/Jan/2020 13:14:11] "GET / HTTP/1.1" 200 -
172.17.0.1 - - [03/Jan/2020 13:14:11] "GET /favicon.ico HTTP/1.1" 404 -
```

仮想化したこのマシンが動いているかはdocker コマンドで確認できます。

```
> docker ps
```

# 4. Webブラウザで確認

普通にlocalhost:8001 を開くと見えると思います。あるいは以下でも。

```
$curl http://localhost:8001

StatusCode        : 200
StatusDescription : OK
Content           : <!-- index.html -->
                    <!DOCTYPE html>
                    <html lang="ja">
                      <head>
                      </head>
...
```

# 備忘録

この後、デプロイして？ほかのクラウドサーバで動かしたいのですが、そこまでできていないので、続きをこれから頑張ります。また、Flaskも情報が思いのほか多いのでもう少し何かできるかも。

## テストコード

できた部分は、ここだけ切り取って[**Githubのsamplesのここ**](https://github.com/xtkd77/test-docker-python/tree/master/samples/docker-python-flask-20200104
)に置きました。samples/docker-python-flask-20200104 というディレクトリにあります。下記の参考サイトをもとに編集して辿り着いたものです。


## 参考

- Flask について

 - ゾンビでもわかるPythonプログラミング [Flask 入門](http://python.zombie-hunting-club.com/entry/2017/11/03/223503)
 - [Flaskの簡単な使い方](https://qiita.com/zaburo/items/5091041a5afb2a7dffc8)
 - [Python3+Flask Quick Start](https://qiita.com/icebird009/items/7f189eb86b7467a170b2)
 - https://qiita.com/RyoGT/items/fff725ce507c053f6d0a

- Docker について

 - [DockerfileからのDockerイメージの作成](https://docs.oracle.com/cd/E77565_01/E87205/html/section_svq_n2z_fp.html)
 - [Docker ハンズオン - 基本コマンド編](https://qiita.com/hihihiroro/items/6dda871dc2566801a6da)
 - めもめも [Dockerにおけるコンテナのライフサイクル](http://enakai00.hatenablog.com/entry/20140628/1403933390)
 - [Docker初心者が超絶簡単にDockerfileをまとめてみた その１](http://smot93516.hatenablog.jp/entry/2018/04/16/101853)
 - https://www.server-world.info/query?os=Ubuntu_19.04&p=docker&f=1

できればこのイメージを内部、あるいは外部のサーバで動かしたい。