※Linuxはもちろんですが、Docker for Mac(M1 Mac含む), Docker for Windows で動作します。
Dockerの勉強をしたい方向け
ハンズオン形式の記事を書いてるので、DockerでLaravel環境する方法を一から勉強したい人はこちらの記事がおすすめです。
【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン
概要
Docker, Docker Compose を使って、nginx, php-fpm, MySQLの実行環境(LEMP)を構築して、最強のLaravel開発環境を構築する記事です。
Laravelが最低限動作して、シンプルで軽量かつベストプラクティスなコンテナ、ディレクトリ構成を考えました。
最小限の構成なので、DockerイメージのビルドはLaradockより10倍以上高速にビルド完了します。
リポジトリ
スターをもらえると嬉しいです☺️
※記事もなるべくメンテしていきますが、リポジトリに書かれていることが最新です。
対象読者
- Laravel中級者の方
- PHP, Linux, Git, Docker, Docker Compose, Composer, Nginx, MySQLの基礎知識を習得している方
前提
- Git
- Docker for Mac / Windows
入れておいてね
[mac] $ git --version
git version 2.31.1
[mac] $ docker --version
Docker version 20.10.10, build b485636
[mac] $ docker compose version
Docker Compose version v2.1.1
※ Docker Composeのバージョン
Compose V2がインストールされてない場合は、公式に沿ってインストール方法をご確認ください。
https://docs.docker.com/compose/cli-command/#installing-compose-v2
補足: docker-compose と docker compose コマンドの違い
docker-compose
コマンドが docker compose
へと docker
のサブコマンドとして取り込まれることになりました。
本記事もそれに合わせて docker compose
コマンドに表記を変更します。
Docker Content Trust(DCT)を有効にする
~/.bashrc
や ~/.zshrc
に追記する。
export DOCKER_CONTENT_TRUST=1
DCTは、Dockerイメージを「なりすまし」と「改ざん」から保護するセキュリティ機能です。
- Docker イメージへ発行者のデジタル署名を付ける
- イメージの利用時(pull など)に「発行者」と「イメージが改ざんされていないこと」を検証する
push, build, create, pull, run のコマンド実行時に自動で機能します。
コンテナ構成
下記の3つのコンテナで構成します。
LEMP環境を作成します。
├── app
├── web
└── db
よく利用されるシンプルな構成だと思うのでこの構成にしました。
プロジェクトに合わせてご自由にカスタムしてください👍
app コンテナ
- アプリケーションサーバーのコンテナ
- PHPのバージョンは8.0系を利用する
-
Laravel 8.x サーバ要件 を満たす
- PHP7.3以上
- BCMath PHP 拡張
- Ctype PHP 拡張
- Fileinfo PHP 拡張
- JSON PHP 拡張
- Mbstring PHP 拡張
- OpenSSL PHP 拡張
- PDO PHP 拡張
- Tokenizer PHP 拡張
- XML PHP 拡張
- php, composer のベースイメージを利用
web コンテナ
- ウェブサーバーのコンテナ
- HTTPリクエストを受けて、HTTPレスポンスを返す
- phpファイルへのアクセスはappコンテナに投げる
- nginx のベースイメージを利用
db コンテナ
- データベースサーバーのコンテナ
- MySQLのバージョンは8.0系を利用する
- 5.7系は2020年10月にサポートが切れるので注意
- 本番環境でAmazon Auroraを使用する場合は現時点で5.7互換までしかサポートしていないので注意
-
mysql/mysql-server のベースイメージを利用
- Docker Hub公式イメージではなく、OracleのMySQLチームがメンテしているDockerイメージを利用します
ディレクトリ構成
.
├── src # Laravelプロジェクトのルートディレクトリ
├── infra
│ └── docker
│ ├── mysql
│ │ ├── Dockerfile
│ │ └── my.cnf
│ ├── nginx
│ │ ├── Dockerfile
│ │ └── default.conf
│ └── php
│ ├── Dockerfile
│ ├── php-fpm.d
│ │ └── zzz-www.conf => unixドメインソケットの設定ファイル
│ └── php.ini
├── Makefile
└── docker-compose.yml
カスタマイズしてご利用したい方へ
docker-laravelリポジトリは、テンプレートリポジトリとして設定しています。
テンプレートリポジトリから作成した場合は、コミット履歴を継承されず綺麗な状態で開発を始められます!
カスタマイズして使う場合は、後述のgit clone
等する際はご自身のリポジトリをご指定してご利用ください。
使い方
composer create-project
で新規作成したい場合と composer install
で環境構築したい場合がありますので、それぞれ説明します。
Makefile を見てもらえると何やってるか分かりやすいです。
注意
web
コンテナは80
番ポート、db
コンテナは3306
ポートを公開しています。
既にポートが使用されている場合は、docker-compose.yml
のports
の指定を変更してご利用ください。
A. Laravelプロジェクトの新規作成
[mac] $ git clone git@github.com:ucan-lab/docker-laravel.git
[mac] $ cd docker-laravel
[mac] $ mkdir -p src
[mac] $ docker compose build
[mac] $ docker compose up -d
[mac] $ docker compose exec app composer create-project --prefer-dist laravel/laravel .
[mac] $ docker compose exec app php artisan key:generate
[mac] $ docker compose exec app php artisan storage:link
[mac] $ docker compose exec app chmod -R 777 storage bootstrap/cache
[mac] $ docker compose exec app php artisan migrate
※最新のLaravelバージョンがインストールされます。
A'. Laravelプロジェクトをバージョン指定して新規作成
古いバージョンを指定したい場合の手順です。
[mac] $ git clone git@github.com:ucan-lab/docker-laravel.git
[mac] $ cd docker-laravel
[mac] $ mkdir -p src
[mac] $ docker compose build
[mac] $ docker compose up -d
[mac] $ docker compose exec app composer create-project --prefer-dist "laravel/laravel=6.*" .
[mac] $ docker compose exec app php artisan key:generate
[mac] $ docker compose exec app php artisan storage:link
[mac] $ docker compose exec app chmod -R 777 storage bootstrap/cache
[mac] $ docker compose exec app php artisan migrate
composer create-project --prefer-dist "laravel/laravel=6.*" .
インストールしたいLaravelバージョンを指定してます。
B. 既存のLaravelプロジェクトの環境を構築する
docker-laravel/src
ディレクトリにLaravelプロジェクトを配置します。
[mac] $ git clone git@github.com:ucan-lab/docker-laravel.git
# Laravelプロジェクトを docker-laravel/src へクローンする
[mac] $ git clone git@github.com:laravel/laravel.git docker-laravel/src
[mac] $ cd docker-laravel
[mac] $ make init
[mac] $ docker compose build
[mac] $ docker compose up -d
[mac] $ docker compose exec app composer install
[mac] $ docker compose exec app cp .env.example .env
[mac] $ docker compose exec app php artisan key:generate
[mac] $ docker compose exec app php artisan storage:link
[mac] $ docker compose exec app chmod -R 777 storage bootstrap/cache
[mac] $ docker compose exec app php artisan migrate:fresh
これで既存のLaravelプロジェクトの環境構築は完了です。
補足
この構成だと同一リポジトリでLaravelのソースコードも管理することになります。
インフラ部分とLaravel部分とGitリポジトリを分けたい気持ちもあるかと思います。
ケースバイケースだとは思いますが、個人的には小規模な開発であればまとめてしまっていいんじゃないかなと思ってます。
Tips
軽く使い方をご紹介します。
初期設定
Laravelの初期設定に関することを別記事としてまとめました。
Makeコマンド、Makefileについて
docker compose
コマンドは入力するには長く、プロジェクト毎にエイリアス設定するのはとても面倒です。
Makefile
を用意することで、短いコマンドでコマンドが実行できるようになります。
用意している make
コマンドと元のdocker compose
コマンドを併記してご紹介します。
基本
# コンテナを作成する
[mac] $ docker compose up -d
# コンテナを破棄する
[mac] $ docker compose down
# コンテナ、イメージ、ボリュームを破棄する
[mac] $ docker compose down --rmi all --volumes
# コンテナ、ボリュームを破棄する
[mac] $ docker compose down --volumes
- コンテナを破棄するとコンテナ内のデータは破棄されます。
- イメージを破棄するとDockerイメージのビルドが必要です。
- ボリュームを破棄すると名前付きボリュームで管理しているデータベースの中身が消えます。
Docker Composeコマンドは長ったらしいのでMakefileも用意してます。ご自由に変更してお使いください。
Laravelプロジェクトの初期設定
Laravelプロジェクトの初期設定について記事にまとめました。
よければご参考ください。
appコンテナに入る
[mac] $ docker compose exec app bash
webコンテナに入る
[mac] $ docker compose exec app ash
dbコンテナに入る
[mac] $ docker compose exec db bash
dbコンテナのMySQLに接続する
[mac] $ docker compose exec db bash -c 'mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE'
Laravelのマイグレーションを実行する
# migrate
[mac] $ docker compose exec app php artisan migrate
# all drop table & migrate & seeding
[mac] $ docker compose exec app php artisan migrate:fresh --seed
# seeding
[mac] $ docker compose exec app php artisan db:seed
テストの実行
[mac] $ docker compose exec app php artisan test
関連記事
Docker × Laravel シリーズ記事
- Laravel Advent Calendar 2020 の24日目の記事で Laravel 初期設定 の記事を書きました
- Dockerを使ってLaravelのローカル開発環境を作る(Apache版)
- Docker x Laravel 脅威の1ファイル!最小構成でローカル開発環境を構築する
- 【忙しい人向け】カップ麺より早く作るDockerでLaravel開発環境構築
- Docker × Laravel ローカル環境でHTTPS(SSL)通信する
- Docker × Laravel × ngrok ローカル環境を一時的に外部へ公開する
-
Docker × Laravel Vueをインストールしてユーザー登録&ログイン機能を実装する
- Laravel7.x 系以前
-
Docker × Laravel 8 Jetstream でログイン、ユーザー登録、2要素認証を実装する
- Laravel8.x 系
- Docker × Laravel メールの送信処理をローカルで確認する
- Docker × Laravel テスト用のデータベースコンテナを構築する
- Docker × Laravel コードを自動整形するコンテナを構築する
- Docker x Laravel ブラウザ自動リロード(Hot Module Replacement)
- Docker x Laravel phpMyAdmin のコンテナを構築する
- Docker x Laravel めちゃくちゃ遅い Docker for Mac を爆速化する
Laravel シリーズ記事
- Laravel × Dacapo データベースマイグレーションサポートツールの使い方
- Docker × Laravel × Dacapo × SchemaSpyでER図を自動生成する
- Laravel5.8 文字列をキャメルケース・パスカルケース・スネークケース・ケバブケース・単数系・複数形に変換する
- Laravel tinker データベースの接続できるか疎通確認する
- Laravel SQLの実行クエリログを出力する
- Laravel7 makeコマンドのひな形ファイルをカスタマイズする
- Laravel7 make:xxx コマンドを作ってひな形ファイルを生成する
- composer update でメモリオーバーする場合の対策
- 【Laravel初期設定】開発を楽しくするパッケージ&ツール
- Laravel 標準搭載のデバッグ機能 tinker コマンドのご紹介
- Laravel 自作のヘルパ関数を追加する
- Laravel 標準ヘルパ関数を自作ヘルパ関数でオーバーライドする
- PHP7.4 ぼくのかんがえたさいきょうのphp.ini
- Laravel5.8 EloquentやDBの差分を取得する
- Laravel PHP Insightsを使ってコード品質を分析する
- Laravel tinker で Faker を試す方法
- Laravel開発時に便利なmake(Makefile)コマンド集
- Laravel キャッシュクリア&最適化
- Laravel 8 の新機能!マイグレーションスカッシングで肥大化したマイグレーションファイルを1つにまとめる
- Laravel 8 の新機能!時間テストヘルパー(タイムトラベル)を使ってみた!
Docker Laravel 関連記事
-
docker-laravel の Docker 構成をちゃんと理解する【docker-compose.yml 編】
- 超細かく解説してくれてます。