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
をサポートすればそれがいいんだろうけど、開発環境だし
- このファイルをMySQLのコンテナに読ませるように
- docker/misc/data/ を削除して再度
docker-compose up
で対応した。
Nginxのウェルカムページが表示される
nginx.confにinclude /etc/nginx/conf.d/*.conf;
を記述するのを忘れていただけ…。
雑感
とりあえず開発環境を用意しただけだから実開発の中で思うところは出てくるんだろうけど、Vagrant + Ansibleよりもさらに環境を作って壊してをするコストが低くていいなと。
あとは本番環境との差異が出にくくなるように、ECSなりの勉強をする必要があるのかな。