Laravel環境構築(チュートリアル版)

資料収集中

Dockerコンテナの作成

ターミナル(Ubuntu)を開き、Docker用のフォルダーに移動して、今回のプロジェクト用のフォルダーを作る

mkdir sample5

プロジェクト用フォルダーに移動してVSCodeを起動する

cd sample5
code . &

フォルダの作成

コンテナ定義はdockerフォルダ下に作成

  • appコンテナ:(PHP+Laravel)
  • dbコンテナ:(MySQL)
  • webコンテナ:(nginx)

下記を参照してフォルダを作る

.
├── docker
│   ├── app
│   │   ├── Dockerfile
│   │   └── php.ini
│   ├── db
│   │   ├── Dockerfile
│   │   └── my.conf
│   └── web
│       ├── Dockerfile
│       └── default.conf
├── docker-compose.yml
└── src

appコンテナ(PHP+Laravel)

まずはLaravelの開発環境を構築するための、appコンテナを作成します。

  • docker-compose.ymlへの記述(共通ファイル)
  • appコンテナ用のDockerfile
  • appコンテナ用の設定ファイル(php.ini)

docker-compose.yml

version: "3.9"

services:
  app:
    build:
      context: .
      dockerfile: ./docker/app/Dockerfile
    volumes:
      - ./src/:/app

Dockerfile

参考サイトではphpのバージョンが8.0だったが、導入したいLaravelの推奨の関係で8.1とした。またcomposerが2.0となっていたが、2.2とした。

FROM php:8.1-fpm

ENV TZ Asia/Tokyo

RUN apt-get update && \
	apt-get install -y git unzip libzip-dev libicu-dev libonig-dev && \
	docker-php-ext-install intl pdo_mysql zip bcmath
		
COPY ./docker/app/php.ini /usr/local/etc/php/php.ini

COPY --from=composer:2.2 /usr/bin/composer /usr/bin/composer

WORKDIR /app

php.ini

zend.exception_ignore_args = off
expose_php = on
max_execution_time = 30
max_input_vars = 1000
upload_max_filesize = 64M
post_max_size = 128M
memory_limit = 256M
error_reporting = E_ALL
display_errors = on
display_startup_errors = on
log_errors = on
error_log = /var/log/php/php-error.log
default_charset = UTF-8

[Date]
date.timezone = Asia/Tokyo

[mysqlnd]
mysqlnd.collect_memory_statistics = on

[Assertion]
zend.assertions = 1

[mbstring]
mbstring.language = Japanese

起動チェック

一旦起動

docker-compose up -d --build

起動したコンテナを確認する

docker-compose ps

コンテナの中に入ってみる

docker-compose exec app bash

色々チェック

# Dockerfileの「WORKDIR /app」で指定したカレントディレクトリ通りか確認
pwd

# Dockerfileの「WORKDIR /app」で指定したカレントディレクトリ通りか確認
php -v

# Composerのバージョン確認
composer -v

# gitのバージョン確認
git --version

# インストール済の拡張機能の一覧
php -m

# php.iniがコピー出来ているか確認
cat /usr/local/etc/php/php.ini

コンテナから抜ける

exit

webコンテナ(nginx)

docker-compose.yml

ポートが記事の作者の方の都合で8081になっていたので、8080にした。

services:
  api:

// 中略
  
  web:
    build:
      context: .
      dockerfile: ./docker/web/Dockerfile
    ports:
      - 8080:80
    depends_on:
      - app
    volumes:
      - ./src/:/app

Dockerfile(nginx)

FROM nginx:1.20-alpine

ENV TZ Asia/Tokyo

COPY ./docker/web/default.conf /etc/nginx/conf.d/default.conf

設定ファイル(default.conf)

server {
    listen 80;
    server_name example.com;
    root /app/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    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_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

コンテナを再起動する

docker-compose up -d --build

確認

docker-compose exec web nginx -v

dbコンテナ(MySQL)

docker-compose.yml(MySQL)

services:
	
// 中略

  db:
    build:
      context: .
      dockerfile: ./docker/db/Dockerfile
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: database
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
      TZ: 'Asia/Tokyo'
    volumes:
      - mysql-volume:/var/lib/mysql

volumes:
  mysql-volume:

Dockerfile(MySQL)

FROM mysql:8.0

COPY ./docker/db/my.conf /etc/my.conf

設定ファイル(my.conf)

[mysqld]
# character
character_set_server = utf8mb4
collation_server = utf8mb4_0900_ai_ci

# timezone
default-time-zone = SYSTEM
log_timestamps = SYSTEM

# Error Log
log-error = mysql-error.log

# Slow Query Log
slow_query_log = 1
slow_query_log_file = mysql-slow.log
long_query_time = 1.0
log_queries_not_using_indexes = 0

# General Log
general_log = 1
general_log_file = mysql-general.log

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4

コンテナを再起動する

docker-compose up -d --build

確認

docker compose exec db mysql -V

Laravel環境構築

Laravelのプロジェクトを作成したら、DBとLaravelを接続します。
そしてマイグレーションを行ってDBにテーブルを作成してから、MySQLにログインしてDBを使う動作確認をしたいと思います。

プロジェクトの作成

コンテナに入る。

docker compose exec app bash

プロジェクトを作成

composer create-project --prefer-dist "laravel/laravel=10.*" .

同期がかかっているのでVSCode側で見ているとsrcにファイル/フォルダが作成されていく。

パーミッションの変更

storageフォルダのパーミッションを変更

chmod 777 -R storage

確認

バージョンチェック

php artisan -v

動作チェック

DBの接続

  • /src/.env
  • docker-compose.ymlのenvironmentを見ながら各項目を修正
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
↓
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=user
DB_PASSWORD=password

不採用:確認1

コンテナに入る

docker compose exec app bash

確認

Laravelのデフォルトで用意されているマイグレーションファイル通りにテーブルが作成されるかどうか?

php artisan migrate

確認2をするために、DBコンテナから抜けておく:exit

不採用:確認2

コンテナに入る

docker-compose exec db bash

MySQLコンソール起動

パスワードを求められる:password

mysql -u root -p

確認

use database;
show tables;
  • テーブルが表示されればOK
  • MySQLコンソールとコンテナから抜けておく:exitを多分2回

Laravel Breezeの導入

環境整備

フロントエンドの依存関係管理とビルドプロセスにNode.jsとnpm(Node Package Manager)を使用するため、予めサーバーにインストールしておく必要がある。

コンテナに入る

docker-compose exec app bash

Node.jsとnpmのインストール

(rootでない場合はsudoが必要と思われる)

apt-get update
apt-get install nodejs
apt-get install npm

インストール後の確認。下記コマンドを実行してパスが返ればOK

which node
which npm

Laravel Breezeのインストール

インストール

composer require laravel/breeze --dev
php artisan breeze:install blade
不採用1
公式はこのような記述
composer require laravel/breeze --dev
php artisan breeze:install blade
php artisan migrate
npm install
npm run dev
不採用2
composer require laravel/breeze
php artisan breeze:install

途中でいくつか質問される。

  • Which stack would you like to install?:0(blade)
  • Would you like to install dark mode support?:no
  • Would you prefer Pest tests instead of PHPUnit?:no

ここで、node.jsやnpmが入っていないとエラーになる。

確認

コメントする