LaradockでDockerによる開発環境を手軽に構築

Laravelの開発環境をDockerで構築したい場合、Laradockの利用を検討してみてはどうでしょうか?PHPの開発環境を手軽に構築できるようにDockerの構成が組まれています。ここでは、Laradockを利用した開発環境構築方法について解説します。

Laradockとは?

Laravelの開発で必要になりそうな、 Nginx PHP MySQL Redis などの Dockerfile が用意されています。 docker-composeコマンド で開発に利用するサービスだけを選び起動させて利用します。

利用ケースに合えば、自身でDockerfileを作る必要がなく、素早く開発環境を構築できます。

laravel-laradock-image.png

参考サイト

作業環境

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

環境構築を進めていきます。今回は、 NginxMySQL をコンテナで立ち上げて、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にはデフォルトで、 gitcomposer がインストールされています。
さらに追加で xDebugNode を利用したい場合、 .env の設定を調整して下さい。

Laravelをインストール

composerで Laravel5.7myProjectフォルダ にインストールします。

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
DB_PASSWORD=secret

docker-compose.yml に記述した全てのサービス間に、自動的にリンクを張ってくれます。「ping サービス名」で自動的にリンクが貼られていることを確認できます。

そのため、 DB_HOSTmysql とサービス名を指定できます。

マイグレーション実行

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 が表示されました。

laravel-laradock-404.png

パス設定が正しくできていないようなので調整します。

共有フォルダのマウント設定

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;

.envAPP_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アプリケーションが呼ばれました。

laravel-laradock-200.png

Q&A

Laradockを利用すれば手軽に環境構築できますが、ハマりどころもあります。意図通り動作しないいときに参考になりそうな情報を紹介しておきます。

DBの情報はどこで永続化されている?

docker-compose.ymlmysql > 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つがあります。

下記サイトなど参考にしてみてください。