0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

macOSでDockerを使い、PHP 8.2とLaravelの環境を構築する手順

Posted at

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上に構築する手順を解説しました。

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?