Docker-composeでBasic認証付き3層アーキテクチャ構築【実践記録12】

実践記録12

前回はDoker-composeを使用してNginxとPHPコンテナを作成、連携させてみました。
今回はそれを更に派生させて、Nginx+PHP+MySQLの3層構造を構築してみようと思います。

おまけでNginxにはBasic認証も付けます。

前回の記事は以下となります。

関連記事

実践記録11前回はDockerを使ってBasic認証機能付きのNginxコンテナを作成してみました。今回は少し拡張して、Nginx+PHPの実行環境をDocker-composeをインストールして作ってみたいと思います。実施環境[…]

実施環境

以下のVagrantfileを使用して構築した環境で実施します。

Docker-composeで3層アーキテクチャ(Nginx+PHP+MySQL)構築

Nginx、PHP、MySQLそれぞれのコンテナを作成して環境を作成していきたいと思います。
NginxやPHPについては前回までの実践記録で使用していたものを流用しつつ、MySQLとの連携用の定義を追加していきます。

まず、Nginx用のDockerfileは以下の通りです。

Nginxについては前回のNginx+PHPの2層構造を構築した際から特に定義は変更していません。
Basic認証の機能を付ける為にopennsslを導入しています。

続いてPHPについては以下の通りです。

特に重要なのは5行目のコマンドです。
PHP-FPMにはデフォルトでMySQL接続用のソフトウェアがインストールされていないので追加しています。

上記の2ファイルは稼働確認用のファイルです。
check.phpの方でMySQLに接続し、接続に成功すれば「Database connection successed」と表示されるようにしておきます。

最後にMySQLについてです。

ベースのコンテナは公式で公開されているものを使用します。
その後の認証方式の変更の定義が重要です。

1つ1つ解説していきます。

まず「COPY custom.cnf /etc/mysql/conf.d/custom.cnf」についてです。
cutom.cnfの定義内容は以下の通りです。

MySQLの接続する際にユーザー認証が行われますが、
認証方法が以下の2通りあります。

・mysql_native_password
・caching_sha2_password

MySQL 8.04 以降は後者のcachingの方がデフォルトの設定となっていますが、
MySQLに接続するPHPが現状「caching_sha2_password」に対応していないようです。

その為、上記の定義を追加してnative_password方式にしてやらないと以下のエラーが発生します。

Warning: mysqli_connect(): The server requested authentication method unknown to the client [caching_sha2_password]Warning: mysqli_connect(): (HY000/2054): The server requested authentication method unknown to the client
そしてもう一つの「RUN chmod 644 /etc/mysql/conf.d/custom.cnf」も上記の話に関連します。
認証方法を変更する為の定義を記載したcustom.cnfをDockerfileでコピーして配置しますが、
そのまま配置してしまうと権限が777でフルオープンの状態になります。
その状態のまま進むと以下の様なエラーが出て、定義ファイルの存在が無視されます。
※私はこれに中々気が付かず、だいぶ苦戦しました。。。
[Warning] World-writable config file ‘/etc/mysql/conf.d/custom.cnf’ is ignored.
その為ファイルの権限を変更しています。
Dockerfileの準備ができたところで、次はDocker-composeの定義を行います。
Nginx+PHPの2層構造を作った時に使用していない宣言としては、environment位ですね。

これはコンテナ起動時に使用する環境変数を渡す為の定義です。
直接内容を記載することもできますし、上記の様な書き方にして.envファイルから読み込ませることもできます。

ここまで準備ができたところで、以下コマンドで起動させてみます。

docker-compose up -d
その後ブラウザで私の場合は「http://192.168.33.20:8080/check.php」と打ち込みます。
※IPの部分は環境に合わせたものを指定してください。
Basic認証をかけているので最初に以下の様にパスワードを求められます。
 
ユーザー名・パスワードを入力後以下の様になればPHPを使ってMySQLに接続できています。
自分的には中々の達成感です!!
今回はここまでにします。
続きは以下の記事になります!
関連記事

実践記録13一度触れてみたかったJenkinsに挑戦してみたいと思います。環境は前回まででも使用したDockerを使ってさくっと準備していきます。DockerでJenkins環境の構築DockerHub上にJenkinsのイ[…]