Dockerを使ったLaravel8の環境構築

# やりたいこと
- Docker 及び Compose のインストールをしたい
- Docker を起動したい
- 起動した Docker 上で localhost のサーバーを立ち上げたい

# 前提
- OS
    - macOS Sonoma 14.6
- 各バージョン
    - PHP 8.2.10
    - Laravel8
- Laravel8 のプロジェクトは作成済み
    - 参考：https://qiita.com/s-y0001/items/60d9ee491264486b7454#%E5%89%8D%E6%8F%90

# Docker Desktopのインストール
https://matsuand.github.io/docs.docker.jp.onthefly/desktop/mac/install/

私の場合は「IntelチップのMac」からDocker.dmgをダウンロードし、インストール手順を実施しました。
インストールが完了しアカウント登録まで済むと Docker Desktop の起動に成功します。　

ちなみに、Docker Desktop には Compose の内容も含まれているため、個別で Compose のインストールを実施する必要はありません。
https://matsuand.github.io/docs.docker.jp.onthefly/compose/install/#install-compose-on-macos
> Docker Desktop for Mac には他の Docker アプリとともに Compose が含まれています。 したがって Mac ユーザーは Compose を個別にインストールする必要はありません。

以下のコマンドで　Compose がインストールされていることを確認できます。
```bash
$ docker-compose --version
Docker Compose version v2.29.1-desktop.1
```
# 必要なファイル作成
### ディレクトリ構成
```
Laravelのプロジェクト
  ├── app
  ├── bootstrap
  ├── ...
  ├── docker
  │   ├── php
  │   │    ├── Dockerfile
  │   │    └── php.ini
  │   └── nginx
  │        ├── Dockerfile
  │        └── nginx.conf
  ├── docker-compose.yml
  ├── ...
```
### 作成するコンテナ
- PHP 8.2
- MySQL 8.1
- Nginx 1.27
- node 18

### docker-compose.ymlの作成
以下の内容でdocker-compose.ymlを作成しました。
PHPとnginxのバージョンは引数で指定しています。
```yml
services:
    php:
        build:
            context: ./docker/php
            args:
                - VERSION=8.2.10
        volumes:
            - ./:/var/www/html
        depends_on:
            - mysql
        environment:
            - TZ=Asia/Tokyo
            - LANG=C.UTF-8

    nginx:
        build:
            context: ./docker/nginx
            args:
                - VERSION=1.27
        ports:
            - "8000:8000"
        volumes:
            - ./:/var/www/html
            - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
        depends_on:
            - php
        environment:
            - TZ=Asia/Tokyo
            - LANG=C.UTF-8

    mysql:
        image: mysql:8.1.0
        ports:
            - "3306:3306"
        volumes:
            - mysql_data:/var/lib/mysql/data
        environment:
            - TZ=Asia/Tokyo
            - LANG=C.UTF-8
            - MYSQL_ROOT_PASSWORD=secret
            - MYSQL_DATABASE=laravel

    node:
        image: node:18
        volumes:
            - ./:/var/www/html
        working_dir: /var/www/html
        environment:
            - TZ=Asia/Tokyo
            - LANG=C.UTF-8
        stop_signal: SIGKILL
        tty: true

volumes:
    mysql_data:
```

### Dockerfileの作成
#### ./docker/php/Dockerfile
docker-compose.ymlで指定したPHPのバージョンを`VERSION`の変数で受け取っています。
```Dockerfile
ARG VERSION
FROM php:${VERSION}-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"
```

#### ./docker/nginx/Dockerfile
docker-compose.ymlで指定したnginxのバージョンを`VERSION`の変数で受け取っています。
```Dockerfile
ARG VERSION
FROM nginx:${VERSION}
```

### php.iniの作成
```ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
```

### nginx.confの作成
```conf
user nginx;

events {
    worker_connections 1024;
}

http {
    server {
        listen 8000;
        server_name localhost;
        root /var/www/html/public;

        location / {
            index index.php index.html;
            try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass php:9000;
            fastcgi_index index.php;
            include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    }
}
```

# Dockerコンテナの起動
`docker compose up -d`のコマンドでコンテナを起動します。
コンテナがない場合は作成から実行されます。
```bash
docker compose up -d
[+] Running 4/4
 ✔ Container laravelapp-mysql-1  Started
 ✔ Container laravelapp-node-1   Started
 ✔ Container laravelapp-php-1    Started
 ✔ Container laravelapp-nginx-1  Started
```

# localhostにアクセス
http://localhost:8000 にアクセスするとLaravelプロジェクトの初期ページが表示されます。


# 参考
- https://qiita.com/phper_sugiyama/items/654f7a9171ae5ccf3e83
- https://qiita.com/gon0821/items/77369def082745d19c38
- https://qiita.com/Anorlondo448/items/c0234b2a5bf51578c974