DockerでPHPのLaravel環境作り直し

# 概要

私用PC（Windows10）が壊れました。
なので新PC（Windows11）で同等の環境（Vagrant、VMware、CentOS7）を作ろうとしたら、CentOSのEOLやVagrant実行時のHyper-Vなどに阻まれうまいこといかなかったため、Dockerにて作り直すことにしました。

## 構築したい環境
過去に作成した環境が古めなのですがそちらに合わせたいため、以下の構築をゴールとしました。

- PHP 7.4
- Apache2
- MySQL5.7
- Laravel8（[筆者の運用している音ゲーツールを動かせる状態にする](https://github.com/shioharugit/iidxmemo)）

# Docker

## Docker Desktopをインストール
https://www.docker.com/ja-jp/products/docker-desktop/

## ディレクトリ・設定ファイルの作成

```.txt:ディレクトリ構造
プロジェクトフォルダ
┣━ docker
┃ ┣━ MySQL
┃ ┃ ┗━ Dockerfile
┃ ┗ php
┃   ┣━ 000-default.conf
┃   ┣━ Dockerfile
┃   ┗━ php.ini
┗━ docker-compose.yml
```

```.txt:Dockerfile(MySQL)
FROM mysql:5.7
```

```.txt:Dockerfile（PHP）
# 新しめで作りたかったらphp:8.*にしましょう
FROM php:7.4-apache

RUN cd /etc/apache2/mods-enabled \
    && ln -s ../mods-available/rewrite.load

ADD php.ini /usr/local/etc/php/
ADD 000-default.conf /etc/apache2/sites-enabled/

RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer

RUN apt-get update \
    && apt-get install -y \
    git \
    zip \
    unzip \
    libzip-dev \
    vim \
    libpng-dev \
    libpq-dev \
    libfreetype6-dev \
    libjpeg-dev \
    libonig-dev \
    && docker-php-ext-install pdo pdo_mysql mysqli zip

RUN docker-php-ext-configure gd \
    --with-freetype=/usr/include/ \
    --with-jpeg=/usr/include \
    && docker-php-ext-install -j$(nproc) gd

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin

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

RUN composer self-update --2

# ここのNodesourceのURLはhttps://deb.nodesource.com/で確認しましょう
RUN curl -sL https://deb.nodesource.com/setup_20.x | bash -
RUN rm -rf node_modules
RUN apt-get install -y nodejs
RUN npm install npm -g n --save-dev cross-env
RUN npm cache clear --force
RUN npm install webpack --save
RUN npm install node-sass --nodedir=/usr/bin/node

WORKDIR /var/www/
```

```000-default.conf
<VirtualHost *:80>
       ServerAdmin webmaster@localhost
       DocumentRoot /var/www/public
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
       <Directory /var/www/public>
           AllowOverride All
           Require all granted
       </Directory>
</VirtualHost>
```

```php.ini
[PHP]
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.yml
# version:は非推奨らしい（https://github.com/compose-spec/compose-spec/blob/main/spec.md#version-top-level-element-obsolete ）
services:
    db:
        build: ./docker/mysql
        ports:
            - "33306:3306"
        environment:
            MYSQL_ROOT_PASSWORD: root
            # MYSQL_USER: はroot以外のユーザーの作成が必要あれば記述。
            MYSQL_PASSWORD: root
            MYSQL_DATABASE: ここは各自の作成したいデータベース名を記載
        volumes: 
            - ./docker/mysql/data:/var/lib/mysql
            - ./docker/mysql/initdb.d:/docker-entrypoint-initdb.d
    php:
        build: ./docker/php
        ports: 
            - "8080:80"
        volumes: 
            - ./src:/var/www
        depends_on: 
            - db
```

## ビルド

```
docker compose build
```

ちなみに筆者はnpm関連に3時間ほどかかった模様

https://x.com/shioharu_/status/1843936969367388257

## 起動

```
docker compose up
```

## GitHubからClone

筆者の場合、composerのコマンドでLaravelのプロジェクトファイルを作成するのではなく、過去に作成済のLaravelのリポジトリを使用したかったのでGitHubからCloneします。

```.txt:ディレクトリ構造
プロジェクトフォルダ
┣━ docker
┃ ┣━ MySQL
┃ ┃ ┗━ Dockerfile
┃ ┗ php
┃   ┣━ 000-default.conf
┃   ┣━ Dockerfile
┃   ┗━ php.ini
┣━ src ←ここのディレクトリにclone
┗━ docker-compose.yml
```

## PHPのコンテナに入る

```
docker compose exec php bash
```

## venderファイル作成

cloneしたリポジトリのcomposer.jsonとcomposer.lockファイルのところで

```
composer install
```

## アクセス確認

ブラウザから http://localhost:8080/ へアクセス。
筆者の場合ルートのアクセス画面ではTOP画面が出るようになっているのでそれでアクセスできるか確認。
（TOPからDBへのアクセスが走るようなシステムの場合、DBに接続できないエラーになるかなと）

パーミッションエラーが出たらstorageフォルダの権限を疑うといいかもです。

```
docker compose exec php bash
```

でphpのコンテナに入り、storageフォルダの所有者をwww-dataに変更。


```
chown www-data storage/ -R   
```

## Laravelの.envファイルの設定

ここではDB部分のところについて記載します。
docker-compose.ymlに沿って記載しましょう。

```
DB_CONNECTION=mysql
DB_HOST=db #docker-compose.ymlのservices:の名前と一致させる必要があります
DB_PORT=3306
DB_DATABASE= #docker-compose.ymlに記載したMYSQL_DATABASE
DB_USERNAME=root
DB_PASSWORD=root
```

## Migrationの実行

```
docker compose exec php bash
```

でphpのコンテナに入り、

```
php artisan migrate:fresh
```

以上でtableやseederがもともと作成済であればデータが入るので、
ブラウザから http://localhost:8080/ へアクセスして諸々使用できるようになっているかと思います。

## その他
筆者はPhpstormでDBを参照していますがそちらの接続情報についても記載しておきます。
こちらも基本的にはdocker-compose.ymlの設定に沿ってあげればOKかと。

| 項目 | 設定値 |
|:-:|:-:|
| ホスト | localhost |
| ポート | 33306 |
| 認証 | ユーザーとパスワード |
| ユーザー | root |
| パスワード | root |

![スクリーンショット 2024-10-18 154107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290284/ac2b89e0-e496-bb56-8abf-07dc38a91e6a.png)


## 参考にしたもの

### DockerからLaravel環境構築メモ 〜PHP8.0 Apache2 MySQL8.0.20〜h

https://qiita.com/kitajii/items/40ce2202f6623ad58dcf

### PHP7.4 ぼくのかんがえたさいきょうのphp.ini

https://qiita.com/ucan-lab/items/0d74378e1b9ba81699a9

### EC2+DockerでLaravel環境構築時にブラウザに表示されたエラーを解決する

https://qiita.com/shiva_it/items/15319800151dde30e047

### Laravelのmigrateエラー"No such file or directory"【Laravel×Docker】

https://hiro8blog.com/migrate-error-in-laravel-container/