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

すぐに利用できる環境が欲しくてdocker-composeを使ってNginx-（Gunicorn‐Flask）-MariaDB-phpMyAdimn（４つのコンテナが起動）の環境を作成しました。
#予定目次
あくまでも予定ですが今回構築した環境を使って作ってみようと思います。
１．環境構築 ※本記事
２．[Flask+RoboBrowserでスクレイピングした結果をBootstrap(honoka)で表示](https://qiita.com/kk7679/items/f12e2794b1bb0625d9fa)
３．[flask-sqlalchemyを使ってみる（MariaDBと接続）](https://qiita.com/kk7679/items/be0e428418bcc4c4be0e)
４．flask-loginを使ってみる（ログイン機能実装）

#参考資料
下記の記事の組み合わせで作成しています。
非常に参考になりました。この場を借りて御礼申し上げます。
・[Compose file version3のリファレンス](https://qiita.com/goforbroke/items/b4a071af71f457960e59)
※docker-compose.ymlのdepends_onやenv_fileなどパラメータについて参考にさせていただきました。

・[docker-composeでgunicorn+nginx+flaskを動かしてみた話](https://qiita.com/arata-honda/items/e22c9df83df8ee0e9c4c)
  ※nginx+gunicorn+flask部分をそのまま利用させていただきました。
  変更点：nginxのdefault.confを以下のように変更しないと起動できませんでした。

```default.conf
  server_name  web:5000;
```
・[docker-compose でMySQL環境簡単構築](https://qiita.com/A-Kira/items/f401aea261693c395966)
※初期テーブル作成部分で参考にさせていただきました。
※phpmyadmin部分の構築に利用させていただきました。

・[gunicornでPython製Webアプリケーションを動作させよう](https://blog.hirokiky.org/entry/2018/10/06/151830?utm_source=feed)
※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](https://github.com/kk7679/nginx-flask-maria.git)

#ディレクトリ構成
```
.
├── 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188071/03c37530-531b-9b10-c28f-947bf739fe39.jpeg)

http://[Dockerホストアドレス]:8889
![002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188071/f56570da-8b56-d6d8-fbc7-353509feba78.jpeg)

http://[Dockerホストアドレス]:8888
![003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188071/0bddb32a-9470-7134-7f51-7a3646706c43.jpeg)

*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環境簡単構築](https://qiita.com/A-Kira/items/f401aea261693c395966)」ではPMA_USER, PMA_PASSWORDをセットしていますが今回は削除しました。
rootのログインは禁止していません。dbのconf.envでセットしたID/PASSでログインできます。
またサーバには【db】を入力します。（dbコンテナが宛先サーバのため）