laradockでlaravelの開発環境構築

Tag:

laravelの開発環境にdockerを利用したかったのと、dockerの勉強をかねてlaradockを利用してみました。

laradockとは?

LaraDockは、PHPの開発環境を手軽に構築できるように、dockerの構成が組まれています。docker-composeで利用する複数のコンテナを起動して利用します。設定ファイルを修正すれば、laravel以外のphpアプリケーションでも利用できます。

手軽に環境構築したい、複数コンテナの構成について勉強したいといったケースに良いのかと。

※docker-composeとは
複数コンテナを管理するためのもの。複数コンテナの設定情報は、yaml形式で書かれている。

https://github.com/laradock/laradock
http://laradock.io/

作業環境

macで作業します。「docker for mac」をインストールしてます。

$docker -v
Docker version 1.13.1, build 092cba3

$docker-compose -version
docker-compose version 1.11.1, build 7c5d5e4

$docker-machine --version
docker-machine version 0.9.0, build 15fd4c7

開発環境構築手順

laradockを利用して、新規にLaravelプロジェクトを開発するための環境を構築してみます。

laradockをダウンロード

$mkdir myProjects
$cd myProjects/
$git clone https://github.com/LaraDock/laradock.git

.envを作成

$cd laradock/
$cp env-example .env

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

共有フォルダのマウント設定はdocker-compose.ymlで確認すると次のようになっていました。

    applications:
        image: tianon/true
        volumes:
          - ${APPLICATION}:/var/www

そのため「.env」にAPPLICATIONの設定を追記します。

$vi .env

下記内容を追記。

APPLICATION=../

dockerコンテナを起動

$docker-compose up -d nginx mysql
$docker-compose ps
         Name                        Command               State                     Ports                   
------------------------------------------------------------------------------------------------------------
laradock_applications_1   /true                            Exit 0                                            
laradock_mysql_1          docker-entrypoint.sh mysql ...   Up       0.0.0.0:3306->3306/tcp                   
laradock_nginx_1          nginx                            Up       0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp 
laradock_php-fpm_1        php-fpm                          Up       9000/tcp                                 
laradock_workspace_1      /sbin/my_init                    Up       0.0.0.0:2222->22/tcp                   

「docker inspect」でコンテナのマウント情報を確認してみます。

$docker inspect laradock_workspace_1 | grep -A 4 Mounts
        "Mounts": [
            {
                "Source": "/test/myProjects",
                "Destination": "/var/www",
                "Mode": "",
$
$docker inspect laradock_nginx_1 | grep -A 4 Mounts
        "Mounts": [
            {
                "Source": "/test/myProjects",
                "Destination": "/var/www",
                "Mode": "",

laravelをインストール

workspaceにログインして、laravelをインストールします。

workspaceにログイン。

$docker-compose exec workspace bash
root@8a725f682d1b:/var/www#

osはUbuntuです。

root@8a725f682d1b:/var/www# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"
workspaceにはデフォルトで、gitやphpがインストールされています。
さらに追加でxDebugやNodeを利用したい場合、.envの設定を変更します。

composerでlaravelをインストールします。

root@8a725f682d1b:/var/www# composer create-project laravel/laravel myProject 5.2.* --prefer-dist
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Installing laravel/laravel (v5.2.31)
  - Installing laravel/laravel (v5.2.31)
    Downloading: 100%         

Created project in myProject
> php -r "copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing vlucas/phpdotenv (v2.4.0)
                  :
                (省略)
root@8a725f682d1b:/var/www#
root@8a725f682d1b:/var/www# exit

コンテナ上の「/var/www」ホスト上の「../」を共有するように設定したため、ホスト上の「../」でインストールしたlaravelプロジェクトを確認できます。

$ls ../
laradock        myProject

nginxの設定変更

$vi nginx/sites/default.conf 

次のように修正。

-    root /var/www/public;
+    root /var/www/myProject/public;

コンテナ再起動

変更した設定を反映させるため、コンテナを再起動します。

$docker-compose stop
$docker-compose up -d nginx mysql

ブラウザから「localhost」にアクセスして、laravelが利用できていることを確認できました。

mysqlの設定変更

laravelのmigrationを実行するとこまで確認していきます。

mysqlのdockerイメージを作る際に、「mysql/startup」が実行されて、DBやDBユーザーが生成されます。

startupファイルは以下のようになっています。

DROP USER IF EXISTS 'MYSQL_USER'; 
CREATE USER 'MYSQL_USER'@'%'; 
CREATE DATABASE IF NOT EXISTS MYSQL_DATABASE; 
GRANT ALL ON MYSQL_DATABASE.* TO 'MYSQL_USER'@'%' IDENTIFIED BY 'MYSQL_PASSWORD';

.envに設定したUSERやDBの値に置換されて実行されます。

.envのMySQLに関する設定は、デフォルトで以下のようになっていました。

### MYSQL Container
MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root

このまま実行してみたところDBが作成されませんでした。MySQLでdefaultというDBは作成できないためです。DB名の変更が必要です。

ここでは、以下のように変更します。

### MYSQL Container
MYSQL_DATABASE=test_db
MYSQL_USER=user
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root

docker imageを作り直します。「–build」オプションを付与して実行します。

$docker-compose stop
$docker-compose up --build -d nginx mysql

Sequel Proで接続するには以下のように「.env」で設定した値を入力します。

Laravelのマイグレーション実行

laravelの「.env」のDB設定を以下のようにします。

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=test_db
DB_USERNAME=user
DB_PASSWORD=secret

docker-compose.ymlの1行目でversion指定をしてますが、version2ですと、docker-compose.ymlに記述した全てのサービス間に自動的にリンクを張ってくれるようです(version1ではlinksを利用していた)。「ping サービス名」で自動的にリンクが貼られていることを確認できます。

そのため、laravelの「.env」のDB_HOSTに「mysql」とサービス名を指定できます。

では、workspaceに入って、マイグレーションを実行してみます。

$ docker-compose exec workspace bash
root@b9a9062f14ba:/var/www# cd myProject
root@b9a9062f14ba:/var/www/myProject# php artisan migrate
Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table

マイグレーションの実行まで確認できました。

状況に合わせたlaradockの利用

今回は新規作成だったので、以下のようなフォルダ構成となってます。

- myProjects
    - laradock
    - myProject

1つのdocker環境で複数プロジェクトを扱いたい場合、以下のようになるかと。
(参考 http://laradock.io/#B)

- myProjects
  - laradock
  - myProjectA
  - myProjectB

それぞれGitHubで管理しているならば、以下のような手順になるかと。

1. myProjectsフォルダを作成。
2. myProjectsフォルダ内で下記作業実施。
  - laradockをclone
  - myProjectAをclone
  - myProjectBをclone
3. 「laradock」の「nginx/sites配下」にある「project-n.conf」にて各Projectを示すように設定。
4. ローカルの「/etc/hosts」に各Projectごとのドメインを設定。

スポンサーリンク