Laradockを使ったLaravel開発環境構築のやさしい解説

こんにちは!

今月からSCOUTER開発部でフロントエンドエンジニアをしている匠平@show60です。

弊社開発部では主にVue.jsとLaravelを使って開発をしています。

私も日頃はVue.jsを使ったフロントエンドの開発を担当させてもらっていますが、あわせてLaravelの学習も始めました。

さっそく開発環境の構築を始めたのですが、知らないことだらけのなかなか大変な作業で、新年から涙しそうでした。

これからLaravelを始めようという方が悲しみに暮れないよう、Laravel開発環境構築をやさしくやさしく解説したいと思います。

サマリ

  • マイグレートしてデータベースを作るまでを解説
  • 起きるかもしれないエラーにも言及

開発環境について

  • MacBook Air
  • Git
  • Laradock

Laradockとは

公式ウェブサイトには、Laravel(PHP)のプロジェクトをDocker上で動作させるためのワンダフルな環境とあります。

A full PHP development environment for Docker. Includes pre-packaged Docker Images, all pre-configured to provide a wonderful PHP development environment. Laradock is well known in the Laravel community, as the project started with single focus on running Laravel projects on Docker. [Laradock official] (https://laradock.io)

Laravelプロジェクトの開発環境はいくつもありますが、今回はこのワンダフルなLaradockを使って環境構築を行っていきます。

Laradockを使う上で、最低限知っておきたい基礎知識

きちんとした解説はもっと詳しい方へ譲るとして、開発環境を整える上で最低限理解しておきたいこと、また理解しておけばよかったと思ったことです。

なぜ仮想環境が必要なのか

Laravelの実行にはいくつものプログラムやライブラリが必要になります。例えばPHP, nginx, MySQLやミドルウェアなどです。

ある特定の環境でしか動かないプログラムなどに対応するために、1つのPC上に複数の環境を用意する必要がありますが、1つのOS上には1つの環境しか用意できないため、仮想のOS環境を用意する必要があります。

Docker、コンテナとは

Dockerはコンテナ型と呼ばれる仮想環境の1つです。仮想環境は他にホスト型、ハイパーバイザー型があります。

Dockerはコンテナという区画を複数提供することで、ある区画ではPHPアプリケーションを、別の区画ではMySQLを実行するというように隔離された実行環境を実現します。 隔離されている各区画(コンテナ)同士は、TCPという通信プロトコルで接続されます。

Laradockの導入

Laradockのダウンロード

ホームディレクトリにLaradockをダウンロードするために、ディレクトリを作成します。名前は任意で、ここでは「laravel_study」という名前にしました。

ダウンロードが完了したら、laradockに移動して.envファイルを作成します。

// laravel_studyディレクトリに移動
$ cd laravel_study

// GitからLaradockをダウンロード
laravel_study $ git clone https://github.com/Laradock/laradock.git

// ダウンロードができたらlaradockに移動
$ cd laradock

// env-exampleをコピペして.envファイルを作成
laradock $ cp env-example .env

このあとにMySQLをダウンロードしますが、先にバージョンを指定してあげます。

指定しない場合、latest(最新)バージョンをダウンロードします。投稿時点で最新バージョンである8系からはユーザー認証方式が違っており、私はここでかなり詰まってしまいました。

よんどころない理由がなければ、5.7を指定しましょう。

作成した.envファイルをテイストエディタで開いて、MYSQL_VERSIONを修正し保存します。

// "MYSQL_VERSION=latest" を以下のように変更
MYSQL_VERSION=5.7

コンテナの初期化

下記のように、nginx, MySQL, workspaceやphpMyAdminなど開発に必要なプログラムを指定してダウンロードします。これらが各コンテナで実行されることになります。 初めてダウンロードする際には20分ほど時間がかかります。

$ docker-compose up -d nginx mysql workspace phpmyadmin

各プログラム名の横にある進捗が"... done"となれば完了です。

http://localhostにアクセスすると404 Not Foundと表示されます。一見失敗に見えますが、ページにはnginxと表示されており、すでにコンテナ上でプログラムが実行されていることが分かります。

「docker-compose up ...」というコマンドは、これらのプログラムを実行する際に入力します。初回のみダウンロードに時間を要しますが、次回以降はほとんど待たずに実行します。

Laravelアプリケーションファイルの準備

Laravelプロジェクトは先ほどダウンロードしたworkspaceコンテナで実行されます。

workspaceにログインし、ここでは「sample」という名前でLaravelアプリケーションファイルを作成しました。その際にLaravelのバージョン5.5系を指定しています。なお、Laravelアプリケーションファイル名を「Laravel」にしてしまうとエラーが出るようなのでご注意ください。 Laravelのダウンロードには5〜10分ほど時間がかかります。

// wordspaceコンテナにログイン
$ docker-compose exec --user=laradock workspace bash

// ログインすると"/var/www$" というディレクトリに入ります
// workspace上でLaravelアプリケーションファイルを作成します
$ composer create-project laravel/laravel sample --prefer-dist "5.5.*"

// "Application key [base64:****] set successfully." となれば完了
// workspaceコンテナからログアウト
$ exit

workspaceコンテナで新たに「sample」という名前のアプリケーションファイルを作成できました。ここにLaradockがアクセスできるよう、Laradockディレクトリの.envファイルを修正します。先ほど.env-exampleをコピペして作ったものです。 Pathsの項目にあるAPP_CODE_PATH_HOST=../sampleと追記します。

### Paths #################################################

# Point to the path of your applications code on your host
APP_CODE_PATH_HOST=../sample

dockerを再起動します。.envファイルを修正した際には再起動が必要です。

# dockerを停止
$ docker-compose stop

# dokcerを再起動
# ここではnginx と MySQLだけ指定しています
$ docker-compose up -d nginx mysql

Laravelのアプリケーションファイルとそのパスを設定できたのでLaravelのページを開いてみましょう。 再度ブラウザでhttp://localhostにアクセスすると、無事Laravelのアプリケーションが起動していることが確認できます。

マイグレーションしてテーブルを作成する

MySQLにユーザー情報を登録できるテーブルを作成します。マイグレーションという機能を使うことで、テーブルの新規作成や実行を簡単に行うことができます。 マイグレーションに必要なファイルはすでに用意されているのでそちらを使います。

sample/
  └ database/
    ├ factories/
    ├ migrations/
    │  ├ 2014_10_12_000000_create_users_table.php
    │  └ 2014_10_12_000000_create_password_resets.php
    └ seeds/

マイグレーションファイルはテーブルの設計図のようなものです。今回は編集は加えずに、そのままマイグレーションを実行します。

// sampleディレクトリに移動
$ cd
$ cd laravel_study/sample

// マイグレーションの実行
$ php artisan migrate
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table
Migrating: 2014_10_12_000000_create_password_resets_table
Migrated: 2014_10_12_000000_create_password_resets_table

// マイグレーション完了

これでMySQLに新しいテーブルが作成されました。

マイグレーションの際に出たエラー

マイグレーションの段階で何度もエラーに遭遇し、その度に悲しい思いをしてきました。

一部ですが、実際に出たエラーとその対処法を紹介します。

SQLSTATE[HY000] [1045] Access denied for user 'ユーザー名'@'ホスト名' (using password: [YES/NO])

MySQLにログインできないよ、というエラーです。

using passwordYESの場合はユーザー設定の間違い、NOの場合はログインのパスワードの間違いが原因です。

私の場合はYESとなっており、ユーザー名が違っていました。Laradocksampleのそれぞれのディレクトリの.envファイル内のDB_USERNAMEのパラメータを合わせる必要があります。sampleディレクトリ側の.envファイルを編集、保存し、dockerを再起動することで解消しました。

"SQLSTATE[HY000] [2002] Connection refused

MySQLが起動していないよ、というエラー。

docker-compose up -d nginx mysqlで立ち上げましょう。

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)

  • MySQLに接続する通信プロトコルは、TCP通信とソケット通信の2種類ある。
  • localhostがsocket使いたがるので、TCPに変更(127.0.0.1)する必要あり

MySQLから作成したテーブルを確認

先ほど作成したテーブルを確認できたら完了です。

// MySQLに接続
// DB_DATABASEは.envファイル内の名前と同じ
$ mysql --host=localhost --user=[MySQLのユーザー名] --password=secret [DB_DATABASE]

// テーブルを表示
$mysql> show tables from [DB_DATABASE]

最後に

私と同じように初めてLaravelに触れる方に、少しでもこの記事がお役に立てれば幸いです。

また、株式会社SCOUTERでは、エンジニア、デザイナーの募集をしております。

興味のある方は、是非下記からご応募お願い致します!

www.wantedly.com

www.wantedly.com

www.wantedly.com