Docker初心者が2日で理解したこと (1週間だけ頑張る Day2of9)

# はじめに
1週間N(E)ETになった社会人の学習記録です。
昨日と今日はDockerのサンプルを写経し、使い方を覚えます。
私のレベルは、「DockerとかKubernetes名前は知っているけど使ったことはない」です。

# 現状のファイル構成
フロントエンド（多分React）はまだないため、後ほど追加する。

```bash
% tree
.
├── api
│   ├── app
│   │   ├── __pycache__
│   │   │   └── main.cpython-39.pyc
│   │   └── main.py
│   └── build
│       └── Dockerfile
├── db
│   ├── build
│   │   └── Dockerfile # 不要になった。
│   ├── data
│   └── docker-entrypoint-initdb.d
└── docker-compose.yml
```

# Dockerfile
Linuxの構成レシピ。
（pythonじゃないほうのanacondaのkickstartみたいなものと理解）

```Dockerfile:api/build/Dockerfile
FROM python:3.9.4-slim

WORKDIR /app

# コンテナ内で必要なパッケージをインストール
RUN pip install --no-cache-dir --trusted-host pypi.python.org uvicorn fastapi

# FastAPIを待機
CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "80"]
```
以下のコピペだが、いくつか変更した。

https://qiita.com/satto_sann/items/fcd3832a1fea2c607b85

* alpineから変更[^1]
* COPYコマンドをvolumesに変更（流石に開発中にローカルで変更した後、毎回「docker-compose up -d --build」を打つのはだるすぎる）
* server上に余計なファイルを上げるのもなんだかなと思ったので、requirements.txtからpip installを直書きに。（pythonのことはよくわからないので、正しくなさそう）
* port番号はデフォルトっぽい80番に変更

[^1]: https://applingo.tokyo/article/6860

# docker-compose.yml
複数のDockerfileを使用したり、細かい設定をDockerfileから外だししたりする設定ファイル。
docker コマンドを覚えられない人がメモ代わりに使うと幸せになれるものという理解。

```yml:docker-compose.yml
version: "3"

services:
  # FastAPI
  api:
    container_name: "api"
    build: ./api/build/
    restart: always
    tty: true
    ports:
      - 8000:80
    volumes:
      - type: bind
        source: /mnt/c/Users/Public/GitHub/prac/docker/python_fastapi/api/app
        target: /app

  # PostgreSQL
  db:
    container_name: "db"
    image: postgres:13.2-alpine
    ports:
      - 5432:5432
    environment:
      POSTGRES_PASSWORD: p@ssword
      LANG: ja_JP.UTF-8
    volumes:
      - type: bind
        source: /mnt/c/Users/Public/GitHub/prac/docker/python_fastapi/db/data
        target: /data
      - type: bind
        source: /mnt/c/Users/Public/GitHub/prac/docker/python_fastapi/db/docker-entrypoint-initdb.d
        target: /docker-entrypoint-initdb.d
```

PostgreSQLはこの辺を参考にした。

https://qiita.com/hoto17296/items/070857971f95017b5e07

https://crudzoo.com/blog/docker-postgres

* Dockefileは環境変数「LANG」を設定する程度だったので不要になった。
* データベースの実態を置く場所として、「/data」を用意したつもりだが現状うまくいっていないと思う。
* initdb.dはまだ書いていない（というかTable定義が先にいるのでまだ書けない）。
* POSTGRES_PASSWORD: p@sswordの所は本番環境へのデプロイ時とかはどうするんだろうか。
* volumesを3行で書けというのはここ[^2]を参照した（最後の余談を読むと現状は無意味そうだが）。

[^2]: https://zenn.dev/sarisia/articles/0c1db052d09921

# 言い訳（免責事項）
上記の技術は完全に初心者です、あてにしないように!!!

# 作る予定のもの（議事録配信システム）
## 概要
題名や日時を入力したり出席者や配信者を選んでポチると、Wordのテンプレートの該当箇所を適切に置換したファイルを適切な場所に置きます。
作成後に配信ボタンを押すと、配信者にメールが届くというシステムです。
（もとはアクセスで作られているものを代替できるかのテスト）

## やらないこと

* セキュリティ関係はザルのまま（どうせ社外アクセスできない） 
* nginxとかのロードバランサー（どうせ大したアクセス数じゃない）
* testとかCIとか（やりたいけど時間なさそう）
* cssとかのデザイン（コードの見た目は気にするけど、使えればいいや派）

# 環境
WSL on WindowsでDockerという何でLinuxを入れないのかという疑問の残る構成で行います。
会社ではCeontOSをちょこちょこ触るので、Linux自体には抵抗がないのですが、WSLの出来が良すぎてわざわざLinuxを入れなくてもよいかと放置してたら、1年がたったという感じです。
Intel Macもありますが、lsやgrepなどのオプションがGNUと微妙に違ってストレスがたまるため、MacよりもLinuxのほうが好きなので、この構成で行きます（一番性能がいいのがこのマシンというのもある）。

|項目　　|Version                          |
|--------|--------------------------------|
|CPU     |i7 9700K                        |
|メモリ   |32 GB(2400 MHz)                 |
|SSD     |SPCC M.2 PCIe SSD(1TB)          |
|OS      |Windows 10 Pro 20H2             |
|WSL2    |Ubuntu 20.04.2 LTS (Focal Fossa)|
|Docker  |Community (20.10.5)             |

# 使用（予定）技術
一番得意な言語はRuby(without Rails)で、C++とPythonは使ったことあります。
今回は、仕事ではあまり使わない技術を中心に選択してみた。
rubyではなくpythonよりなのは、Wordの編集で使用経験のあるlibraryがpython製だから。
DjangoじゃなくてFastAPIなのは小さいフレームワークのほうが簡単そうだから。
MySQLじゃなくてPostgreSQLなのは非オラクルだから。
 
* FastAPI（Railsをapiモードで起動するよりはマシなんじゃなかろうかと思った。）
* SQLAlchemy（RailsのActiveRecordはマジすごいと思ったので、ORMは使いたい） 
* React（Day0of9に3目並べのチュートリアルをやった程度。凝る気は全くない）
* PostgreSQL（正直SQLiteをちょこっと触ったことがある程度なので何でもいい）


はてな記法は一人wikiとかでそこそこ使うけど、Markdownは初めてなため慣れない。