はじめに
1週間N(E)ETになった社会人の学習記録です。
昨日と今日はDockerのサンプルを写経し、使い方を覚えます。
私のレベルは、「DockerとかKubernetes名前は知っているけど使ったことはない」です。
現状のファイル構成
フロントエンド(多分React)はまだないため、後ほど追加する。
% 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みたいなものと理解)
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"]
以下のコピペだが、いくつか変更した。
- alpineから変更1
- COPYコマンドをvolumesに変更(流石に開発中にローカルで変更した後、毎回「docker-compose up -d --build」を打つのはだるすぎる)
- server上に余計なファイルを上げるのもなんだかなと思ったので、requirements.txtからpip installを直書きに。(pythonのことはよくわからないので、正しくなさそう)
- port番号はデフォルトっぽい80番に変更
docker-compose.yml
複数のDockerfileを使用したり、細かい設定をDockerfileから外だししたりする設定ファイル。
docker コマンドを覚えられない人がメモ代わりに使うと幸せになれるものという理解。
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はこの辺を参考にした。
- Dockefileは環境変数「LANG」を設定する程度だったので不要になった。
- データベースの実態を置く場所として、「/data」を用意したつもりだが現状うまくいっていないと思う。
- initdb.dはまだ書いていない(というかTable定義が先にいるのでまだ書けない)。
- POSTGRES_PASSWORD: p@sswordの所は本番環境へのデプロイ時とかはどうするんだろうか。
- volumesを3行で書けというのはここ2を参照した(最後の余談を読むと現状は無意味そうだが)。
言い訳(免責事項)
上記の技術は完全に初心者です、あてにしないように!!!
作る予定のもの(議事録配信システム)
概要
題名や日時を入力したり出席者や配信者を選んでポチると、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は初めてなため慣れない。