このシリーズの目的
- PythonのフレームワークであるFlaskを使用してWebアプリに必要な機能の作成と解説をやります。
- 普段の勉強のアウトプットとして書いています。質問や指摘は大歓迎です。
前回まで
PythonのフレームワークFlaskを使用してWebアプリ作成の物語(1)こんにちは世界
PythonのフレームワークFlaskを使用してWebアプリ作成の物語(2)HTMLの表示とメソッドとパラメータの受け取りかた
目的
- Flask で使用する DB(PostgreSQL) を Docker を使用して準備する
- DB を pgadmin4 で見れるようにする
ソースコード
環境準備
Docker 環境準備
Mac の場合
brew cask install docker
ver 確認
$ docker -v
Docker version 18.09.1, build 4c52b90
フォルダ構成
$ tree
.
├── README.md
├── docker-compose.yml
├── form.html
├── pgadmin
├── postgresql
│ ├── data
│ └── init
│ └── 1_create_db.sql
├── requirements.txt
└── src
├── main.py
└── templates
└── hello.html
DB 作成
Dockerって何なの??
ものすごく、ざっくり言うと
環境構築の技術の1つ
Dockerを使用することで、OSのインストールやプログラミングのための環境構築の手間が格段に減ります
以下の記事を見ると何となくイメージが湧くと思います。
docker-compose.yml の作成
version: "3"
services:
postgresql:
# イメージの指定
image: postgres:10.5
# コンテナの名前
container_name: flask_tutorial_postgresql
# hostのport5432とコンテナのport5432を繋ぐ
# ホスト;コンテナ
ports:
- 5432:5432
# hostとコンテナで共有するファイルやディレクトリを設定
# ホストのディレクトリ;コンテナのディレクトリ
volumes:
# /docker-entrypoint-initdb.dはコンテナ初回起動時に実行されるスクリプトを置く場所
- ./DB/init/:/docker-entrypoint-initdb.d
# /var/lib/postgresql/dataはpostgresqlのデータが保存されている場所
- /Users/${USER}/Volumes/flask_tutorial/postgres:/var/lib/postgresql/data
# コンテナの環境変数設定
environment:
# スーパユーザ名(省略時は"postgres")
POSTGRES_USER: ${POSTGRES_USER}
# スーパユーザのパスワード(省略時はパスワードなしでログイン可)
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
# postgresqlの初期化時の文字コード
POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
# ホスト名
hostname: postgres
# Dockerを実行するユーザ
user: root
environment:
TZ: "Asia/Tokyo"
pgadmin4:
image: dpage/pgadmin4:3.3
container_name: flask_tutorial_pgadmin4
ports:
- 80:80
volumes:
- ./pgadmin:/var/lib/pgadmin
environment:
PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL}
PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD}
depends_on:
- postgresql
hostname: pgadmin4
ポイント
${POSTGRES_USER}
や${POSTGRES_PASSWORD}
の${}
は変数を表していて
docker-compose.ymlと同じ階層にある.env
ファイルで変数を指定できる。
.envの例
POSTGRES_USER=root
POSTGRES_PASSWORD=root
PGADMIN_DEFAULT_EMAIL=root
PGADMIN_DEFAULT_PASSWORD=root
コンテナ操作
docker-compose.yml
があるディレクトリでdocker-compose up -d
実行
コンテナ起動
$ docker-compose up -d
Creating network "first_tutorial_default" with the default driver
Creating flask_tutorial_postgresql ... done
Creating flask_tutorial_pgadmin4 ... done
コンテナが起動できたか確認
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
487182403fc2 dpage/pgadmin4:3.3 "/entrypoint.sh" 8 seconds ago Up 6 seconds 0.0.0.0:80->80/tcp, 443/tcp flask_tutorial_pgadmin4
1441abbc6c72 postgres:10.5 "docker-entrypoint.s…" 9 seconds ago Up 7 seconds 0.0.0.0:5432->5432/tcp flask_tutorial_postgresql
コンテナを落とす
docker-compose.yml
があるディレクトリでdocker-compose down
実行
$ docker-compose down
Stopping flask_tutorial_pgadmin4 ... done
Removing flask_tutorial_pgadmin4 ... done
Removing flask_tutorial_postgresql ... done
Removing network first_tutorial_default
初回実行スクリプトについて
create database flask_tutorial;
ポイント
- ファイル名の先頭に数字を入れると、その順番で実行してくれる
- 1_DB作成
- 2_テーブル作成
- 3_初期データ挿入
みたいな
- 今回は単純に
flask_tutorial
というDBを作成しているのみ
DB 確認
pgadmin4にアクセス
pgadmin4:
image: dpage/pgadmin4:3.3
container_name: flask_tutorial_pgadmin4
ports:
- 80:80
volumes:
- ./pgadmin:/var/lib/pgadmin
environment:
PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL}
PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD}
depends_on:
- postgresql
hostname: pgadmin4
コンテナ起動を起動した状態でhttp://localhost:80
にアクセスすると下記の画面が表示される
ポイント
Email Address
とPassword
は.env で設定した値
サーバ接続
pgadmin4にログインすると以下のように表示される。
Servers を右クリック |
Servers >作成 >サーバ... を選択すると以下が表示されるので設定していく |
ポイント
ホスト名/アドレス
はホストのIPアドレスを調べて入力すること
DB確認
flask_tutorialというDBが存在していることを確認
躓いた所
- DBの初期化に失敗した場合(sql間違えたとか)はDB/dataのディレクトリを削除しないと、初期化が再度実行されない
- postgresqlのデータのマウント先はディレクトリの権限を確認しないと、DBがそもそも立ち上ってくれなくなる。
次回
- flaskでDBに接続してみよう