Laravelの開発環境をDockerで構築したい場合、Laradockの利用を検討してみてはどうでしょうか?PHPの開発環境を手軽に構築できるようにDockerの構成が組まれています。ここでは、Laradockを利用した開発環境構築方法について解説します。
Laradockとは?
Laravelの開発で必要になりそうな、 Nginx
PHP
MySQL
Redis
などの Dockerfile
が用意されています。 docker-composeコマンド
で開発に利用するサービスだけを選び起動させて利用します。
利用ケースに合えば、自身でDockerfileを作る必要がなく、素早く開発環境を構築できます。
参考サイト
作業環境
macで作業します。「docker for mac」をインストールしてます。
$ docker -v
Docker version 18.06.1-ce, build e68fc7a
$ docker-compose -version
docker-compose version 1.22.0, build f46880f
$ docker-machine --version
docker-machine version 0.15.0, build b48dc28d
フォルダ構成
今回紹介する方法で環境構築した場合、最終的に以下フォルダ構成になります。
.
└── laravel_projects
├── laradock # laradockをインストール
└── myProject # laravelをインストール
環境構築|Laradock
環境構築を進めていきます。今回は、 Nginx
と MySQL
をコンテナで立ち上げて、Laravelを実行するための環境を構築します。
Laradockをインストール
laravel_projects
というフォルダを作成して、その中でLaradockをインストールします。
$ mkdir laravel_projects
$ cd laravel_projects/
$ git clone https://github.com/LaraDock/laradock.git
.envファイルを作成
docker-compose.yml
が参照する .envファイル
を作成します。.envファイル
は、 env-exampleファイル
をコピーして作成します。
$ cp env-example .env
MySQLの設定調整
.envファイル
を編集して、以下のようにMySQLの設定を調整します。
MYSQL_VERSION=latest
MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d
MYSQL_VERSION=5.7
MYSQL_DATABASE=sample-app
MYSQL_USER=wakuwaku
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d
mysqlのdockerイメージを作る際に、DBやDBユーザーが生成されます。
コンテナ立ち上げ
Dockerコンテナを立ち上げます。
$ docker-compose up -d nginx mysql
以下のように、コンテナが立ち上がりました。
$ docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------------------------------------
laradock_docker-in-docker_1 dockerd-entrypoint.sh Up 2375/tcp
laradock_mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcp
laradock_nginx_1 nginx Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
laradock_php-fpm_1 docker-php-entrypoint php-fpm Up 9000/tcp
laradock_workspace_1 /sbin/my_init Up 0.0.0.0:2222->22/tcp
環境構築|Laravel
Laradockでは、「Laravelのインストール」「マイグレーションの実行」といった作業を workspaceコンテナ
で行います。 workspaceコンテナ
にログインしてLaravelをインストールします。
workspaceにログイン
$ docker-compose exec workspace bash
root@0533c83812ba:/var/www#
OSは Ubuntu
が利用されています。
root@0533c83812ba:/var/www# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS"
workspaceにはデフォルトで、 git
や composer
がインストールされています。
さらに追加で xDebug
や Node
を利用したい場合、 .env
の設定を調整して下さい。
Laravelをインストール
composerで Laravel5.7
を myProjectフォルダ
にインストールします。
root@0533c83812ba:/var/www# composer create-project --prefer-dist laravel/laravel myProject 5.7.*
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Installing laravel/laravel (v5.7.13)
- Installing laravel/laravel (v5.7.13): Downloading (100%)
Created project in myProject
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 72 installs, 0 updates, 0 removals
- Installing vlucas/phpdotenv (v2.5.1): Downloading (100%)
(省略)
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: beyondcode/laravel-dump-server
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
> @php artisan key:generate --ansi
Application key set successfully.
rootユーザーなので、 Do not run Composer as root/super user! See https://getcomposer.org/root for details
という警告がでましたが、インストール自体は無事できました。
.envファイルを調整
myProjectフォルダに移動して、Laravelの .env
を調整します。
root@0533c83812ba:/var/www# cd myProject/
root@0533c83812ba:/var/www/myProject# vi .env
Laradockの .env
に合わせて、以下のように設定しました。
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=sample-app
DB_USERNAME=wakuwaku
docker-compose.yml
に記述した全てのサービス間に、自動的にリンクを張ってくれます。「ping サービス名」で自動的にリンクが貼られていることを確認できます。
そのため、 DB_HOST
に mysql
とサービス名を指定できます。
マイグレーション実行
DB設定調整が正しくできていれば、マイグレーションを実行できます。
root@0533c83812ba:/var/www/myProject# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table
ブラウザからアクセス
ブラウザから「localhost」にアクセスすると、 404 Not Found
が表示されました。
パス設定が正しくできていないようなので調整します。
共有フォルダのマウント設定
nginxの設定は以下のようになっています。共有フォルダのマウントを調整することで、Laravel内の publicフォルダ
に紐付けられます。
$ head -n 8 nginx/sites/default.conf
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
server_name localhost;
root /var/www/public;
index index.php index.html index.htm;
.env
の APP_CODE_PATH_HOST
で共有フォルダのマウント設定を調整できます。
myProjectフォルダ配下にLaravelをインストールしたので、以下のように修正します。
APP_CODE_PATH_HOST=../
APP_CODE_PATH_HOST=../myProject
設定反映
設定反映させるには、コンテナを再起動させる必要があります。
$ docker-compose stop
$ docker-compose up -d nginx mysql
マウント確認
docker inspect
でコンテナのマウント情報を確認してみます。
$ docker inspect laradock_nginx_1 | grep -A 5 "Mounts"
"Mounts": [
{
"Type": "bind",
"Source": "/laravel_projects/myProject",
"Destination": "/var/www",
"Mode": "cached",
$
$ docker inspect laradock_workspace_1 | grep -A 5 "Mounts"
"Mounts": [
{
"Type": "bind",
"Source": "/laravel_projects/myProject",
"Destination": "/var/www",
"Mode": "cached",
/laravel_projects/myProject
が コンテナ内の/var/www
にマウントされていることを確認できます。
アクセス確認
再度、ブラウザから「localhost」にアクセスします。今度は、Laravelアプリケーションが呼ばれました。
その他
Laradockを利用すれば手軽に環境構築できますが、ハマりどころもあります。意図通り動作しないいときに参考になりそうな情報を紹介しておきます。
DBの情報はどこで永続化されている?
docker-compose.yml
の mysql > volumes
で確認できます。
デフォルトであれば、 ~/.laradock/data/mysql/
になります。
なので、 ~/.laradock/data/mysql/
を削除するとDB情報が失われます。
コンテナが立ち上がらない
様々な理由がありますが、ログを確認すると原因を特定しやすくなります。
# mysqlの場合
docker-compose logs mysql
# nginxの場合
docker-compose logs nginx
マイグレーションが失敗する
MySQL 8
を利用すると、マイグレーション実行時に、以下のようなエラーがでました。
Illuminate\Database\QueryException : SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
MySQL8のデフォルトの ユーザ認証方式
がLaravel側で対応されていないため発生します。
対象方法としては、
MySQL 5.7
を利用する- 認証方式を変更する
の2つがあります。
下記サイトなど参考にしてみてください。