カテゴリー
SugiBlog Webデザイナー・プログラマーのためのお役立ちTips

Docker + Laravel9 開発環境構築

Dockerを使ってLaravel9の開発環境を構築してみたいと思います。
XAMPPやレンタルサーバーを使うよりお手軽に出来るので是非試してみてください。

OS等の環境は以下の通りです。

OS: Windows10
Docker Desktop: v4.14.1
Visual Studio Code: v1.74.0

Dockerで環境構築

予め必要なファイル等を準備します。
Laravelのプロジェクト名は「laravel-app」と仮定します。

docker/app/000-default.conf
<VirtualHost *:80>
       ServerAdmin webmaster@localhost
       DocumentRoot /var/www/html/laravel-app/public
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
       <Directory /var/www/html/laravel-app/public>
           AllowOverride All
       </Directory>
</VirtualHost>
docker/app/Dockerfile
# dockerイメージの選択
# 予めPHPとApacheがインストールされているイメージをDocker Hubからダウンロード
FROM php:8.0-apache

# 設定ファイルをdockerコンテナ内のPHP、Apacheに読み込ませる
# ADD:ローカルのファイルをDockerコンテナ内にコピーする
ADD php.ini /usr/local/etc/php/
ADD 000-default.conf /etc/apache2/sites-enabled/

# Composerのインストール
# RUN:コンテナ内でコマンド実行する
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer

# Node.jsをインストール
RUN curl -sL https://deb.nodesource.com/setup_16.x | bash -
RUN apt-get install -y nodejs

# ミドルウェアのインストール
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim \
libpng-dev \
libpq-dev \
&& docker-php-ext-install pdo_mysql

# Laravelで必要になるmodRewriteを有効化する
RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite

docker/app/php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.language = "Japanese"
docker/db/my.cnf

空ファイルでOK

.gitignore

gitでソース管理をするとき、mysql.sockがエラーを起こす場合があるので設定。不要であれば必要なし。

docker/db/data/mysql.sock
docker-compose.yml
# Compose fileのバージョン指定
version: '3'

# どんなコンテナを立ち上げるか
services:

 # ---------------------------------
 # laravelを動かすコンテナ
 # ---------------------------------
 app:
   # どのポートを開いて繋ぐか。下記はコンテナの80番ポートを開いて、ホストの80番につなぐ
   ports:
     - "80:80"
   # docker/appディレクトリにあるDockerfileを使って、コンテナをビルドするという指定
   build: ./docker/app
   # コンテナの名前を指定
   container_name: laravel_app
   # ローカルのディレクトリとコンテナ上のディレクトリのリンクを設定
   # ./src は docker-composer.yml のディレクトリ直下にある src を設定している
   # コンテナが作成されると src ディレクトリからコンテナの /var/www/html にアクセスすることができる
   volumes:
     - ./src:/var/www/html

# ----------------------------------
# MySQLを動かすコンテナ
# ----------------------------------
 db:
   # Docker HubからMySQL5.7の公式イメージをダウンロードしてくる指定
   image: mysql:5.7
   container_name: laravel_db

   # コンテナ内の環境変数を指定
   environment:
     MYSQL_ROOT_PASSWORD: root
     MYSQL_DATABASE: laravel_db
     MYSQL_USER: laravel_user
     MYSQL_PASSWORD: laravel_pass
     TZ: 'Asia/Tokyo'

   # 起動時のコマンド
   command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
   # ディレクトリ同期。設定ファイルとMySQLのデータが保存される場所を同期している。
   # コンテナは基本的に起動時に変更されてもコンテナ自体が止まるとデータが消えてしまうため、保存しておきたいものはホストマシンと同期しておく必要がある。
   volumes:
     - ./docker/db/data:/var/lib/mysql
     - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
   ports:
     - 3306:3306

# ----------------------------------
# phpMyAdminを動かすコンテナ
# ----------------------------------
 phpmyadmin:
  # Docker Hubからイメージをダウンロード
  image: phpmyadmin/phpmyadmin:5

  # コンテナの名前
  container_name: laravel_phpmyadmin

  # コンテナと他のサービスを繋げる
  links:
     - db

  # localhost:8080 で phpmyadmin の管理画面にアクセス
  ports:
     - 8080:80

  # セッション情報をボリュームに設定して永続化
  volumes:
     - ./docker/phpmyadmin/sessions:/sessions

GitHubにセットを用意しておいたので、そちらをダウンロードして使っていただいても構いません。
https://github.com/ksproducts/myDockerInitialPackage_for_Laravel9

準備が出来たら次のコマンドを実行して環境を構築します。

docker-compose build

構築が完了したら、出来上がったコンテナ達をバックグラウンドで起動します。

docker-compose up -d

プロセスを表示して動作しているか確認するには

docker-compose ps

Laravelのインストール

続いてLaravelのインストール作業に入ります。

まずはコンテナのシェルに入る必要があるので以下のコマンドを実行します。

docker exec -it laravel_app /bin/bash

Laravelのプロジェクトを作成します。
書式は次のようになります。
composer create-project "laravel/laravel=バージョン" プロジェクト名
今回はバージョン9なので次のようになります。

composer create-project "laravel/laravel=9.*" laravel-app

インストールが完了したらプロジェクトのディレクトリに移動します。

cd laravel-app

ログ等を保存するためにstorageディレクトリのパーミッションを変更します。

chmod 777 -R storage

アプリケーションキーを作成します。

php artisan key:generate

src/laravel-app/config/app.phpを修正
timezoneの設定をAsia/Tokyoに変更

src/laravel-app/.envファイルを編集し、接続するデータベース名などを設定
以下*の付いた4カ所を修正
DB_HOSTは通常localhostだがDockerの場合、DBコンテナを指定

DB_CONNECTION=mysql
DB_HOST=laravel_db *
DB_PORT=3306
DB_DATABASE=laravel_db *
DB_USERNAME=laravel_user *
DB_PASSWORD=laravel_pass *

データベースを初期化

php artisan migrate

5つのテーブルが出来ていればOK

  • failed_jobs
  • migrations
  • password_resets
  • personal_access_tokens
  • users

コンテナのシェルから出る場合はexitコマンドを実行します。

バリデーションメッセージの日本語化

コンテナシェルにいるついでに、Laravelのバリデーションメッセージを日本語化しておくと後々便利です。
バリデーションメッセージを日本語化するには以下のコマンドを順に実行します。

php -r "copy('https://readouble.com/laravel/8.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
php -f install-ja-lang.php 
php -r "unlink('install-ja-lang.php');"

src/laravel-app/config/app.phpを開き、'locale''ja'に変更する
これでフォーム入力時のエラーメッセージ等が日本語化されます。

まとめ

これで最低限一通りの環境構築は完了です。
XAMPPやレンタルサーバー上でのLaravel開発環境構築はかなり面倒でしたが、dockerを使うとかなり楽です。
参考になれば幸いです。

おまけ

Laravelでエラーが発生し、次のようなメッセージが表示された場合

The stream or file "/var/www/html/laravel-posting-app/storage/logs/laravel.log" could not be opened in append mode: Failed to open stream: Permission denied The exception occurred while attempting to log

これはエラーが出たのでログに書き込もうとしたが、書き込みが出来ないというエラーです。
storage/logs/laravel.logの権限がrootになっている場合に発生します。
apacheユーザーに変更してあげないといけないのですが、単純に該当のログファイルを削除してやると自身のユーザー権限で作成し直してくれるので、そのほうが手っ取り早いと思います。

この記事がお役に立ちましたらシェアお願いします
1,684 views

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です