LoginSignup
1677

More than 1 year has passed since last update.

最強のLaravel開発環境をDockerを使って構築する

Last updated at Posted at 2020-05-09

※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の基礎知識を習得している方

前提

入れておいてね

[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 に追記する。

~/.bashrc
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リポジトリは、テンプレートリポジトリとして設定しています。

テンプレートリポジトリから作成した場合は、コミット履歴を継承されず綺麗な状態で開発を始められます!

ucan-lab_docker-laravel__Build_laravel_development_environment_with_docker-compose_.png

カスタマイズして使う場合は、後述のgit clone等する際はご自身のリポジトリをご指定してご利用ください。

使い方

composer create-project で新規作成したい場合と composer install で環境構築したい場合がありますので、それぞれ説明します。
Makefile を見てもらえると何やってるか分かりやすいです。

注意

webコンテナは80番ポート、dbコンテナは3306ポートを公開しています。

既にポートが使用されている場合は、docker-compose.ymlportsの指定を変更してご利用ください。

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 シリーズ記事

Docker Laravel 関連記事

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1677