Edited at

docker-composeでNginx+Gunicorn+Flask+MariaDB+phpMyAdmin

すぐに利用できる環境が欲しくてdocker-composeを使ってNginx-(Gunicorn‐Flask)-MariaDB-phpMyAdimn(4つのコンテナが起動)の環境を作成しました。


予定目次

あくまでも予定ですが今回構築した環境を使って作ってみようと思います。

1.環境構築 ※本記事

2.Flask+RoboBrowserでスクレイピングした結果をBootstrap(honoka)で表示

3.flask-sqlalchemyを使ってみる(MariaDBと接続)

4.flask-loginを使ってみる(ログイン機能実装)


参考資料

下記の記事の組み合わせで作成しています。

非常に参考になりました。この場を借りて御礼申し上げます。

Compose file version3のリファレンス

※docker-compose.ymlのdepends_onやenv_fileなどパラメータについて参考にさせていただきました。

docker-composeでgunicorn+nginx+flaskを動かしてみた話

※nginx+gunicorn+flask部分をそのまま利用させていただきました。

変更点:nginxのdefault.confを以下のように変更しないと起動できませんでした。


default.conf

  server_name  web:5000;


docker-compose でMySQL環境簡単構築

※初期テーブル作成部分で参考にさせていただきました。

※phpmyadmin部分の構築に利用させていただきました。

gunicornでPython製Webアプリケーションを動作させよう

※Gunicornの起動方法について参考にさせていただきました。

・本田崇智著 「ゼロからFlaskがよくわかる本: Pythonで作るWebアプリケーション開発入門」 Kindle 版.

※ファイル分割の方法を参考にさせていただきました。


環境

ホストOS:CentOS Linux release 7.6.1810 (Core)

Docker version 18.09.7, build 2d0083d

docker-compose version 1.24.0, build 0aa59064

git version 2.9.5


コンテナwebにインストールするモジュール

ビルド時に自動インストールされます。他に必要なものがあればrequirements.txtへ追記すればOKです。


requirements.txt

Flask==1.1.1

Flask-SQLAlchemy==2.4.0 ※
gunicorn==19.9.0
PyMySQL==0.9.3 ※
SQLAlchemy==1.3.5 ※

※今回は使用していませんが後々使用するためインストールしています。


ソース

https://github.com/kk7679/nginx-flask-maria


ディレクトリ構成

.

├── db
│ ├── Dockerfile
│ ├── backup
│ │ └── init.sql ※DBの初期化用ファイル
│ └── conf.env ※DBの設定ファイル
├── docker-compose.yml
├── nginx
│ ├── Dockerfile
│ ├── default.conf
│ ├── log
│ │ ├── access.log
│ │ └── error.log
│ └── nginx.conf
├── phpmyadmin
│ ├── Dockerfile
│ └── conf.env ※宛先データベース記載
└── web
├── Dockerfile
├── application
│ ├── __init__.py ※アプリケーション本体ファイル
│ └── views.py
├── requirements.txt ※追加pythonのモジュール記載
└── startup.py ※アプリケーション起動ファイル


docker-compose.yml


  • タイムゾーンを日本へ ※1

  • データベース初期化時にinit.sqlにてsample01とtest_tableを作成。 ※2

  • データベースのID/passはconf.envを書き換えください。※3

  • nginxとphpmyadminのポートは利用環境に合わせて変更ください。※4

  • データベースのデータを永続化 ※5


docker-compose.yml

version: '3'

services:

web:
build: ./web
container_name: web01
expose:
- 5000
depends_on:
- db
networks:
- test_network

nginx:
build: ./nginx
container_name: nginx01
ports:
- 8889:80 ※4
depends_on:
- web
environment: ※1
- "TZ=Japan"
restart: always
networks:
- test_network
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./nginx/log:/var/log/nginx

db:
build: ./db
container_name: db01
volumes:
- test_db_data:/val/lib/mysql ※5
- ./db/backup:/docker-entrypoint-initdb.d ※2
env_file:
- ./db/conf.env ※3
environment: ※1
- "TZ=Japan"
restart: always
networks:
- test_network

phpmyadmin:
build: ./phpmyadmin
container_name: phpmyadmin01
env_file:
- ./phpmyadmin/conf.env
depends_on:
- db
ports:
- 8888:80 ※4
networks:
- test_network

volumes:
test_db_data: {} ※5

networks:
test_network:
driver: bridge



動作確認

\$ git clone https://github.com/kk7679/nginx-flask-maria.git

\$ cd nginx-flask-maria

\$ docker-compose up -d --build

\$ docker-compose ps

001.jpg

http://[Dockerホストアドレス]:8889

002.jpg

http://[Dockerホストアドレス]:8888

003.jpg

phpMyAdminの認証についての補足


/etc/phpmyadmin/config.inc.php

###途中省略###

if (isset($_ENV['PMA_USER'])) {
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['user'] = $_ENV['PMA_USER'];
$cfg['Servers'][$i]['password'] = isset($_ENV['PMA_PASSWORD']) ? $_ENV['PMA_PASSWORD'] : '';
} else {
$cfg['Servers'][$i]['auth_type'] = 'cookie';
}
###途中省略###

上記のようにコンフィグファイルを確認するとPMA_USERをconf.envでセットすると認証画面が表示されません。

(auth_typeがconfigになる)

そのため「docker-compose でMySQL環境簡単構築」ではPMA_USER, PMA_PASSWORDをセットしていますが今回は削除しました。

rootのログインは禁止していません。dbのconf.envでセットしたID/PASSでログインできます。

またサーバには【db】を入力します。(dbコンテナが宛先サーバのため)