🌱

Laravelの開発環境をDockerで構築する

2025/01/21に公開

開発環境

  • macOS
  • VSCode
  • Laravel
  • PHP
  • MySQL
  • NGINX

行いたいこと

  • Laravelの開発環境をDockerで構築したのでその流れを記載します




Laravelの開発環境をDockerで構築する手順

・Laravel開発環境を構築していくディレクトリの作成をしファイルに移動する
ターミナル
$ mkdir Laravel_app  # ディレクトリの作成

$ cd Laravel_app  # ディレクトリへ移動


※ 作成したLaravel_appディレクトリの配下に以下のようなディレクトリとファイルを作成する
Image from Gyazo


Laravel_appディレクトリの配下にdockerディレクトリを作成する
ターミナル
$ mkdir docker  # ディレクトリの作成

$ cd docker  # ディレクトリへ移動




dockerディレクトリの配下にnginxというディレクトリを作成する
ターミナル
$ mkdir nginx  # ディレクトリの作成

$ cd nginx  # ディレクトリへ移動
nginxディレクトリの配下にdefault.confを作成する(nginxの設定をするファイル)
ターミナル
$ touch default.conf  # ファイルの作成
・作成されたdefault.confファイルにコードを記載する
default.conf
server {
    listen 80;

    root /var/www/laravel-app/public;  
    index index.php;  

    location / {
        root /var/www/laravel-app/public;
        index index.php;

        try_files $uri $uri/ /index.php$query_string;
    }

    location ~ .php$ {
        try_files $uri =404;

        fastcgi_split_path_info ^(.+.php)(/.+)$;

        fastcgi_pass app:9000;
        fastcgi_index index.php;

        include fastcgi_params;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
コードの解説
default.conf
server {  # サーバーブロック開始
    listen 80;  # HTTPリクエストのポート80番で待機

    root /var/www/laravel-app/public;  # ドキュメントルートをLaravel-appのpublicディレクトリに設定
    index index.php;  # デフォルトのインデックスファイルをindex.phpに設定

    location / {  # ルートパス(/)へのリクエスト処理
        root /var/www/laravel-app/public;  # ルートパスでもpublicディレクトリを参照
        index index.php;  # index.phpを優先的に探す

        try_files $uri $uri/ /index.php$query_string;  # リクエストされたファイルが存在すればそのまま返し、なければindex.phpにリダイレクト
    }

    location ~ .php$ {  # PHPファイルへのリクエスト処理
        try_files $uri =404;  # PHPファイルが存在しなければ404エラーを返す

        fastcgi_split_path_info ^(.+.php)(/.+)$;  # PHPファイルのパスを分割

        fastcgi_pass app:9000;  # PHP-FPMにリクエストを転送(コンテナ名 app を指定)
        fastcgi_index index.php;  # インデックスファイルをindex.phpに設定

        include fastcgi_params;  # FastCGIリクエストの基本パラメータをインクルード

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  # PHPスクリプトのフルパスを設定
        fastcgi_param PATH_INFO $fastcgi_path_info;  # PATH_INFOをPHPに渡す
    }
}




dockerディレクトリの配下にphpというディレクトリを作成する
ターミナル
$ mkdir php  # ディレクトリの作成

$ cd php  # ディレクトリへ移動
phpディレクトリの配下にDockerfileを作成する(Dockerコンテナの起動に使うファイル)
ターミナル
$ touch Dockerfile  # ファイルの作成
・作成されたDockerfileにコードを記載する
Dockerfile
FROM php:8.2-fpm
COPY php.ini /usr/local/etc/php/

RUN apt-get update \
  && apt-get install -y zlib1g-dev mariadb-client vim libzip-dev \
  && docker-php-ext-install zip pdo_mysql

#Composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin


WORKDIR /var/www

RUN composer global require "laravel/installer"
コードの解説
Dockerfile
# 使用するPHPのバージョンを指定。8.2-fpmはPHPのFastCGI Process Manager版を使用。
FROM php:8.2-fpm

# カスタムのphp.iniをコンテナ内にコピー
COPY php.ini /usr/local/etc/php/

# パッケージリストを更新し、必要なライブラリをインストール
RUN apt-get update \
  && apt-get install -y zlib1g-dev mariadb-client vim libzip-dev \
  && docker-php-ext-install zip pdo_mysql

# Composerをインストールするコマンド
# Composerのインストーラーをダウンロード
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

# ダウンロードしたインストーラーを実行
RUN php composer-setup.php

# インストーラーを削除してきれいにする
RUN php -r "unlink('composer-setup.php');"

# composer.pharをシステム全体で使用できるように /usr/local/bin/composer に移動
RUN mv composer.phar /usr/local/bin/composer

# Composerの動作に関する環境変数を設定
ENV COMPOSER_ALLOW_SUPERUSER 1

# Composerのホームディレクトリを設定
ENV COMPOSER_HOME /composer

# コンテナ内でComposerの実行パスを追加
ENV PATH $PATH:/composer/vendor/bin

# 作業ディレクトリを指定 (コンテナ内での作業場所)
WORKDIR /var/www

# Laravelインストーラーをグローバルにインストール
RUN composer global require "laravel/installer"




phpディレクトリの配下にphp.iniファイルを作成する(PHPの設定をするファイル)
ターミナル
$ touch php.ini  # ファイルの作成
・作成されたphp.iniファイルにコードを記載する
php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
[opcache]
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
コードの解説
php.ini
[Date]
date.timezone = "Asia/Tokyo"  # PHPのデフォルトタイムゾーンを「Asia/Tokyo」に設定

[mbstring]
mbstring.internal_encoding = "UTF-8"  # mbstringの内部エンコーディングをUTF-8に設定
mbstring.language = "Japanese"  # mbstringの使用する言語を日本語に設定

[opcache]
opcache.memory_consumption = 128  # OPCacheのメモリ消費量を128MBに設定
opcache.interned_strings_buffer = 8  # OPCacheの内部文字列バッファサイズを8MBに設定
opcache.max_accelerated_files = 4000  # 最大のアクセラレートファイル数を4000に設定
opcache.revalidate_freq = 60  # ファイル変更の再確認頻度を60秒に設定
opcache.fast_shutdown = 1  # OPCacheのシャットダウン時に最適化を行う設定
opcache.enable_cli = 1  # CLIでもOPCacheを有効にする




Laravel_appディレクトリの配下にcompose.ymlファイルを作成する
ターミナル
$ touch compose.yml  # ファイルの作成
・作成されたcompose.ymlファイルにコードを記載する
compose.yml
services: 
  app: 
    container_name: app  
    build: ./docker/php   
    volumes: 
      - .:/var/www  

  nginx: 
    image: nginx   
    container_name: nginx   
    ports: 
      - 8000:80  
    volumes:  
      - .:/var/www  
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf 
    working_dir: /var/www  
    depends_on:  
      - app   

  db: 
    image: mysql:5.7  
    container_name: db  
    environment:   
      MYSQL_ROOT_PASSWORD: root 
      MYSQL_DATABASE: database  
      MYSQL_USER: db-user   
      MYSQL_PASSWORD: db-pass  
      TZ: 'Asia/Tokyo' 
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci  
       
    volumes:  
      - ./docker/db/data:/var/lib/mysql  
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf  
      - ./docker/db/sql:/docker-entrypoint-initdb.d  
    ports:   
      - 3306:3306   
コードの解説
compose.yml
services:  # 複数のサービス(コンテナ)を定義するセクション
  app:  # PHPアプリケーションを実行するサービス
    container_name: app  # コンテナ名を "app" に指定
    build: ./docker/php  # ./docker/php ディレクトリにある Dockerfile を使ってイメージをビルド
    volumes:  # ホストとコンテナ間で共有するフォルダを指定
      - .:/var/www  # ホストの現在のディレクトリをコンテナ内の /var/www にマウント

  nginx:  # Nginx(Webサーバー)を実行するサービス
    image: nginx  # DockerHub から公式の Nginx イメージを利用
    container_name: nginx  # コンテナ名を "nginx" に指定
    ports:  # ポートのマッピングを設定
      - 8000:80  # ホストの8000番ポートをコンテナの80番ポートにマッピング
    volumes:  # ホストとコンテナ間で共有するフォルダを指定
      - .:/var/www  # ホストの現在のディレクトリをコンテナ内の /var/www にマウント
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf  # Nginx の設定ファイルをコンテナ内にマウント
    working_dir: /var/www  # コンテナ内での作業ディレクトリを /var/www に設定
    depends_on:  # このサービスが依存する他のサービスを指定
      - app  # "app" サービスが起動した後にこのサービスを起動

  db:  # データベース(MySQL)を実行するサービス
    image: mysql:5.7  # DockerHub から MySQL 5.7 のイメージを利用
    container_name: db  # コンテナ名を "db" に指定
    environment:  # 環境変数を指定(MySQLの初期設定用)
      MYSQL_ROOT_PASSWORD: root  # MySQL の root ユーザーのパスワード
      MYSQL_DATABASE: database  # 作成するデータベース名
      MYSQL_USER: db-user  # 作成するデータベースユーザー
      MYSQL_PASSWORD: db-pass  # データベースユーザーのパスワード
      TZ: 'Asia/Tokyo'  # タイムゾーンを日本時間に設定
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci  
      # MySQLの起動時に文字セットと照合順序を指定
    volumes:  # ホストとコンテナ間で共有するフォルダを指定
      - ./docker/db/data:/var/lib/mysql  # データベースのデータをホストに永続化
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf  # MySQL の設定ファイルをコンテナ内にマウント
      - ./docker/db/sql:/docker-entrypoint-initdb.d  # 初期化用SQLファイルを配置
    ports:  # ポートのマッピングを設定
      - 3306:3306  # ホストの3306番ポートをコンテナの3306番ポートにマッピング




Dockerコンテナの起動

・作成したcompose.ymlファイルを使いDockerコンテナを起動します
フォアグラウンドでDockerコンテナを起動する場合(リアルタイムでログの表示)

・新しいターミナルを開いて以下のコマンド(ログがターミナルにリアルタイムで表示される)

ターミナル
$ docker compose up  # フォアグラウンドでDockerの起動

・コンテナの停止
コンテナ起動中のターミナルでCtrl + C(Mac / Linux)

バックグラウンドでDockerコンテナを起動する場合

・既存のターミナルで以下のコマンド

ターミナル
$ docker compose up -d # バックグラウンドでDockerの起動

・コンテナの停止と再開

ターミナル
$ docker compose stop  # Dockerコンテナを停止

$ docker compose start  # Dockerコンテナを再開
Dockerコンテナが正常に起動しているかの確認
$ docker compose ps


※ この時点ではまだhttp://localhost:8000/に繋いでも404 Not Foundのエラーが出ている
Image from Gyazo




Laravelのアプリケーションを作成する

・Dockerコンテナ起動後、以下のコマンドでコンテナの中に入る
$ docker compose exec app bash
・Laravelのアプリケーションを作成するコマンド
$ composer create-project --prefer-dist laravel/laravel laravel-app "10.*"
lsコマンドでLaravelのアプリケーションが作成されたことを確認
$ ls

・出力例

macbook@MacBook-Air laravel-app % ls
README.md	bootstrap	config		phpunit.xml	routes		vendor
app		composer.json	database	public		storage		vite.config.js
artisan		composer.lock	package.json	resources	tests


※ 正しくできていればhttp://localhost:8000/で以下のように表示されます。
Image from Gyazo


以上でDockerによるLaravelの開発環境の構築は終了です。






GitHubで編集を提案

Discussion