Docker Composeを用いてLaravel環境構築

## はじめに
[前回の記事](https://qiita.com/NNKK1234/items/d188171e0ac54e1692bc)までで、docker-composeの基礎部分は理解できたと思いました。今回はdocker-composeを使用してLaravel環境を構築していこうと思います。

## ファイル準備
###### ディレクトリ構成
```
/ -- docker-compose.yml
                   app/ -- Laravelアプリのソースコード
                   
                   web/ -- Dockerfile
                              apache/ -- 000-default.conf
                                 php/ -- php.ini
```

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

services:
  web:
    build: ./web
    container_name: web
    # Laravelのソースコードを格納する
    volumes:
      - ./app:/var/www/html
    # working_dirを設定することで、コンテナに入った時にこのディレクトリから入れる
    working_dir: /var/www/html
    ports:
      - "8080:80"
    depends_on:
      - db
  db:
    image: mysql:8.0
    container_name: db
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: LaravelDB
      MYSQL_ROOT_PASSWORD: password
```

###### / web / Dockerfile
```Dockerfile:Dockerfile
FROM php:8.0-apache

# phpの設定ファイルとhttpdの設定ファイルをコンテナ内に設コピー
COPY ./php/php.ini /usr/local/etc/php/
COPY ./apache/000-default.conf /etc/apache2/sites-enabled/

RUN apt-get update

# Laravelプロジェクト作成に必要なパッケージをインストール
RUN apt -y install git unzip

# phpで必要なモノをインストール
RUN docker-php-ext-install pdo_mysql mysqli

# composerのインストール
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
    && php -r "if (hash_file('sha384', 'composer-setup.php') === 'ハッシュ値') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \
    && php composer-setup.php \
    && php -r "unlink('composer-setup.php');" \
    && mv composer.phar /usr/local/bin/composer

#Laravelプロジェクトの作成
RUN composer create-project laravel/laravel --prefer-dist laravel_sample

# -- memo -- #
# RUN命令はDockerfileからイメージを作成するときに実行される
# CMD命令はイメージからコンテナが作成される時に実行される
```

###### / web / apache / 000-default.conf
```conf:000-default.conf
<VirtualHost *:80>

        DocumentRoot /var/www/html/laravel_sample/public

        <Directory /var/www/laravel_sample>
                AllowOverride All
                Require all granted
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>
```

###### / web / php / php.ini
```ini:php.ini
[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
```

###### ポイント
- / docker-compose.yml
volumesでLaravelプロジェクトを作成するディレクトリを指定しています。そのため、ローカルでは /app ディレクトリにLaravelのソースコードが同期されます。

- / web / Dockerfile
Laravel環境構築に必要なモノ(Composerなど)のインストールや設定ファイルをローカルからコンテナにコピーしたりしています。「docker-php-ext-install」をすることで、インストールと有効化を同時にしています。
最後にLaravelプロジェクトを作成しています。

- / web / apache / 000-default.conf
apacheのバーチャルホストの設定を記載しています。

## Laravel環境を構築する
###### コンテナを作成・起動する
以下のコマンドを実行することで、Laravel環境が構築され、Laravelプロジェクトも作成されます。
```
docker-compose up -d
```

###### 起動確認
以下にアクセスし、Laravelの初期ページが表示されれば構築成功です。
```
http://localhost:8080
```

## 最後に
当初の目的であった、dockerでLaravel環境構築は達成できました。
これからは、実際に構築したLaravel環境で簡単なアプリケーションを開発してみようと思います。

## 参考文献
- [DockerとLaravelを使って開発してみよう](https://www.twilio.com/blog/get-started-docker-laravel-jp)
- [Laravel開発環境をDockerを使ってサクッと構築する【最小限のコード】｜Webエンジニア研究室](https://www.engilaboo.com/laravel-docker/)
- [ComposerのインストールからLaravelプロジェクトの作成及び実行まで - Qiita](https://qiita.com/hirotatsuuu/items/7f86344b1f2ffaf0dc7f)