docker-compose
で動くLAMP環境を作った。
作りました。中身は
- PHP 7.2.3
- MySQL 8.0
- phpMyAdmin
という構成。
わかってみれば大したことではないのだが結構ハマって時間を溶かしてしまったので何かのお役に立てばということで書いておく。
LAMP使いたいだけなら↑のリポジトリcloneしてきて云々する方が早い。
Authentication plugin 'caching_sha2_password' cannot be loaded
と言われる
MySQLを立ち上げて、mysqlコマンドなりphpMyAdminなりで接続しに行くとAuthentication plugin 'caching_sha2_password' cannot be loaded
と言われてしまう。
当然認証情報は合ってるはず。
これは、MySQLの8からデフォルトの認証方式が、caching_sha2_passwordというものに変わったことに起因するようで、デフォルトを従来のmysql_native_passwordにするようにconfigに書いておくことで、従来のアプリケーションからでも利用できる。
MySQL公式のDockerイメージでは、/etc/mysql/conf.d/
以下にある.cnf
という拡張子のファイルを読み込んでくれるようになっているので私は以下のようなDockerfileと設定を書いてDockerイメージを作成した。
[mysqld]
default_authentication_plugin= mysql_native_password
FROM mysql:8
ADD ./change_default_auth.cnf /etc/mysql/conf.d/.
CMD ["mysqld"]
当然、volumeでコンテナの/etc/mysql/conf.d
をホストに持ってきてそこに設定ファイルを置くのでも構わないが、コンテナを起動するよりも前においておく必要がある。(コンテナを起動した時にユーザーが作成されるため)
PDOでMySQL使えない
続いてPDOでMySQLが使えない問題。
PHPのDockerイメージは軽くするために、最低限のものしか入っていないそうで、PDOのMySQLドライバーも標準では入っていない。
そこで、これも公式のPHPのイメージをベースにした以下のようなDockerfileを書いて解決した。
FROM php:7.2.3-apache
RUN apt update &&\
docker-php-ext-install pdo_mysql &&\
echo 'date.timezone = Asia/Tokyo' >> /usr/local/etc/php/conf.d/99_myconf.ini
CMD ["apache2-foreground"]
拡張をインストールするためのUtilがDockerイメージに含まれているのでそれを使う(RUNの2行目docker-php-ext-install
がそれ)
ついでにタイムゾーンも合わせておく。