2019-09-17に更新

DockerでLaravelのローカル開発環境構築を行う

Laravelの環境構築を行う場合はDockerを利用するのが個人的には一番早くて軽くて良いと思っています。普段はDocker Hubにアップしてある自分で作ったオレオレDockerイメージを利用しているのですが、久しぶりに丁度よいLaravel用のDockerイメージが無いのかなと見直してみて、ちょうど良さそうなものがあったのでそちらを使って環境構築を試してみました。(最近作ったばかりなので十分な確認はできていません)

今回使うDockerイメージ

今回使うDockerイメージは下記です。

https://hub.docker.com/r/lorisleiva/laravel-docker/

READMEに詳しい使い方が載っていないのですが、pull数も多いし(CIで主に使っているのかもしれません)GitHubでの評価も他のイメージに比べて高いので、良さそうかなと思いました。XDebugもYarnも入っているようですので、このイメージ一つで一通りのことはできそうな気がします。

構築する環境

下記の環境で構築します。

  • PHP 7.3
  • Laravel 6.0
  • MySQL 5.7
  • phpMyAdmin
  • Yarn

docker-compose.ymlをつくる

実際の開発時にはdocker-composeを利用するため、まずはdocker-compose.ymlを書きます。これはプロジェクト初期化ようですので、あとでまた調整します。

version: '2'
volumes:
  db_data:
    driver: local
services:
  mysql:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "true"
      MYSQL_DATABASE: laravel
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=
    ports:
      - 8001:80
  app:
    image: lorisleiva/laravel-docker:7.3
    volumes:
      - .:/var/www
    ports:
      - 8000:8000
    tty: true
    stdin_open: true
    # command: php artisan serve --host=0.0.0.0

MySQL

MySQLはパスワード無しをOKとします。ローカル環境ですのでパスワードなしのrootログインで問題ありません。データベースとしてlaravelを自動的に作成します。現在はLaravelのプロジェクトを作成すると、.envにはlaravelというデータベースを使用するように初期化されるようです。

phpMyAdmin

ソフトを使ってMySQLに接続することも可能ですが、phpMyAdminのDockerイメージも存在するためそれを使います。これでhttp://localhost:8001でphpMyAdminを使うことが出来てとても楽です。

アプリケーションを作成する

とりあえず先程のdocker-compose.ymlを配置し、そこにシェルで移動します。そして各イメージを起動します。

docker-compose up -d

docker psで正常に起動できているかを確認することも出来ます。

次にdocker-compose.ymlで定義しているappというLaravelが動作するコンテナに入ります。

docker-compose exec app bash

php -vとするとPHP7.3のバージョンが表示されると思います。ここにLaravelの公式マニュアルに従ってLaravelアプリケーションの初期化を行います。

composer create-project --prefer-dist laravel/laravel blog

blogフォルダにアプリケーションが作成されますので、そのフォルダに移動してアプリケーションを起動してみます。

cd blog
php artisan serve --host=0.0.0.0

下記のようなメッセージが表示されれば問題ありません。

Laravel development server started: <http://0.0.0.0:8000>
PHP 7.3.8 Development Server started at Wed Sep 11 23:57:18 2019

問題なければhttp://localhost:8000にアクセスすると下記のような画面が表示されます。

普段利用する用に調整

とりあえず環境構築は出来ましたが、普段の利用にはちょっと使いづらいので調整します。まずは一旦コンテナを終了させます。Ctrl+Dのショートカットかexitコマンドでコンテナのシェルを抜けます。そして下記を実行して終了させます。

docker-compose down

そしてdocker-compose.ymlを先程作成されたblogフォルダに入れてしまいましょう。配置が気持ち悪ければその後blogフォルダの名前を変えたり位置を変えたりしてください。次にdocker-compose.ymlのappのセクションに下記の行を追加します。

    command: php artisan serve --host=0.0.0.0

これでdocker-composeでupした際に自動的にサーバーも起動し、わざわざコマンドで起動しなくてもブラウザでLaravelアプリケーションにアクセスできるようになります。

これで普段は開発を始める時にup、終了する時にdownを行うだけでOKとなります。

その他細かい部分も確認

とりあえず動いたので他の細かい部分も確認していきます。すべてdocker-compose exec app bashでコンテナ内に入って実行します。

MySQLとの連携

MySQLと正常に連携できているか確認してみます。今回の方法で作成したLaravelアプリケーションには元々ユーザー関連のテーブルを初期化するためのマイグレーションファイルが入っていますので、それを実行してみます。

まずは.envのホスト名だけ変更しておきます。

DB_HOST=mysql

そして実行します。

php artisan migrate

問題なければ下記のように実行ログが表示されます。

Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.07 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.05 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.03 seconds)

ルーティングの確認

正常にルーティングが行われているか確認します。まずは適当なコントローラを作成します。

php artisan make:controller PostController

これでapp/Http/Controller/PostController.phpが生成されますので、下記のメソッドを追加しておきます。アクセスするとJSONのレスポンスを返すだけのアクションです。

    public function index()
    {
        return response()->json(['hello' => 'world']);
    }

これにアクセスできるように、ルーティングを追加します。routes/web.phpに下記を追記します。

Route::resource('posts', 'PostController');

これでhttp://localhost:8000/postsにアクセスすれば下記のようなページが表示されます。

{"hello":"world"}

Vue.jsの確認

Laravel6からデフォルトではVue.jsが入らなくなったようです。ただしuiコマンドですぐ初期化できるようです。詳しくは下記の記事に書いています。

Laravel 6 でVue.jsやReactを使う

hotコマンドを使ってブラウザで確認する際に8080ポートでjsやcssファイルが読み込まれますが、このイメージだとそのままはアクセスできないため、hotコマンドに--host=0.0.0.0というホスト名の指定を追加しておきましょう。

"hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --host=0.0.0.0 --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",

まとめ

自分で作ったオレオレイメージをbuildせずともなんとなくいい感じにできた気がします。今回使ったイメージがメンテナンスされると嬉しいですね。Dockerが使える方は是非試してみてください。

ツイッターでシェア
みんなに共有、忘れないようにメモ

だら@Crieit開発者

Crieitの開発者です。 Webエンジニアです(在宅)。大体10年ちょい。 記事でわかりにくいところがあればDMで質問していただくか、案件発注してください。 業務依頼、同業種の方からのコンタクトなどお気軽にご連絡ください。 業務経験有:PHP, MySQL, Laravel, React, Flutter, Vue.js, Node, RoR 趣味:Elixir, Phoenix, Nuxt, Express, GCP, AWS等色々 PHPフレームワークちいたんの作者

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント