LaradockでPHP+Apache+mariadbな環境構築をする手順

Laradockで環境構築するとnginxがデフォルトになっている。
本番環境とミドルウェアを揃えるため、apacheを利用するのにハマったので手順を残しておきます。

# 要件

* Git
* Docker >= 17.12
* Laradock v8.0

# ディレクトリ構成

```
~/project/                 ... プロジェクトルート
~/project/laradock         ... Laradock
~/project/laravel          ... Laravel app project
~/project/laravel/public   ... 公開ディレクトリ（Document Root）
```

# Laradockのset up

プロジェクトルートへ移動

```
cd ~/project/
```

Laradockをclone

```
git clone --branch v8.0 https://github.com/laradock/laradock.git
```

Laradockへ移動

```
cd ~/project/laradock
```

.envを作成

```
cp env-example .env
```

.envを編集

```
vim .env
---
- PHP_VERSION=7.3
+ PHP_VERSION=任意のバージョン

- WORKSPACE_INSTALL_NODE=true
+ WORKSPACE_INSTALL_NODE=false

- WORKSPACE_INSTALL_YARN=false
+ WORKSPACE_INSTALL_YARN=false

- WORKSPACE_INSTALL_NPM_GULP=true
+ WORKSPACE_INSTALL_NPM_GULP=false

- WORKSPACE_INSTALL_NPM_VUE_CLI=true
+ WORKSPACE_INSTALL_NPM_VUE_CLI=false

- WORKSPACE_INSTALL_XDEBUG=false
+ WORKSPACE_INSTALL_XDEBUG=true

- PHP_FPM_INSTALL_XDEBUG=false
+ PHP_FPM_INSTALL_XDEBUG=true

+ LARAVEL_HORIZON_INSTALL_PHPREDIS=true

- MARIADB_VERSION=latest
+ MARIADB_VERSION=任意のバージョン

- MARIADB_DATABASE=default
+ MARIADB_DATABASE=任意のDB Name

- MARIADB_USER=default
+ MARIADB_USER=任意のUser Name

- MARIADB_PASSWORD=secret
+ MARIADB_PASSWORD=任意のUser Password
---
```

docker-compose.ymlを編集

```
vim docker-compose.yml
---
    laravel-horizon:
      build:
        context: ./laravel-horizon
        args:
          - PHP_VERSION=${PHP_VERSION}
          - INSTALL_PGSQL=${PHP_FPM_INSTALL_PGSQL}
          - INSTALL_BCMATH=${PHP_FPM_INSTALL_BCMATH}
          - INSTALL_MEMCACHED=${PHP_FPM_INSTALL_MEMCACHED}
          - INSTALL_SOCKETS=${LARAVEL_HORIZON_INSTALL_SOCKETS}
          - INSTALL_CASSANDRA=${PHP_FPM_INSTALL_CASSANDRA}
+         - INSTALL_PHPREDIS=${LARAVEL_HORIZON_INSTALL_PHPREDIS}
      volumes:
        - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}
        - ./laravel-horizon/supervisord.d:/etc/supervisord.d
      depends_on:
        - workspace
      extra_hosts:
        - "dockerhost:${DOCKER_HOST_IP}"
      networks:
        - backend
---
```

apacheのvirtual hostsを追加

```
cp apache2/sites/default.apache.conf apache2/sites/sample.apache.conf
```

apacheのvirtual hostsを編集

```
vim apache2/sites/sample.apache.conf
---
<VirtualHost *:80>
-  ServerName laradock.test
+  ServerName sample.test
-  DocumentRoot /var/www/
+  DocumentRoot /var/www/laravel/public/
  Options Indexes FollowSymLinks

-  <Directory "/var/www/">
+  <Directory "/var/www/laravel/public/">
    AllowOverride All
    <IfVersion < 2.4>
      Allow from all
    </IfVersion>
    <IfVersion >= 2.4>
      Require all granted
    </IfVersion>
  </Directory>

</VirtualHost>
---
```

hostsの設定

```
vim /etc/hosts
---
+ 127.0.0.1       sample.test
---
```

# laravel project のインストール

```
composer create-project --prefer-dist laravel/laravel laravel "5.8.*"
```

```
cd ~/project/laravel
```

```
vim .env
---
DB_CONNECTION=mysql
- DB_HOST=127.0.0.1
+ DB_HOST=mariadb
DB_PORT=3306
- DB_DATABASE=laravel
+ DB_DATABASE=default
- DB_USERNAME=root
+ DB_USERNAME=default
- DB_PASSWORD=
+ DB_PASSWORD=secret

- REDIS_HOST=127.0.0.1
+ REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
---
```

```
php artisan optimize:clear
php artisan key:generate

composer install

chmod 777 storage/logs
chmod 777 bootstrap/cache
chmod 777 storage/framework
chmod 755 public/index.php
```

# laradock 起動


```
cd ~/project/laradock
```

docker 起動

```
docker-compose up -d workspace mariadb apache2 redis php-fpm
```

Dockerの設定ファイル（apacheなど）変更した場合

```
docker-compose up -d --build workspace mariadb apache2 redis php-fpm
or 
docker-compose build --no-cache workspace mariadb apache2 redis php-fpm
```

# Laradock(docker) 操作
dockerのworkspaceにログイン

```
docker-compose exec workspace bash
```

docker コンテナ 停止

```
docker-compose down
```

docker コンテナ 削除
```
docker-compose down --rmi all
```

docker コンテナ ボリューム削除

```
docker-compose down -v
```

# トラブルシューティング

## （１）Laradock 起動時にエラー発生

エラー内容

```
apache2_1              | AH00526: Syntax error on line 119 of /etc/httpd/conf/httpd.conf:
apache2_1              | DocumentRoot '/var/www/html' is not a directory, or is not readable
```

対処方法

```
vi /etc/httpd/conf/httpd.conf
---
- DocumentRoot "/var/www/html"
+ DocumentRoot "/var/www/laravel/public"
---

service httpd restart
```