1. はじめに
この記事では、macOS上でDockerを使用して、PHP8.2とLaravelの環境を構築する手順を紹介します。MVCモデルのアプリケーション開発を効率的に行えるよう、MySQLデータベースもDockerコンテナとして動かします。
- 前提条件
- macOSがインストールされていること
- Docker Desktopがインストールされていること
2. プロジェクト構成の準備
まず、プロジェクトのディレクトリを作成し、必要なファイルを配置します。以下のディレクトリ構成を目指します。
Plaintext
/your-project
├── docker
│ ├── mysql
│ │ └── my.cnf
│ └── php
│ └── Dockerfile
├── docker-compose.yml
├── .env
└── src
docker: Docker関連のファイルを格納するディレクトリ
docker-compose.yml: 全てのコンテナを定義するファイル
.env: 環境変数を定義するファイル
src: Laravelのソースコードを格納するディレクトリ
ディレクトリとファイルの作成ターミナルを開き、以下のコマンドを実行します。
Bash
mkdir your-project
cd your-project
mkdir -p docker/mysql docker/php
touch docker-compose.yml .env
3. Dockerfileの作成
PHPコンテナとMySQLコンテナのDockerfileを作成します。
PHPコンテナ (docker/php/Dockerfile)
Dockerfile
FROM php:8.2-fpm
# 必要な拡張機能をインストール
RUN apt-get update && apt-get install -y \
git \
unzip \
libzip-dev \
libonig-dev \
libpng-dev \
libjpeg-dev \
libfreetype6-dev \
imagemagick \
libmagickwand-dev \
&& rm -rf /var/lib/apt/lists/*
# GD拡張機能の有効化
RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd
# zip, pdo_mysql, mbstring拡張機能の有効化
RUN docker-php-ext-install pdo_mysql zip mbstring
# Composerのインストール
COPY --from=composer:2 /usr/bin/composer /usr/local/bin/composer
WORKDIR /var/www/html
ポイント:
ベースイメージにphp:8.2-fpmを使用することで、PHP 8.2が動作する環境を構築します。
composerを別途インストールする手間を省くため、Composer公式イメージからコピーしています。
MySQLコンテナ (docker/mysql/my.cnf)
MySQLの設定ファイルを作成します。
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
4. docker-compose.ymlの作成
複数のコンテナをまとめて管理するためのdocker-compose.ymlを作成します。
version: '3.8'
services:
app:
build:
context: ./docker/php
dockerfile: Dockerfile
container_name: laravel_app
volumes:
- ./src:/var/www/html
ports:
- "9000:9000"
working_dir: /var/www/html
environment:
- DB_CONNECTION=mysql
- DB_HOST=db
- DB_PORT=3306
- DB_DATABASE=${DB_DATABASE}
- DB_USERNAME=${DB_USERNAME}
- DB_PASSWORD=${DB_PASSWORD}
depends_on:
- db
nginx:
image: nginx:1.25
container_name: laravel_nginx
volumes:
- ./src:/var/www/html
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
ports:
- "8000:80"
depends_on:
- app
db:
image: mysql:8.0
container_name: laravel_db
volumes:
- ./docker/mysql:/etc/mysql/conf.d
- db_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
- MYSQL_DATABASE=${DB_DATABASE}
- MYSQL_USER=${DB_USERNAME}
- MYSQL_PASSWORD=${DB_PASSWORD}
ports:
- "3306:3306"
command: --default-authentication-plugin=mysql_native_password
volumes:
db_data:
ポイント:
appサービス: PHPコンテナ。./srcディレクトリをコンテナ内の/var/www/htmlにマウントします。
nginxサービス: Webサーバー。appコンテナと通信し、リクエストを処理します。
dbサービス: MySQLコンテナ。db_dataという名前付きボリュームにデータを永続化します。
5. Laravelプロジェクトの作成と設定
Dockerコンテナを起動する前に、Laravelプロジェクトを作成します。
Laravelプロジェクトのインストールターミナルで以下のコマンドを実行し、srcディレクトリ内にLaravelプロジェクトをインストールします。
Bash
docker-compose run --rm app composer create-project --prefer-dist laravel/laravel ./src
--rmオプションは、コンテナ終了後に自動で削除するために使用します。
.envファイルの設定
your-projectディレクトリ直下の.envファイルに、データベースの接続情報を追記します。
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=secret_password
Laravelの.envファイルの設定
srcディレクトリ内の.envファイルも同様に修正します。
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=${DB_DATABASE}
DB_USERNAME=${DB_USERNAME}
DB_PASSWORD=${DB_PASSWORD}
6. Nginx設定ファイルの作成
NginxがLaravelのルーティングを正しく処理できるように設定ファイルを作成します。
Nginx設定ファイル (docker/nginx/default.conf)
docker/nginxディレクトリを作成し、その中にdefault.confファイルを作成します。
Bash
mkdir docker/nginx
touch docker/nginx/default.conf
default.confファイルの中身は以下のようにします。
Nginx
server {
listen 80;
server_name localhost;
root /var/www/html/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php index.html index.htm;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
}
ポイント:
rootを/var/www/html/publicに設定することで、Laravelの公開ディレクトリをNginxが参照するようにします。
fastcgi_pass app:9000で、リクエストをappコンテナ(PHP-FPM)に転送します。
7. コンテナの起動と動作確認
全ての準備が整ったので、コンテナを起動します。
コンテナの起動ターミナルで以下のコマンドを実行します。
Bash
docker-compose up -d
-dオプションは、バックグラウンドでコンテナを起動します。
動作確認
ブラウザでhttp://localhost:8000にアクセスし、Laravelの初期画面が表示されることを確認します。
8. DB接続の確認
データベースが正しく接続されているか確認します。
マイグレーションの実行ターミナルで、PHPコンテナ内で以下のコマンドを実行します。
Bash
docker-compose exec app php artisan migrate
appコンテナ内のphp artisan migrateコマンドが実行され、データベースにテーブルが作成されることを確認します。エラーが出なければ、DB接続は成功です。
9. おわりに
この記事では、DockerとDocker Composeを使用して、PHP 8.2、Laravel、MySQLの環境をmacOS上に構築する手順を解説しました。