Laravel を触ってみよう、ということで Mac 上の Docker に入れてみようとしましたが、躓いた点があったためメモ。
Laravel は初めてですし、Docker もちょっと触った程度なので、非常につまらないつまづきです。
ちなみに Dokcer のイメージは、以下のを使用
PHP 用コンテナ
FROM php:7.1-apache
COPY php.ini /usr/local/etc/php/
RUN apt-get update \
&& apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev libmcrypt-dev \
&& docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcrypt
MySQL 用コンテナ
FROM mysql:5.7
COPY ./my.cnf /etc/mysql/conf.d
いずれも、
cat /etc/issue
Debian GNU/Linux 9 \n \l
1. artisan が実行できない。
Voyager を入れようと思って、
php artisan voyager:install
とコマンドを打つと、
Could not open input file: artisan
と出てしまいました。ええ?と思ったのですが、artisan はプロジェクトのルート(artisan ファイルが置かれているディレクトリ)で実行しないといけない、というだけでした。
2. Laravel から MySQL につながらない
Laravel をインストールし終えて http://localhost/ が表示されるようになり、プロジェクト用のデータベースを作成し、次に php artisan migrate
しようとしたのですが、
SQLSTATE[HY000] [2002] No such file or directory
と出てしまい、失敗します。
.env
の DB_HOST の値を、 localhost
, 127.0.0.1
, MySQL のコンテナ名に変えるなどしてみますが、いずれもダメ。
原因と対応
Mac のターミナルから php artisan migrate
のコマンドを打っていたのが原因でした(それだけ >_<)。
docker exec -it PHPのコンテナ名 /bin/bash
でコンテナにログインして、 laravel プロジェクトのルートディレクトリから php artisan migrate
する必要がありました。
ちなみに、 試行錯誤の中、DB_HOST 名を以下のように指定した場合のメッセージをそれぞれ書き出してみます。
localhost の場合
SQLSTATE[HY000] [2002] No such file or directory
127.0.0.1 の場合
SQLSTATE[HY000] [2002] Connection refused
MySQL のコンテナ名の場合
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known
MySQL コンテナのIPアドレスの場合
SQLSTATE[HY000] [2002] Operation timed out
※ コンテナのIPアドレスは docker exec -it MySQLのコンテナ名 /bin/bash
でログインして、 cat /etc/hosts
で確認できます。
3. localhost/admin が Not Found
Voyager のインストールも終わって、いざ http://localhost/admin にアクセスしたのですが、 Not Found。
うーん、と思ったのですが、 apache の mod_rewrite が有効になっていないだけでした。
/etc/apache2/mods_available/rewrite.load
を /etc/apache2/mods_enabled
に移してコンテナを再起動すればOKでした。
終わりに
問題が、Laravel にあるのか Voyager にあるのか Docker にあるのか、Docker なら docker-compose.yml にあるのか確認すべき箇所がたくさんあって難儀しました。
少しでも参考になれば幸いです。自身は、そのうちまた同じところでつまづきそう。