Laravelの環境をDockerで構築する【PHP:7.1 + Nginx + MySQL:5.7】


みなさんDocker使ってますか? 私は毎日使っています。笑
今回は、Laravel環境をDockerで構築する機会があったのでまとめておこうと思います。

環境

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のテンプレートを作成しました。

もし気になる方がいたらのぞいてみてください。

[/Laravel_Template]

comments powered by Disqus