はじめに
今回は、Laravelの公式Docker開発環境であるLaravel Sailをさらに深く理解し、使いこなすためのdocker-compose.ymlカスタマイズ術について解説していきます。Sailの基本的な使い方から、PHP拡張機能の追加、独自サービスの連携、ポートやボリュームのカスタマイズまで、具体的な手順を交えながら徹底的に解説しますので、ぜひ最後までお付き合いください。
目次
Laravel Sailの基本的な役割とメリット
Laravel Sailは、Laravelアプリケーションを開発するための軽量なDocker環境を簡単に構築・起動できるツールです。PHP、MySQL、Redisなど、Laravelの開発に必要な基本的なサービスがコンテナとしてパッケージングされており、Dockerの知識が深くなくても、コマンド一つで開発環境を立ち上げることができます。
Sailを利用する主なメリットは以下の通りです。
- 環境構築の簡略化: 依存関係のインストールや環境変数の設定の手間が大幅に削減されます。
- 開発環境の一貫性: チームメンバー全員が同じ環境で開発できるため、「自分の環境では動くのに…」といった問題を減らせます。
- 手軽な切り替え: 複数のプロジェクトで異なるPHPバージョンやデータベースを利用する場合でも、簡単に環境を切り替えることができます。
なぜdocker-compose.ymlのカスタマイズが必要なのか
Laravel Sailはデフォルトの設定でも多くのケースに対応できますが、プロジェクトの要件によっては、より柔軟な環境が必要になることがあります。例えば、
デフォルトでインストールされていないPHP拡張機能を利用したい
RedisやMailHogといった追加のサービスを連携させたい
デフォルトのポート番号を変更したい
特定のディレクトリをコンテナと共有したい
このような場合に、Sailの心臓部とも言えるdocker-compose.ymlファイルをカスタマイズすることで、Sailの機能を拡張し、より快適な開発環境を構築することができます。
本記事で解説する内容の概要
本記事では、以下の内容について具体的な手順を解説していきます。
- Sailの基本とdocker-compose.ymlの仕組み: vendor/bin/sail upの裏側から、デフォルトのdocker-compose.ymlの構成要素までを理解します。
- PHP拡張機能を追加する: カスタムDockerfileを作成し、docker-compose.ymlからそれを参照してPHP拡張機能を追加する方法を解説します。
- 新しいサービスを追加する: RedisやMailHogなどのサービスをdocker-compose.ymlに追加し、Sailコマンドから連携させる方法を説明します。
既存サービスのポート番号を変更する: ポート番号の衝突を避けるために、docker-compose.ymlでポート設定を変更する方法を紹介します。
ボリューム設定をカスタマイズする: ログファイルやアップロードされたファイルをローカルで永続化するためのボリューム設定について解説します。
まとめとさらなる応用: カスタマイズの注意点や、本番環境でのdocker-compose.ymlの活用について触れます。
Sailの基本とdocker-compose.ymlの仕組み
vendor/bin/sail upコマンドの裏側
Laravelプロジェクトのルートディレクトリで./vendor/bin/sail upコマンドを実行すると、何が起こるのでしょうか?このコマンドは、プロジェクト内のdocker-compose.ymlファイルに基づいてDockerコンテナを起動します。
まず、Docker Composeがインストールされているか確認し、次にdocker-compose.ymlに定義されたサービス(例えば、laravel.testという名前のPHPアプリケーションコンテナや、mysqlコンテナなど)を順に起動していきます。各サービスは、指定されたDockerイメージ(例:php:8.2-fpm、mysql:8.0)を元に作成され、docker-compose.ymlに記述されたネットワークやボリュームなどの設定に従って連携します。
デフォルトのdocker-compose.ymlの構成を理解する
Laravel Sailをインストールした直後のdocker-compose.ymlファイルを開いてみましょう。基本的な構成は以下のようになっています。(Laravelのバージョンによって若干の違いがある場合があります)
YAML
version: '3.7'
services:
laravel.test:
build:
context: ./
dockerfile: Dockerfile
image: sail-8.x/app
ports:
- '${APP_PORT:-80}:80'
environment:
APP_NAME: '${APP_NAME:-Laravel}'
APP_ENV: '${APP_ENV:-local}'
APP_DEBUG: '${APP_DEBUG:-true}'
APP_URL: '${APP_URL:-http://localhost}'
DB_CONNECTION: '${DB_CONNECTION:-mysql}'
DB_HOST: '${DB_HOST:-mysql}'
DB_PORT: '${DB_PORT:-3306}'
DB_DATABASE: '${DB_DATABASE:-laravel}'
DB_USERNAME: '${DB_USERNAME:-sail}'
DB_PASSWORD: '${DB_PASSWORD:-password}'
REDIS_HOST: '${REDIS_HOST:-redis}'
MEMCACHED_HOST: '${MEMCACHED_HOST:-memcached}'
QUEUE_CONNECTION: '${QUEUE_CONNECTION:-sync}'
MAIL_MAILER: '${MAIL_MAILER:-smtp}'
MAIL_HOST: '${MAIL_HOST:-mailhog}'
MAIL_PORT: '${MAIL_PORT:-1025}'
MAIL_ENCRYPTION: '${MAIL_ENCRYPTION:-null}'
MAIL_USERNAME: '${MAIL_USERNAME:-null}'
MAIL_PASSWORD: '${MAIL_PASSWORD:-null}'
volumes:
- '.:/var/www/html'
networks:
- sail
depends_on:
- mysql
- redis
- mailhog
mysql:
image: 'mysql:8.0'
ports:
- '${FORWARD_DB_PORT:-3306}:3306'
environment:
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
volumes:
- 'sailmysql:/var/lib/mysql'
networks:
- sail
redis:
image: 'redis:alpine'
ports:
- '${FORWARD_REDIS_PORT:-6379}:6379'
networks:
- sail
volumes:
- 'sailredis:/data'
mailhog:
image: 'mailhog/mailhog:latest'
ports:
- '${FORWARD_MAILHOG_PORT:-1025}:1025'
- '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025'
networks:
- sail
networks:
sail:
driver: bridge
volumes:
sailmysql:
driver: local
sailredis:
driver: local
YAML
version: '3.7'
services:
laravel.test:
build:
context: ./
dockerfile: Dockerfile
image: sail-8.x/app
ports:
- '${APP_PORT:-80}:80'
environment:
APP_NAME: '${APP_NAME:-Laravel}'
APP_ENV: '${APP_ENV:-local}'
APP_DEBUG: '${APP_DEBUG:-true}'
APP_URL: '${APP_URL:-http://localhost}'
DB_CONNECTION: '${DB_CONNECTION:-mysql}'
DB_HOST: '${DB_HOST:-mysql}'
DB_PORT: '${DB_PORT:-3306}'
DB_DATABASE: '${DB_DATABASE:-laravel}'
DB_USERNAME: '${DB_USERNAME:-sail}'
DB_PASSWORD: '${DB_PASSWORD:-password}'
REDIS_HOST: '${REDIS_HOST:-redis}'
MEMCACHED_HOST: '${MEMCACHED_HOST:-memcached}'
QUEUE_CONNECTION: '${QUEUE_CONNECTION:-sync}'
MAIL_MAILER: '${MAIL_MAILER:-smtp}'
MAIL_HOST: '${MAIL_HOST:-mailhog}'
MAIL_PORT: '${MAIL_PORT:-1025}'
MAIL_ENCRYPTION: '${MAIL_ENCRYPTION:-null}'
MAIL_USERNAME: '${MAIL_USERNAME:-null}'
MAIL_PASSWORD: '${MAIL_PASSWORD:-null}'
volumes:
- '.:/var/www/html'
networks:
- sail
depends_on:
- mysql
- redis
- mailhog
mysql:
image: 'mysql:8.0'
ports:
- '${FORWARD_DB_PORT:-3306}:3306'
environment:
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
volumes:
- 'sailmysql:/var/lib/mysql'
networks:
- sail
redis:
image: 'redis:alpine'
ports:
- '${FORWARD_REDIS_PORT:-6379}:6379'
networks:
- sail
volumes:
- 'sailredis:/data'
mailhog:
image: 'mailhog/mailhog:latest'
ports:
- '${FORWARD_MAILHOG_PORT:-1025}:1025'
- '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025'
networks:
- sail
networks:
sail:
driver: bridge
volumes:
sailmysql:
driver: local
sailredis:
driver: local
このファイルは、主に以下のセクションに分かれています。
- version: Docker Composeファイルのフォーマットバージョンを指定します。
- services: アプリケーションやデータベースなど、起動するコンテナを定義します。各サービスには、使用するDockerイメージ、ポートのマッピング、環境変数、ボリュームのマウントなどが記述されています。
- laravel.test: PHPアプリケーションのコンテナ定義です。./Dockerfileに基づいてビルドされ、ポート80をローカルの環境変数APP_PORT(デフォルトは80)にマッピングしています。volumesセクションでローカルのプロジェクトディレクトリ(/)をコンテナ内の/var/www/htmlにマウントしており、これによりローカルでの変更がコンテナ内に即座に反映されます。
- mysql: MySQLデータベースのコンテナ定義です。mysql:8.0イメージを使用し、ポート3306をローカルのFORWARD_DB_PORT(デフォルトは3306)にマッピングしています。
- redis: Redisキャッシュサーバーのコンテナ定義です。redis:alpineイメージを使用し、ポート6379をローカルのFORWARD_REDIS_PORT(デフォルトは6379)にマッピングしています。
- mailhog: メール送信をテストするためのツールです。ポート1025(SMTP)と8025(Web UI)をそれぞれマッピングしています。
各サービスのdepends_onは、コンテナの起動順序を制御します。例えば、laravel.testはmysqlやredisが起動してから起動します。
- networks: コンテナ間の通信を可能にするネットワークを定義します。デフォルトではsailというブリッジネットワークが作成されます。
- volumes: コンテナのデータを永続化するためのボリュームを定義します。sailmysqlやsailredisといった名前付きボリュームが定義されており、コンテナが削除されてもデータは保持されます。
サービス(laravel.test、mysqlなど)と各コンテナの関係
docker-compose.ymlで定義された各サービスは、それぞれ独立したDockerコンテナとして起動します。これらのコンテナは、networksセクションで定義されたネットワークを通じて相互に通信することができます。例えば、Laravelアプリケーションコンテナ(laravel.test)は、DB_HOST環境変数にmysqlを指定することで、MySQLコンテナにアクセスできます。Docker Composeは、サービス名をDNSとして解決してくれるため、IPアドレスを意識する必要はありません。
PHP拡張機能を追加する
デフォルトの環境にはない拡張機能が必要になったら?
Laravel SailのデフォルトのPHP環境には、多くの一般的な拡張機能が含まれていますが、プロジェクトによっては、例えば画像処理に必要なgdや、国際化対応に必要なintlといった追加の拡張機能が必要になることがあります。
カスタムDockerfileの作成とdocker-compose.ymlでの指定方法
このような場合、Sailが使用するPHPコンテナのイメージをカスタマイズする必要があります。そのために、プロジェクトのルートディレクトリにDockerfileを作成します。
Dockerfile
FROM sail-8.x/app
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
--no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN docker-php-ext-configure gd --with-freetype --with-jpeg
RUN docker-php-ext-install -j$(nproc) gd intl pdo_mysql
# 必要に応じてその他の設定やコマンドを追加
Dockerfile
FROM sail-8.x/app
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
--no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN docker-php-ext-configure gd --with-freetype --with-jpeg
RUN docker-php-ext-install -j$(nproc) gd intl pdo_mysql
# 必要に応じてその他の設定やコマンドを追加
このDockerfileの内容を解説します。
- FROM sail-8.x/app: これは、Sailがデフォルトで使用するPHPコンテナイメージをベースに、新しいイメージを作成することを意味します。sail-8.x/appの部分は、使用しているLaravelのバージョンに合わせて適宜変更してください。(例:Laravel 9.xならsail-9.x/app)
- RUN apt-get update && apt-get install -y ...: これは、PHPのgd拡張機能をインストールするために必要なライブラリ(libfreetype6-dev、libjpeg62-turbo-dev、libpng-dev)をインストールするコマンドです。
- RUN docker-php-ext-configure gd --with-freetype --with-jpeg: gd拡張機能の設定を行います。freetypeとjpegのサポートを有効にしています。
- RUN docker-php-ext-install -j
$(nproc) gd intl pdo_mysql: 実際にgdとintl、そしてMySQLとの接続に必要なpdo_mysql拡張機能をインストールするコマンドです。-j$(nproc)は、コンパイルを並列実行することで時間を短縮します。
Dockerfileを作成したら、docker-compose.ymlのlaravel.testサービスのbuildセクションを以下のように修正します。
YAML
version: '3.7'
services:
laravel.test:
build:
context: ./
dockerfile: Dockerfile
image: my-sail-app # カスタムイメージ名(任意)
ports:
- '${APP_PORT:-80}:80'
environment:
# ... (その他の環境変数は省略)
volumes:
- '.:/var/www/html'
networks:
- sail
depends_on:
- mysql
- redis
- mailhog
# ... (その他のサービス定義は省略)
YAML
version: '3.7'
services:
laravel.test:
build:
context: ./
dockerfile: Dockerfile
image: my-sail-app # カスタムイメージ名(任意)
ports:
- '${APP_PORT:-80}:80'
environment:
# ... (その他の環境変数は省略)
volumes:
- '.:/var/www/html'
networks:
- sail
depends_on:
- mysql
- redis
- mailhog
# ... (その他のサービス定義は省略)
重要なのは、buildセクションを追加し、contextをプロジェクトルート(./)、dockerfileを先ほど作成したDockerfileに指定することです。 imageの名前は任意に変更できます。
具体例:gdやintlなどの拡張機能を追加する手順
上記のDockerfileとdocker-compose.ymlの設定が完了したら、以下のコマンドを実行してコンテナを再構築・起動します。
Bash
./vendor/bin/sail build --no-cache
./vendor/bin/sail up -d
#sail build --no-cacheは、キャッシュを使わずにDockerイメージを再ビルドするコマンドです。sail up -dは、バックグラウンドでコンテナを起動します。
Bash
./vendor/bin/sail build --no-cache
./vendor/bin/sail up -d
#sail build --no-cacheは、キャッシュを使わずにDockerイメージを再ビルドするコマンドです。sail up -dは、バックグラウンドでコンテナを起動します。
コンテナが起動したら、実際に拡張機能が有効になっているか確認してみましょう。Sailコンテナに入り、以下のコマンドを実行します。
Bash
./vendor/bin/sail artisan tinker
Tinker(LaravelのREPL環境)が起動したら、以下のPHPコードを実行します。
PHP
phpinfo();
Bash
./vendor/bin/sail artisan tinker
Tinker(LaravelのREPL環境)が起動したら、以下のPHPコードを実行します。
PHP
phpinfo();
表示された情報の中に、gdやintlといった拡張機能に関する記述があれば、正常にインストールされています。exitと入力してTinkerを終了します。
これで、Laravel SailのPHPコンテナに、必要なPHP拡張機能を追加することができました。他の拡張機能を追加する場合も、同様の手順でDockerfileを編集し、コンテナを再構築すればOKです。
新しいサービスを追加する
RedisやMailHogなど、独自サービスを追加してみよう
Laravel Sailのデフォルト構成には、MySQL、Redis、MailHogなどの便利なサービスが含まれていますが、プロジェクトによっては、さらに他のサービス、例えばNoSQLデータベースのMongoDBや、全文検索エンジンのElasticsearchなどを連携させたい場合があります。
docker-compose.ymlに新しいサービスを追記する方法
ここでは、例としてMongoDBを追加する手順を解説します。まず、docker-compose.ymlのservicesセクションに、MongoDBのサービス定義を追加します。
YAML
version: '3.7'
services:
laravel.test:
# ... (laravel.testの定義は省略)
depends_on:
- mysql
- redis
- mailhog
- mongodb # MongoDBへの依存関係を追加
mysql:
# ... (mysqlの定義は省略)
redis:
# ... (redisの定義は省略)
mailhog:
# ... (mailhogの定義は省略)
mongodb:
image: 'mongo:latest'
ports:
- '${FORWARD_MONGO_PORT:-27017}:27017'
networks:
- sail
volumes:
- 'sailmongo:/data/db'
networks:
sail:
driver: bridge
volumes:
sailmysql:
driver: local
sailredis:
driver: local
sailmongo: # MongoDB用のボリュームを追加
driver: local
YAML
version: '3.7'
services:
laravel.test:
# ... (laravel.testの定義は省略)
depends_on:
- mysql
- redis
- mailhog
- mongodb # MongoDBへの依存関係を追加
mysql:
# ... (mysqlの定義は省略)
redis:
# ... (redisの定義は省略)
mailhog:
# ... (mailhogの定義は省略)
mongodb:
image: 'mongo:latest'
ports:
- '${FORWARD_MONGO_PORT:-27017}:27017'
networks:
- sail
volumes:
- 'sailmongo:/data/db'
networks:
sail:
driver: bridge
volumes:
sailmysql:
driver: local
sailredis:
driver: local
sailmongo: # MongoDB用のボリュームを追加
driver: local
上記の例では、mongodbという新しいサービスを定義しています。
- image: 'mongo:latest': 最新のMongoDBのDockerイメージを使用することを指定しています。
- ports: - '${FORWARD_MONGO_PORT:-27017}:27017': MongoDBのデフォルトポートである27017を、ローカルの環境変数FORWARD_MONGO_PORT(デフォルトは27017)にマッピングしています。
- networks: - sail: laravel.testなどの他のサービスと同じsailネットワークに参加させることで、相互に通信できるようにします。
- volumes: - 'sailmongo:/data/db': MongoDBのデータを永続化するための名前付きボリュームsailmongoを定義し、コンテナ内のデータ保存パス/data/dbにマウントしています。
laravel.testサービスのdepends_onにmongodbを追加することで、LaravelアプリケーションコンテナがMongoDBコンテナよりも後に起動するようにしています。
volumesセクションにsailmongoの定義を追加します。
sailコマンドから連携して操作するための設定
docker-compose.ymlに新しいサービスを追加したら、Sailコマンドからそのサービスを操作できるように設定することも可能です。例えば、./vendor/bin/sail mongodbのように実行して、MongoDBのコンテナ内でコマンドを実行したい場合などです。
これを行うためには、Sailのシェルスクリプト(vendor/bin/sail)を編集する必要があります。しかし、直接編集するのはアップデートの際に上書きされる可能性があるため、推奨されません。
より良い方法は、docker-compose.ymlで定義したサービス名をそのままDocker Composeのコマンドに渡して利用することです。例えば、MongoDBコンテナのシェルに入りたい場合は、以下のコマンドを実行します。
Bash
docker-compose exec mongodb bash
#LaravelアプリケーションコンテナからMongoDBに接続する場合は、通常通りMongoDBのクライアントライブラリ(例えば、jenssegers/mongodb)をComposerでインストールし、Laravelのデータベース設定 (config/database.php) を適切に構成することで連携できます。DB_HOSTにはmongodb(サービス名)を指定します。
Bash
docker-compose exec mongodb bash
#LaravelアプリケーションコンテナからMongoDBに接続する場合は、通常通りMongoDBのクライアントライブラリ(例えば、jenssegers/mongodb)をComposerでインストールし、Laravelのデータベース設定 (config/database.php) を適切に構成することで連携できます。DB_HOSTにはmongodb(サービス名)を指定します。
同様の手順で、Elasticsearchやその他のDockerイメージを利用できるサービスも簡単に追加し、Laravel Sail環境と連携させることができます。
既存サービスのポート番号を変更する
別のDockerコンテナやローカルのサービスとポートが衝突したら?
複数のDockerコンテナを同時に起動している場合や、ローカルマシンで既に特定のポートを使用しているサービスが動作している場合、Laravel Sailのデフォルトポート(例えば、Webサーバーの80番、MySQLの3306番など)が衝突することがあります。
ports設定の変更方法
このようなポートの衝突を避けるためには、docker-compose.ymlファイルの各サービス定義にあるportsセクションを編集します。例えば、Laravelアプリケーションのポート80がローカルの別のサービスと衝突している場合、以下のようにlaravel.testサービスのポートマッピングを変更します。
YAML
version: '3.7'
services:
laravel.test:
build:
context: ./
dockerfile: Dockerfile
image: my-sail-app
ports:
- '${APP_PORT:-8080}:80' # ホスト側のポートを8080に変更
environment:
APP_URL: '${APP_URL:-http://localhost:8080}' # APP_URLも変更
# ... (その他の環境変数は省略)
# ... (その他の設定は省略)
YAML
version: '3.7'
services:
laravel.test:
build:
context: ./
dockerfile: Dockerfile
image: my-sail-app
ports:
- '${APP_PORT:-8080}:80' # ホスト側のポートを8080に変更
environment:
APP_URL: '${APP_URL:-http://localhost:8080}' # APP_URLも変更
# ... (その他の環境変数は省略)
# ... (その他の設定は省略)
上記の例では、ホスト側のポートを80から8080に変更しています。'${APP_PORT:-8080}:80'という記述は、「もし環境変数APP_PORTが設定されていればその値を使用し、そうでなければ8080を使用する。そして、コンテナの80番ポートにマッピングする」という意味になります。
同様に、MySQLのポート3306が衝突する場合は、mysqlサービスのportsセクションを以下のように変更します。
YAML
mysql:
image: 'mysql:8.0'
ports:
- '${FORWARD_DB_PORT:-3307}:3306' # ホスト側のポートを3307に変更
# ... (その他の設定は省略)
#ポート番号を変更したら、必ずコンテナを再起動する必要があります。
Bash
./vendor/bin/sail down
./vendor/bin/sail up -d
#また、LaravelアプリケーションのAPP_URLなどの環境変数も、変更したポートに合わせて更新する必要がある場合があります。.envファイルなどを確認し、必要に応じて修正してください。
YAML
mysql:
image: 'mysql:8.0'
ports:
- '${FORWARD_DB_PORT:-3307}:3306' # ホスト側のポートを3307に変更
# ... (その他の設定は省略)
#ポート番号を変更したら、必ずコンテナを再起動する必要があります。
Bash
./vendor/bin/sail down
./vendor/bin/sail up -d
#また、LaravelアプリケーションのAPP_URLなどの環境変数も、変更したポートに合わせて更新する必要がある場合があります。.envファイルなどを確認し、必要に応じて修正してください。
注意点とトラブルシューティング
ポート番号を変更する際には、以下の点に注意しましょう。
ローカルマシンのポート競合: 変更後のポート番号が、ローカルマシンで既に他のサービスによって使用されていないか確認してください。
- ファイアウォール: 変更後のポートがファイアウォールでブロックされていないか確認してください。
- アプリケーションの設定: ポート番号を変更した場合、アプリケーション内でそのポート番号を参照している箇所がないか確認し、必要に応じて設定を修正してください(例:APIのエンドポイントURLなど)。
- Sailヘルパー関数: Sailが提供するヘルパー関数(例:route()など)は、通常APP_URLに基づいてURLを生成するため、APP_URLが正しく設定されていれば、基本的には問題ありません。
もしポートの衝突が解消されない場合は、別のポート番号を試してみるか、ローカルで競合しているサービスを一時的に停止するなどして、原因を特定する必要があります。Docker Desktopなどのツールを利用している場合は、GUIからもポートマッピングの状況を確認できます。
ボリューム設定をカスタマイズする
ローカルの特定のディレクトリをコンテナと共有する
Laravel Sailのデフォルト設定では、プロジェクトのルートディレクトリ全体がコンテナ内の/var/www/htmlにマウントされています。これにより、ローカルでのコード変更が即座にコンテナ内に反映され、スムーズな開発が可能になります。
しかし、場合によっては、特定のディレクトリだけを共有したい、あるいはコンテナ内の特定のディレクトリの変更をローカルに保存したいといったニーズが出てくることがあります。このような場合に、docker-compose.ymlのvolumesセクションをカスタマイズします。
例えば、ローカルの ./storage/logs ディレクトリをコンテナ内の /var/www/html/storage/logs にマウントしたい場合は、laravel.testサービスの volumes セクションに以下のような記述を追加します。
YAML
version: '3.7'
services:
laravel.test:
build:
context: ./
dockerfile: Dockerfile
image: my-sail-app
ports:
- '${APP_PORT:-80}:80'
environment:
# ... (その他の環境変数は省略)
volumes:
- '.:/var/www/html'
- './storage/logs:/var/www/html/storage/logs' # ログディレクトリのマウントを追加
networks:
- sail
depends_on:
- mysql
- redis
- mailhog
# ... (その他のサービス定義は省略)
YAML
version: '3.7'
services:
laravel.test:
build:
context: ./
dockerfile: Dockerfile
image: my-sail-app
ports:
- '${APP_PORT:-80}:80'
environment:
# ... (その他の環境変数は省略)
volumes:
- '.:/var/www/html'
- './storage/logs:/var/www/html/storage/logs' # ログディレクトリのマウントを追加
networks:
- sail
depends_on:
- mysql
- redis
- mailhog
# ... (その他のサービス定義は省略)
この - './storage/logs:/var/www/html/storage/logs' という行が、ローカルの./storage/logsディレクトリの内容を、コンテナ内の/var/www/html/storage/logsディレクトリに同期させる設定です。ローカルでのログファイルの変更はコンテナ内に反映され、コンテナ内で生成されたログファイルはローカルの./storage/logsディレクトリに保存されます。
ログやアップロードファイルの永続化
前述のログディレクトリのマウントは、ログファイルの永続化の一例です。同様に、ユーザーがアップロードしたファイルをローカルに保存したい場合は、アップロード先のディレクトリをボリュームとしてマウントすることができます。
例えば、Laravelアプリケーション内でpublic/uploadsディレクトリにアップロードされたファイルをローカルの./public/uploadsディレクトリに保存したい場合は、以下のようにvolumes設定を追加します。
YAML
volumes:
- '.:/var/www/html'
- './storage/logs:/var/www/html/storage/logs'
- './public/uploads:/var/www/html/public/uploads' # アップロードディレクトリのマウントを追加
#これにより、コンテナが削除されても、ローカルに保存されたログファイルやアップロードファイルは失われません。
YAML
volumes:
- '.:/var/www/html'
- './storage/logs:/var/www/html/storage/logs'
- './public/uploads:/var/www/html/public/uploads' # アップロードディレクトリのマウントを追加
#これにより、コンテナが削除されても、ローカルに保存されたログファイルやアップロードファイルは失われません。
volumes設定の柔軟な使い方
volumes設定では、ローカルのディレクトリをマウントするだけでなく、Dockerの名前付きボリュームを利用することもできます。これは、特定のコンテナ間でデータを共有したり、コンテナのライフサイクルとは独立してデータを永続化したりする場合に便利です。
Sailのデフォルト設定で使用されているsailmysqlやsailredisなどが名前付きボリュームの例です。これらのボリュームは、volumesセクションのトップレベルで定義されています。
例えば、複数のLaravelアプリケーションコンテナで共通のキャッシュディレクトリを共有したい場合は、名前付きボリュームを作成し、それぞれのコンテナのvolumesセクションでそれをマウントすることができます。
YAML
version: '3.7'
services:
laravel-app1:
# ...
volumes:
- 'common-cache:/var/www/html/bootstrap/cache'
laravel-app2:
# ...
volumes:
- 'common-cache:/var/www/html/bootstrap/cache'
networks:
sail:
driver: bridge
volumes:
common-cache:
driver: local
このように、volumes設定を柔軟に活用することで、開発環境のデータ管理をより効率的に行うことができます。
YAML
version: '3.7'
services:
laravel-app1:
# ...
volumes:
- 'common-cache:/var/www/html/bootstrap/cache'
laravel-app2:
# ...
volumes:
- 'common-cache:/var/www/html/bootstrap/cache'
networks:
sail:
driver: bridge
volumes:
common-cache:
driver: local
このように、volumes設定を柔軟に活用することで、開発環境のデータ管理をより効率的に行うことができます。
まとめとさらなる応用
カスタマイズの基本ルールと注意点
docker-compose.ymlをカスタマイズする際の基本的なルールと注意点をまとめます。
- 慎重な編集: docker-compose.ymlの記述ミスは、コンテナの起動失敗や予期せぬ動作を引き起こす可能性があります。編集する際は、内容をよく理解し、慎重に行ってください。
- 変更後の再起動: 設定ファイルを変更した後は、必ず./vendor/bin/sail downと./vendor/bin/sail up -dを実行してコンテナを再起動し、変更を反映させてください。
- 環境変数の活用: ポート番号など、環境によって変わる可能性のある設定は、.envファイルで環境変数として管理し、docker-compose.ymlから参照するようにすると、より柔軟な構成になります。
- Dockerfileの理解: PHP拡張機能の追加などでカスタムDockerfileを使用する場合は、Dockerfileの構文やDockerイメージの仕組みを理解しておくと、より高度なカスタマイズが可能になります。
- バックアップ: 大幅な変更を行う前には、念のためdocker-compose.ymlファイルのバックアップを取っておくことを推奨します。
本番環境でのdocker-compose.ymlとの使い分け
Laravel Sailのdocker-compose.ymlファイルは、あくまで開発環境を目的として設計されています。本番環境では、セキュリティやパフォーマンス、スケーラビリティなどの要件が異なるため、Sailのdocker-compose.ymlをそのまま利用することは推奨されません。
本番環境では、より専門的なDocker構成やオーケストレーションツール(例えば、KubernetesやAWS ECSなど)を検討する必要があります。開発環境でSailを利用していても、本番環境へのデプロイ方法については、別途検討するようにしてください。
Laravel Sailをより強力な開発環境に進化させるヒント
今回解説した内容以外にも、docker-compose.ymlをカスタマイズすることで、Laravel Sailをさらに強力な開発環境に進化させることができます。
- Xdebugの設定: docker-compose.ymlにXdebug関連の設定を追加し、IDEと連携したデバッグ環境を構築する。
- Node.js環境の追加: フロントエンドの開発に必要なNode.jsやnpm(またはyarn)のコンテナを追加する。
- 複数データベースの連携: 複数の異なる種類のデータベース(例えば、PostgreSQLとMongoDB)を同時に起動し、連携させる。
- CI/CD環境との連携: CI/CDパイプラインで利用するツール(例えば、Selenium для интеграционного тестирования)をサービスとして追加し、開発環境でテストを実行する。
これらのカスタマイズを通じて、Laravel Sailは単なるローカル開発環境の構築ツールから、より高度な開発ニーズに対応できる強力なプラットフォームへと進化します。
ぜひこの記事を参考に、あなたのプロジェクトに最適なLaravel Sail環境を構築してみてください。最後までお読みいただきありがとうございました!
安心安全のホワイト高還元SESに転職を考えている方へ
新しい挑戦に踏み出すことは、人生において重要な一歩です。 転職活動は自分自身を知り、成長する貴重な機会でもあり、夢や成長を追求するためには必要な要素の一つ になるかと思います。 どんな選択をされるにせよ、その決断があなたに取って素晴らしい未来を切り開くことを願っています! グラディートと一緒に誇れるエンジニアを目指しましょう!
■『株式会社グラディート』では受託開発・SES・ブランディングデザイン・事業コンサルティングなどを事業として行う都内のIT企業です。現在、不遇な待遇で困っているエンジニアさんは、ぜひ一度グラディートに相談してみてね!(年収査定・SESへの転職相談も承っております!)
株式会社グラディート採用情報はこちら▼
https://en-gage.net/gradito/
株式会社グラディート公式サイトはこちら▼
https://www.gradito.co.jp/