RitoLabo

Laravel Sail なら Docker 開発環境がコマンド 2 撃で構築できる。PHP/MySQLからキューやメール環境までオールインワン

  • 公開:
  • カテゴリ: PHP Laravel
  • タグ: PHP,Laravel,Docker,Sail

Laravel Sail というツールが 2020年12月9日 にローンチされました。

公式が出した Laravel アプリケーションの Docker 開発環境構築ツールですが、今回はこの Laravel Sail を使って開発環境を構築してみます。

アジェンダ
  1. 開発環境
  2. LaravelSail
  3. LaravelSail の導入
  4. アプリケーションの起動
  5. sail コマンド
    1. エイリアスを設定する
    2. コンテナの起動・停止・確認
    3. アプリケーションコンテナへの接続
    4. MySQL へログイン
    5. artisan コマンド
    6. テストの実行
    7. PHP コマンド
    8. Composer コマンド
    9. node
  6. 独自の設定を行う

開発環境

今回の環境は以下の通りです。

  • macOS Catalina
  • Docker Desktop for Mac (3.x)

Laravel Sail を Mac で動かす為には Docker Desktop を予めインストールしておく必要があります。

LaravelSail

LaravelSail は、Laravel を Docker 開発環境で動作させるためのツールです。

Laravel を動作させるための一通りの仕組みが構築され、簡単に Docker での開発環境を構築する事ができます。

LaravelSail の導入

まずは sail のための Laravel をインストールする為にシェルを実行します。書式は以下になっています。

curl -s https://laravel.build/<YOUR_PROJECT_NAME> | bash

プロジェクト名は「sample-app」にして進めます。以下のコマンドを叩きます。

curl -s https://laravel.build/sample-app | bash

Laravel インストール用のイメージが作成され、起動したコンテナにて Laravel がインストールされます。

この処理が終わると、作成されたディレクトリ sample-app/ 配下に、Laravel のソースコードが展開されているのを確認できます。

アプリケーションの起動

Laravel がインストールされたら、プロジェクトルートで以下のコマンドを叩いてアプリケーションを起動します。

./vendor/bin/sail up

初回実行の場合は mysql, redis, mailhog, そして Laravel アプリケーション用(PHP や node などが入る)のイメージが作成されてから、それぞれコンテナが起動します。

Creating sample-app_redis_1   ... done
Creating sample-app_mailhog_1 ... done
Creating sample-app_mysql_1 ... done
Creating sample-app_laravel.test_1 ... done

ネットワークの状況にもよりますが、初回実行の場合はイメージを作成するため数分程度かかります。また、途中、ディレクトリのパーミッションを変更する為にパスワードの入力を求められます。

コンテナが起動したら、http://localhost/ にアクセスすると初期画面が表示されます。

Laravel初期画面

MailHog のコンテナも起動しているので、メールの受信画面へは http://localhost:8025 にアクセスすると表示されます。

MailHog 画面

これで Sail での環境構築は完了です。コマンドを 2 回叩いただけで環境が出来上がりました。

sail コマンド

Laravel Sail で起動させた場合に、コンテナの起動・停止や通常叩いている artisan コマンド等は以下の sail コマンドを使う事で実行できます。

./vendor/bin/sail <same_command...>

エイリアスを設定する

毎回 ./vendor/bin/sail ... と入力するのが手間なので、エイリアス設定して、sail ... で sail コマンドを実行できるようにしておきます。

(以下、公式と記述が異なるので公式のアナウンスに沿った形でエイリアスを記述したい場合は Configuring A Bash Alias を参照ください)

今回は .zshrc にエイリアスを設定します。

% vim ~/.zshrc

---
# Laravel Sail Command Alias
alias sail="./vendor/bin/sail"
---

設定ファイルを再読み込みします。

source ~/.zshrc

エイリアスの反映確認のため、以下のコマンドを Laravel のルートディレクトリ配下で実行します。

% sail -v
docker-compose version 1.27.4, build 40524192

エイリアスが反映された事が確認できました。

コンテナの起動・停止・確認

コンテナの起動は up で行います

sail up

停止させる時は control + c でコンテナが停止します。

コンテナをバックグラウンドで動作させたい場合は -d を付与して detach モードで起動します。

sail up -d

この場合にコンテナを停止する時は down で行います。

sail down

コンテナが起動しているかの状態は sail とコマンドを打つことで確認できます

% sail
Name Command State Ports
-------------------------------------------------------------------------------------------------------------------
sample-app_laravel.test_1 start-container Up 0.0.0.0:80-
>80/tcp, 8000/tcp
.
.
.

アプリケーションコンテナへの接続

アプリケーション用のコンテナに入りたい時は以下のコマンドで入ることができます。

sail shell

MySQL へログイン

MySQL へログインするのは sail exec ... で行えます。

% sail exec mysql mysql -uroot

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.22 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

MySQL へのログインに限りませんが、元は docker-compose なので、後述のものも含め、直接 docker-compose コマンドでも sail コマンドでも、どちらでもやりやすい方でよいと思います。

artisan コマンド

artisan コマンドを実行する時も sail コマンドで行えます。

sail artisan <command ...>
% sail artisan -V
Laravel Framework
8.18.1

テストの実行

PHPUnit を動作させる時も sail コマンドで実行できます。

sail test
% sail test

PASS Tests\Unit\ExampleTest
basic test

PASS Tests\Feature\ExampleTest
basic test

Tests: 2 passed
Time: 0.71s

PHP コマンド

PHP コマンドも sail コマンドから実行できます

sail php <command ...>
% sail php -v
PHP 8.0.0 (cli) (built: Nov 27 2020 12:26:22) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
with Zend OPcache v8.0.0, Copyright (c), by Zend Technologies

Composer コマンド

Composer コマンドも sail コマンドから実行できます。

sail composer <command ...>
% sail composer -v
Composer version 2.0.8 2020-12-03 17:20:38

node

node もインストールされているので、sail コマンドから叩けます。(NPM)

sail node <command ...>
% sail node -v
v15.4.0

独自の設定を行う

sail で作成されるコンテナやイメージに新たに何かを追加したり変更したい場合は、Dockerfile 等の sail リソースを出力してカスタマイズする事が可能です。

以下のコマンドで出力します。

sail artisan sail:publish

コマンドを実行すると、プロジェクトルートに docker ディレクトリが作成されて Sail の Dockerfile やそこで使用している設定ファイルが出力されます。

docker
├── 7.4
│   ├── Dockerfile
│   ├── php.ini
│   ├── start-container
│   └── supervisord.conf
└── 8.0
├── Dockerfile
├── php.ini
├── start-container
└── supervisord.conf

なお、publish すると次からは、プロジェクトルートの Dockerfile を参照するようになります。

試しにイメージを変更してみます。Sail の Dockerfile はデフォルトでは タイムゾーンが UTC で設定されているので、これを JST に変更してみます。

sample-app/docker/8.0/Dockerfile
# ENV TZ=UTC
ENV TZ='Asia/Tokyo'

Dockerfile を変更したら、以下のコマンドでイメージをビルドします。

sail build --no-cache

イメージのビルドが終わったらコンテナを起動して確認してみます。

# 変更前
% sail shell

sail@45e7f632b6e7:/var/www/html$ date
Tue Dec 15 11:49:45 UTC 2020


# 変更後
% sail shell

sail@f577af4e8b8f:/var/www/html$ date
Tue Dec 15 21:05:55 JST 2020

アプリケーション用のコンテナに変更が反映された事が確認できました。

まとめ

たった 2 回のコマンドで環境が構築できるのはとても簡単ですね。

色々とカスタマイズもできるので、開発環境を構築する際に融通も利いて良い感じだと思います。