【2023年版】Dockerを使ったLaravelの環境構築

## はじめに

最近は現場でも、Docker環境下でLaravleを触ることが増えて少しは知見も溜まってきたので、得た知見を忘れないように忘備録として残しておきます.

ここでは、`docker`や`docker-compose`のインストールに関しては触れませんので、まだの方は[こちらの記事](https://qiita.com/zembutsu/items/dd2209a663cae37dfa81)がわかりやすかったので参考にしてみてください.

## 構成
任意のディレクトリに`SampleProject`を作成して下記のディテクトり構成で環境を構築します.

```
SampleProject
  ├── docker-compose.yml
  ├── docker
  │   ├── php
  │   │    ├── Dockerfile
  │   │    └── php.ini
  │   └── nginx
  │        └── default.conf
  └── src
      └──  Laravelのプロジェクトファイル
```

## docker-compose.ymlの中身
`docker-compose.yml`は複数のコンテナを同時に動かすためのツールである、`Docker Compose`を利用するために使用するymlファイルです.

```docker-compose.yml
version: '3'

services:
  php:
    build: ./docker/php
    volumes:
      - ./src:/var/www

  nginx:
    image: nginx
    ports:
      - 80:80
    volumes:
      - ./src:/var/www
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: sample_project
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      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

  node:
    image: node:12.13-alpine
    tty: true
    volumes:
      - ./src:/var/www
    working_dir: /var/www
```

## Dockerfileの中身
`Dockerfile`とはDocker上で動作させるコンテナの構成情報を記述するためのファイルです.

```Dockerfile
FROM php:8.0-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"
```

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

## default.confの中身
`default.conf`はngninxの設定情報を記述するためのファイルです.

```default.conf
server {
  listen 80;
    index index.php index.html;
    root /var/www/sampleProject/public;

  location / {
    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;
  }
 }
```

## 環境構築の手順

はじめに任意の場所に`SampleProject`を作成する.

```
~/ $ mkdir SampleProject
```

`docker-compose.yml`ファイルを作成して、中身は冒頭で紹介した`docker-compose.yml`の内容をコピペする.

```
~/SampleProject $ touch docker-compose.yml
```

`Dockerfile`と`php.ini`を作成して、中身は冒頭で紹介したそれぞれのファイルの内容をコピペする.

```
~/SampleProject/docker/php $ touch Dockerfile
~/SampleProject/docker/php $ touch php.ini
```

`defalt.conf`ファイルを作成して、中身は冒頭で紹介した`default.conf`の内容をコピペする.

```
~/SampleProject/nginx $ touch default.conf
```

`docker-compose.yml`ファイルがあるディレクトリ内で下記コマンドを実行して`docker`を起動する.

```
~/SampleProject $ docker-compose up -d

Creating php                ... done
Creating db-host            ... done
Creating sampleproject_node ... done
Creating nginx              ... done
```

PHPのコンテナ内に入る.

```
~/SampleProject $ docker-compose exec php bash
```

PHPコンテナ内でLaravelプロジェクトを作成する.

```
root@7eb4359bf51c:/var/www# laravel new sampleProject
```

Laravelのプロジェクトが入っているか確認する.
バージョンが出力されればOKです.

```
root@7eb4359bf51c:/var/www/sampleProject# php artisan --version
Laravel Framework 9.10.0
```

PHPコンテナを抜ける.

```
root@7eb4359bf51c:/var/www# exit
```

これで`SampleProject/src`内にLaravelのプロジェクトファイルが作成され、
http://localhost/ にアクセスするとおなじみのWelcomeページが表示されます.

![スクリーンショット 2020-02-01 23.33.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283595/dd205fe6-f024-5491-a7c0-912a893a9c5a.png)

MySQLコンテナに入る.

```
~/SampleProject $ docker-compose exec db bash
```

コンテナ内でMySQLにログイン.

```
root@630fbaf32806:/# mysql -u root -proot
```

今回のプロジェクトで使用するデータベースを作成する.
データベース名はdocker-compose.ymlで指定した、`MYSQL_DATABASE `と合わせる必要があります.

```
mysql> mysql> CREATE DATABASE sample_project;

Query OK, 1 row affected (0.01 sec) 
```

Laravelのプロジェクトファイル内の`.env`ファイルを下記に修正する.

```:.env
DB_CONNECTION=mysql
DB_HOST=db　# docker-compose.ymlに記載したDBのサービス名
DB_PORT=3306
DB_DATABASE=sample_project # 使用するDB名
DB_USERNAME=root
DB_PASSWORD=root
```

PHPコンテナに入る.

```
~/SampleProject $ docker-compose exec php bash
```

phpコンテナ内でマイグレーションを実行する.

```
root@7eb4359bf51c:/var/www# php artisan migrate

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.06 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.04 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.02 seconds)
```

マイグレーションが無事に実行されれば成功です！！