DockerでCakePHP3 + Nginx + MySQLの開発環境を作る

完成品はこちら
https://github.com/nishim/docker-cakephp3

背景

仕事でCakePHP3を使っているけど、ローカルはWindows + xampp、本番はRHEL系だからWindowsが故のハマりポイントにハマることがあって。
で、問題を解決すべくVagrant or Docker化したいけど、Vagrant + Ansibldはそこそこ遊んだのでじゃあまあDocker使ってみようかなと。

※あと家のMacBookAirはストレージ128GBだからVMは容量圧迫してつらい…

環境

  • macOS Sierra
  • Docker 18.03.1-ce

各コンテナはPHPは7.2、MySQLは8、Nginxは特にこだわりなし、といった感じ。

開発に必要な操作など

cake他CakePHP関係のコマンドを実行する

ホストからPHP用のコンテナに入って、

$ docker exec -it app bash

コンテナ内で普通に./bin/cakeすればOK。

# cd /var/www/html/
# ./bin/cake version
3.6.4

コンテナ内でbakeで生成したファイルはホスト側でも普通に参照できる。

ホストからMySQLに接続する

$ mysql -u user -p -P 33306 -h localhost --protocol=tcp
Enter password:

ハマったところ

Dockerだからハマった、というのはほぼなくて、各々の設定不備とか知識不足によるところが多かった。

MySQLにホストから接続できない

mysqlコマンドで接続しようとすると、次のようなエラーが出た。

ERROR 2059 (HY000): Plugin caching_sha2_password could not be loaded: dlopen(/usr/local/Cellar/mariadb/10.2.10/lib/plugin/caching_sha2_password.so, 2): image not found

stackoverflowのこの質問にある通り、デフォルトの認証プラグインとしてmysql_native_passwordを使えばOKとのこと。

原典にあたらねばとMySQL :: MySQL 8.0 Reference Manual :: 6.5.1.3 Caching SHA-2 Pluggable Authenticationを見るとIn MySQL 8.0, caching_sha2_password is the default authentication plugin rather than mysql_native_password.とあり、デフォルトのプラグインが変わり、かつクライアントがまだそれをサポートできていないが故のエラーだとわかった。

クライアントがCaching SHA-2 Pluggable Authenticationをサポートすればそれがいいんだろうけど、開発環境だし

  1. このファイルをMySQLのコンテナに読ませるように
  2. docker/misc/data/ を削除して再度docker-compose up

で対応した。

Nginxのウェルカムページが表示される

nginx.confにinclude /etc/nginx/conf.d/*.conf;を記述するのを忘れていただけ…。

雑感

とりあえず開発環境を用意しただけだから実開発の中で思うところは出てくるんだろうけど、Vagrant + Ansibleよりもさらに環境を作って壊してをするコストが低くていいなと。
あとは本番環境との差異が出にくくなるように、ECSなりの勉強をする必要があるのかな。

参考