Help us understand the problem. What is going on with this article?

Docker + Laravel で躓いていた点

More than 1 year has passed since last update.

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 にあるのか確認すべき箇所がたくさんあって難儀しました。

少しでも参考になれば幸いです。自身は、そのうちまた同じところでつまづきそう。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away