Posted at

はじめてのLaravel5+Docker

More than 3 years have passed since last update.

Dockerに入門してみました。

Dockerを活かそう!というわけでPHPにも入門しました。

せっかくなので新しい感じのするLaravelを触ってみようというわけでMac + Docker + Laravelという環境でやってみました。

以下、その記録です。


Dockerの準備

DockerでLAMP環境を作るには以下の記事を参考にしました。

Docker Hubのオフィシャルイメージを使ったLAMP環境(Apache+PHP+MySQL)構築

Docker Composeを使ってLAMP環境を立ち上げる

docker-composeを使うと複数コンテナの管理が便利に

今回の例では上記の参考記事(上2つ)で作成したDockerfileやdocker-compose.ymlがある前提で進めます。


Laravelの準備

composerが必要なのであらかじめインストールしておきます。

composer global require "laravel/installer=~1.1"

これでインストール完了です。

最初のプロジェクトを作成します。

composer create-project laravel/laravel MyFirstLaravel

"Application key [(ランダムな英数列)] set successfully."と表示されたら成功です。

ここで表示されているApplication keyは暗号化の際に使用されるランダムな英数列です。

MyFirstLaravelディレクトリが出来ているの移動して「.env」ファイルを開いてみます。

APP_ENV=local

APP_DEBUG=true
APP_KEY=(ランダムな英数列)

DB_HOST=localhost
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

〜略〜

ここのAPP_KEYに先ほど出力されたApplication keyの値が設定されているのが分かります。

DB系の設定はDockerの環境に合わせて編集します。

DB_HOST=l72.XX.X.XXX

DB_DATABASE=testdb
DB_USERNAME=root
DB_PASSWORD=pass

DB_HOSTはDocker上で動いているmysqlコンテナのホストを指定します。

DB_DATABASEにはデータベース名を指定します。

あらかじめmysqlに作成しておきましょう。

ユーザー名とパスワードも設定に合わせて指定します。


Laravel+Dockerの準備

Lalavelをdockerで動かすためにもう少しdocker-compose.ymlの編集が必要です。

最終的な記述は以下の通りです。


docker-compose.yml

mysql:

image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: testdb
MYSQL_USER: test
MYSQL_PASSWORD: testtest
volumes:
- ./my.cnf:/etc/mysql/conf.d/my.cnf
- /var/lib/mysql
container_name: mysql
php:
build: php
ports:
- "80:80"
volumes:
- ./MyFirstLaravel:/var/www/html
- ./apache2.conf:/etc/apache2/apache2.conf
links:
- mysql:mysql
container_name: php

mysqlでデータベース「testdb」を作成し、testユーザーを追加しています。

environment:

MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: testdb
MYSQL_USER: test
MYSQL_PASSWORD: testtest

php側のvolumesでapache2.confを上書きしています。

volumes:

- ./www:/var/www/html
- ./apache2.conf:/etc/apache2/apache2.conf

Laravelのプロジェクト全体がコンテナから見えるようにMyFirstLaravelを/var/wwww/htmlにマッピングしていますが、Laravelはさらにその下のpublicディレクトリがドキュメントルートであることを想定して動作します。

Laravel側で変更する方法があるんだろうとは思いますが、ここではコンテナ側のapache2.confを上書きしてドキュメントルートを/var/www/html/publicに変更しています。


apache2.conf

(省略)

DocumentRoot /var/www/html/public
(省略)

他の部分はコンテナに入っているapache2.confそのままから変更ありません。

phpコンテナはphpディレクトリにDockerfileを用意してビルドしています。

FROM php:5.6-apache

RUN apt-get update \
&& apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng12-dev libmcrypt-dev \
&& docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcrypt \

次にMyFirstLaravel直下のstorageディレクトリのパーミッションを変更してコンテナのapacheから書き込めるようにしておきます。

サブディレクトリも全て変更しておきます。

これをしておかないと500 Internal ServerErrorが返ってきてハマります。

これでようやくコンテナを起動できます。

docker-compose.ymlのあるディレクトリに移動して以下のコマンドを実行します。

docker-compose up -d

phpコンテナとmysqlコンテナが起動していることを「doker ps」で確認しましょう。

Laravelは最初にmigrateする必要があるので以下のようにして実行します。

docker exec -it php php artisan migrate

Dockerfileかdocker-compose.ymlで自動実行してくれる方法がありそうなんですが、わからず。。

とりあえず1コマンドだけ手動でながしこんでいます。

ブラウザからアクセスしてLaravelのWelcomeページが表示されれば成功です。

screen1.png