PHP8.0 + Laravel6.x(LTS)環境をDocker Composeで手早く作る

本記事はAll About Group（株式会社オールアバウト） Advent Calendar 2020 15日目になります。

# 概要三行
+ LAMP(PHP8.0) + Laravelの簡易開発環境をDocker Composeで作成
+ 基本コピペで誰でも作業できるように記述。
+ ```{}```で囲んでいる箇所は任意に書き換えてください。

# 概要
PHP8.0が正式リリースされましたね。https://www.php.net/releases/8.0/en.php
実行速度の改善はありがたい限りです。
気になる楽しみ！ということで、今回はPHP8で遊べるように簡易のLAMP+laravel開発環境を構築いたしました。


# 環境構築_概要

## 使用技術 / 環境
+ Docker Compose
+ centos7
+ PHP8.0
+ laravel6.x(LTS)
+ MySQL(5.7)
+ phpMyAdmin

## 構成について
先に、今回作成する開発環境の構成を説明しておきます

```
{開発環境_命名は自由} /
├── docker-compose.yaml
├── web_php8/
| 　├── Dockerfile
| 　└── setup/
| 　　　　├──.bashrc
| 　　　　└── httpd/
| 　　　　　　　└── app.conf
└── repository/
　　　└── {laravelアプリ(命名は自由)}
```
|名称  |種別  |概要  |
|---|---|---|
|{開発環境_命名は自由}/|📂 ディレクトリ|今回の開発環境ファイルを束ねるディレクトリ|
|docker-compose.yaml  |📝 ファイル  |docker composeの実行ファイル|
|web_php8/  |📂 ディレクトリ  |WEB系コンテナの関連ファイル置き場です|
|web_php8/Dockerfile  |📝 ファイル  |今回作成するWEB系コンテナのDocker Fileです|
|web_php8/setup/  |📂 ディレクトリ  |WEB系コンテナ内での設定ファイル郡です  |
|web_php8/setup/.bashrc  |📝 ファイル  |WEB系コンテナ内に適用するbashrcです  |
|web_php8/setup/httpd/  |📂 ディレクトリ  |WEB系コンテナ内に適用するApacheの設定ファイル郡です  |
|web_php8/setup/httpd/app.conf  |📝 ファイル  |WEB系コンテナで摘要するconfファイルです  |
|repository/  |📂 ディレクトリ  |WEBサーバーで稼働させるWEBアプリ置き場です  |
|repository/{laravelアプリ(命名は自由)}  |📂 ディレクトリ  |今回WEB系コンテナ内で稼働させるLaravelアプリです |

本件で立ち上がるコンテナは、WEB、DB、PHP-MY-ADMINの３つです。
最低限の環境なので、自由に変更/追加するといいと思います。

```repository``` ディレクトリに保管したアプリをWEBコンテナ内にマウントしており、
アプリ開発する際には、localの```repository/{laravelアプリ(命名は自由)} ```を編集すれば、コンテナ内に反映されます。

## URL
今回の構築にて作成されるURLを記載します

|名称  |URL  |
|---|---|
|アプリURL|http://localhost/|
|phpMyAdmin|http://localhost:89/|




## 前提
+ 筆者はMac端末で作業しております。
+ ```{}```で囲んでいる箇所は任意に書き換えてください。
+ docker-composeは既に入っているものとします。


## 環境構築_手順

### docker-compose.yamlの作成

複数のdockerコンテナを束ねるDocker Composeのyamlファイルを作成します。
※ {}で囲んでいる箇所は任意に書き換えてください

```
mkdir {開発環境_命名は自由}; cd {開発環境_命名は自由}
vim docker-compose.yaml
```
下記を```docker-compose.yaml```に記述してください

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

services:
  web_php8:
    build:
      context: ./web_php8
    volumes:
      - ./repository/{laravelアプリ(命名は自由)}:/var/www/{laravelアプリ(命名は自由)}
      - ./web_php8/setup/.bashrc:/root/.bashrc
    ports:
      - "80:80"
    working_dir: /var/www/{laravelアプリ(命名は自由)}/
    environment:
      TZ: "Asia/Tokyo"

  db:
    image: mysql:5.7
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: test_db
      MYSQL_USER: test_user
      MYSQL_PASSWORD: test_pass
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      TZ: "Asia/Tokyo"

  php-my-admin:
    image: phpmyadmin/phpmyadmin
    links:
      - db
    ports:
      - "89:80"
    environment:
      MYSQL_USERNAME: test_user
      MYSQL_ROOT_PASSWORD: test_pass
      PMA_HOST: db
      PMA_PORT: 3306
```
立ち上げる各コンテナとその設定を定義しています。
WEBコンテナはPHP8.0の導入など、色々やりたいので、個別でDockerFileを作成します。

### WEB系コンテナの作成①Docker File編

WEB系のDockerコンテナを立ち上げるためのDocker Fileを作成します。

```
mkdir web_php8; cd web_php8
vim Dockerfile
```
下記を```Dockerfile```に記述してください

```Dockerfile
FROM centos:centos7

# timezone
RUN rm -f /etc/localtime \
    && cp -p /usr/share/zoneinfo/Japan /etc/localtime

# php8.0
    RUN yum -y update \
    && yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \
    && yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm \
    && yum -y install yum-utils \
    && yum-config-manager --disable 'remi-php*' && yum-config-manager --enable remi-php80 \
    && yum remove php* \
    && yum -y install php php-{cli,fpm,mysqlnd,zip,devel,gd,mbstring,curl,xml,pear,bcmath,json} \
    && php --version

# apache
RUN yum install -y httpd httpd-devel \
    && rm -rf /var/cache/yum/* \
    && yum clean all \
    && mkdir -p /app/ENV /AccessLog.local
COPY ./setup/httpd/app.conf /etc/httpd/conf.d/app.conf

# composer
RUN cd /tmp && curl -sS https://getcomposer.org/installer | php \
	&& mv ./composer.phar /usr/bin/composer

CMD ["httpd", "-D", "FOREGROUND"]
```
WEB系コンテナに必要なツール類や設定はここで定義しています。

### WEB系コンテナの作成②関連ファイル編

WEB系コンテナ内にて摘要する各ファイルを作成しておきます

まずは、コンテナ内に適用するbashrcを作成します

```
mkdir setup; cd setup
vim .bashrc
```
中身は自由ですので、皆さんのお好きな設定を記述ください。
(マウントしちゃってもいいと思います)

次にApache confファイルを作成しておきます

```
mkdir httpd; cd httpd
vim app.conf
```

```app.conf``` に下記を記述してください

```app.conf
<VirtualHost *:80>
  ServerName localhost
  DocumentRoot /var/www/{laravelアプリ(命名は自由)}/public
  ErrorLog  "/dev/stdout"
  CustomLog "/dev/stdout" combined

  <Directory /var/www/{laravelアプリ(命名は自由)}/public>
    AllowOverride All
    Options Includes FollowSymLinks
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>

```


### Laravelアプリケーション_①アプリのclone
実際に稼働するLaravelアプリを作っていきましょう。

ディレクトリを移動して、laravelをgit cloneします。
ここではWEBアプリは```repository```ディレクトリ配下で管理するようにしています。

```
cd ../../../
mkdir repository; cd repository
git clone -b 6.x https://github.com/laravel/laravel.git {適当なアプリ名}
```

### 環境の立ち上げ
下記にてdocker-composeを実行。

cd で移動しまくってて、わかりにくく申し訳ないですが
docker-compose.yamlと同階層で実行すればOKです。

```
cd ../
docker-compose up
```
各環境が立ち上がり、各コンテナのログが流れ始めたことを確認します。


### Laravelアプリケーション_②初期設定
laravelをcloneした後に実行するお作法です。
権限とcomposer、そしてenv周り

```
cd repository/{laravelアプリ(命名は自由)}
chmod -R 777 storage
chmod -R 777 bootstrap/cache
docker-compose exec web_php8 /bin/bash -c “composer install”
cp -p .env.example .env
php artisan key:generate
```

この時点で http://localhost:/ にアクセスし、Laravelのテストページが表示されていたら、構築成功です。

### Laravelアプリケーション_③DB周り初期設定
.envに本環境のDB設定を記述しましょう

```
sed  -e 's/DB_HOST=127.0.0.1/DB_HOST=db/' .env
sed  -e 's/DB_DATABASE=laravel/DB_DATABASE=test_db/' .env
sed  -e 's/DB_USERNAME=root/DB_USERNAME=test_user/' .env
sed  -e 's/DB_PASSWORD=/DB_PASSWORD=test_pass/' .env
```

接続テスト兼、DBマイグレーション
下記にてmigrateを実行をし、デフォルトのテーブル郡が作成できれば成功です。

```
docker-compose exec web_php8 /bin/bash -c “cd /app/operation-cms && php artisan migrate
```

方法は何でもいいですが一例として。
下記にてphpMyAdminからDB内を確認できます。
http://localhost:89/