Laravelの環境をDockerで構築する【PHP:7.1 + Nginx + MySQL:5.7】
みなさんDocker使ってますか? 私は毎日使っています。笑
今回は、Laravel環境をDockerで構築する機会があったのでまとめておこうと思います。
環境
- Docker 18.03.0-ce
- PHP 7.1
- MySQL 5.7
- Nginx
Dockerは、あらかじめインストール済みだという前提ですすめていきます。
LEMP環境を構築する
一歩ずつ進めていきましょう。
Laravelをインストールする前に、docker-compose.ymlやDockerfile、その他必要な設定ファイルを作成して、最低限の構成でLEMP環境を作成します。
構成
Laravel_app
|——- docker-compose.yml
|——- php/
| |- Dockerfile
| |- php.ini
|——- nginx/
| |- default.conf
|——- src/
| |- index.php
| |- index.html
1.雛形を作成する
上の構成を参考にして雛形を作成してください。
構成は、のちのち整理していきますので、とりあえずこの形で準備しておきましょう。
$ mkdir laravel_app
$ touch docker-compose.yml
$ mkdir php nginx src
$ cd php
2.docker-compose.ymlを編集する
version: '2'
services:
php:
build: ./php
volumes:
- ./src:/var/www
nginx:
image: nginx
ports:
- "80:80"
volumes:
- ./src:/var/www
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: testdb
Webアプリケーションは、複数はWebサーバーやアプリケーションサーバー、DBなど複数のコンテナを組み合わせて構築します。
docker-compose.ymlを書くことで、記述しておいた設定にしたがって、一度に全てのコンテナを立ち上げることが可能です。
3.PHP関連の設定
PHPに関しては、php/以下にあるDockerfileを参照させます。Dockerfileを参照することで、コンテナの起動、構成、イメージの作成まで一気に行うことができます。
Dockerfileを次のように編集してください。
FROM php:7.1-fpm
COPY php.ini /usr/local/etc/php/
# install composer
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim
WORKDIR /var/www
Webサーバーでnginxを用いるためCGI版PHPのimage、php7.1-fpmを使用します。
php.iniには、timezoneやencodingなどのPHPの最低限の設定を記述しておきます。
加えてcomposerやgit、zipなど必要なライブラリー群もインストールしておきましょう。
php/php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
4.nginx関連の設定
nginxはポート80を解放し、設定ファイルであるdefault.confを配置します。
depends_onを記述することによって、nginxからphpという名称で、PHPのコンテナにアクセスできるようになります。 後にnginxの設定ファイル内で使用するので覚えておきましょう。 default.confを以下のように編集してください。
default.conf
server {
index index.php index.html;
root /var/www;
}
5. HTMLの表示
src/index.htmlを次にように編集してください。
index.html
Hello Laravel!
これで、Dockerを立ち上げる準備が整いました。 試しにDockerを立ち上げて、htmlを返してみましょう。 コンテナをビルドする。
$ docker-compose up -d --build
localhost:80/にアクセスして、Hello Laravel!と表示されていれば成功です。 しばらく時間がかかりますが、気長に待ちましょう。
6. PHPの表示
HTMLをPHPに置き換えます。
src/に、index.phpを配置して次のように記述してください。
index.php
<?php
phpinfo();
?>
同時に、nginx/default.confを次のように変更します。
default.conf
server {
index index.php index.html;
root /var/www/;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
fastcgiに関してはQita[こちら]によくまとめられていたので参考までに。
docker-compose.ymlにてdepend_on :phpとしたのを覚えていますか? こうすることで、nginxからphpという名称でアプリケーション側にアクセスできます。 fastcgi_pass php:9000のphpは、これを用いています。 それでは、再び立ち上げてみましょう。
$ docker-compose restart
この時再度 lacalhost:80/にアクセスしてPHP INFO画面が出力されていれば、成功です。
これで、LEMP環境が構築できました。
Laravelのインストール
ようやく下地が完成したので、いよいよLaravelをインストールしていきます。 LaravelはcomposerというPHPのライブラリー管理ツールを用いて インストールします。Rubyでいうところのbundlerみたいな感じですかね。
docker-compose.ymlを編集
参照するパスを変更します。
docker-compose.yml
//7行目
- ./src:/var/www から - ./src/my-app:/var/www に変更
//14行目
- ./src:/var/www から - ./src/my-app:/var/www に変更
続いてdefault.confを編集します。同様に参照するパスを変更します。 nginxの設定に関して、時間があるときに勉強したいですね。
default.conf
//3行目
root /var/www/; から root /var/www/public; に変更
インストール
次のコマンドで、Laravelをインストールします。 こちらも、しばらく時間がかかりますが、気長に待ちましょう。
$ docker-compose run php composer create-project laravel/laravel --prefer-dist my-app
docker-compose run サービス名 コマンドで指定したサービスのコンテナ内にてコマンドを実行できます。 順調にインストールが進んでいる様子です。
うまくインストールが完了したら、http://localhost:80へアクセスしてみてください。
Laravelのトップページが表示されるはずです。
もし、Not Foundなんかが出た場合は、ディレクトリ関係がずれてしまっている可能性があるので、調査してみてください。
MySQLとの接続
最後に、LavavelとMySQLとの接続を調整しておきましょう。 .envを確認をします。 DBに関する設定をいろいろ書いています。
DB_HOSTはlocalhostとする記事をよく見かけますが、自分はmysqlとしないと動かなかったので、気をつけてください。
.env
APP_NAME=Laravel
APP_ENV=local
APP_DEBUG=true
APP_KEY=base64:lf8BZApPwX4FBT3vM29/QJ7oFVrVRBQifAug3Ds9T8I=
APP_URL=http://127.0.0.1:80
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=development
DB_USERNAME=root
DB_PASSWORD=testdb
DB_CHARSE=utf8
DB_COLLATION=utf8_general_ci
最後に
少し遠回りでしたが、自分はこの方法で、すんなりと自分の中に落とし込むことができました。初Laravelで試行錯誤しながらの環境構築でしたが、なんとか形にすることができました。 その後、ディレクトリ構成を変更して、その他テストツールや静的解析のツールなどを導入し、簡単なLaravelのテンプレートを作成しました。
もし気になる方がいたらのぞいてみてください。