Laravelの環境構築を行う場合はDockerを利用するのが個人的には一番早くて軽くて良いと思っています。普段はDocker Hubにアップしてある自分で作ったオレオレDockerイメージを利用しているのですが、久しぶりに丁度よいLaravel用のDockerイメージが無いのかなと見直してみて、ちょうど良さそうなものがあったのでそちらを使って環境構築を試してみました。(最近作ったばかりなので十分な確認はできていません)
今回使うDockerイメージは下記です。
https://hub.docker.com/r/lorisleiva/laravel-docker/
READMEに詳しい使い方が載っていないのですが、pull数も多いし(CIで主に使っているのかもしれません)GitHubでの評価も他のイメージに比べて高いので、良さそうかなと思いました。XDebugもYarnも入っているようですので、このイメージ一つで一通りのことはできそうな気がします。
下記の環境で構築します。
実際の開発時には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はパスワード無しをOKとします。ローカル環境ですのでパスワードなしのrootログインで問題ありません。データベースとしてlaravelを自動的に作成します。現在はLaravelのプロジェクトを作成すると、.envにはlaravelというデータベースを使用するように初期化されるようです。
ソフトを使って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と正常に連携できているか確認してみます。今回の方法で作成した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"}
Laravel6からデフォルトではVue.jsが入らなくなったようです。ただしui
コマンドですぐ初期化できるようです。詳しくは下記の記事に書いています。
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は誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント