DockerにLaravel環境を構築する

Docker/Laravel環境構築の備忘録です。

ゴールは、Docker上でLaravelが動くまでです。Macで実施します。

##フォルダ構成/ファイルについて
今回は、以下のディレクトリ構成としました。

```text:tree
project
├── docker
│   ├── db
│   │   ├── Dockerfile               ①
│   │   ├── conf.d
│   │   │   └── my.cnf               ②
│   │   ├── data                     ③
│   │   └── initdb.d                 ④
│   ├── docker-compose.yml           ⑤
│   └── web
│       ├── Dockerfile               ⑥
│       ├── conf.d
│       │   └── 000-default.conf     ⑦
│       └── ini
│           └── php.ini              ⑧
└── laravel                          ⑨
```

順番に説明します。

###① project/docker/db/Dockerfile

Dockerコンテナの構成内容を記述します。
ここでは、Dockerイメージとして、MySQLを指定しています。

```Dockerfile:project/docker/db/Dockerfile
FROM mysql:5.7
```

###② project/docker/db/conf.d/my.cnf

MySQLの設定ファイルです。
⑤にて、/etc/mysql/conf.d にマウントします。

```project/docker/db/conf.d/my.cnf
[mysqld]
character-set-server=utf8mb4
explicit-defaults-for-timestamp=1

[client]
default-character-set=utf8mb4
```

###③ project/docker/db/data

ディレクトリです。
⑤にて、/var/lib/mysql にマウントします。
/var/lib/mysql は、MySQLのデータディレクトリとなります。
（Dockerを停止しても消えないように）

###④ project/docker/db/initdb.d

こちらもディレクトリです。
⑤にて、/docker-entrypoint-initdb.d にマウントします。
現状、何も置いておりませんが、/docker-entrypoint-initdb.d にSQLやスクリプトを置くことで、初期データを設定可能です。
（そのうち使うかもということで用意しています）

###⑤ project/docker/docker-compose.yml

Dockerコンテナの起動オプションを記述するファイルです。


```project/docker/docker-compose.yml
services:

  web:
    build: ./web/
    volumes:
      - ./web/ini/php.ini:/usr/local/etc/php/php.ini
      - ./web/conf.d/000-default.conf:/etc/apache2/sites-available/000-default.conf
      - ../laravel:/var/www/laravel
    ports:
      - 80:80

  db:
    build: ./db/
    environment:
      MYSQL_DATABASE: laravel_db
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: rootpassword
    volumes:
      - ./db/initdb.d:/docker-entrypoint-initdb.d
      - ./db/conf.d:/etc/mysql/conf.d
      - ./db/data:/var/lib/mysql
    ports:
      - "3306:3306"
```

以下、簡単ですが説明です。

- build：Dockerfileのあるディレクトリパスの指定
- environment：環境変数の指定（ここでは、MySQLに必要なものを定義）
- volumes:マウントの指定（ホスト:コンテナ）
- ports：ポートの指定（ホスト:コンテナ）

###⑥ project/docker/web/Dockerfile

①と同様、Dockerコンテナの構成内容を記述します。
ここでは、Dockerイメージとして、PHPを指定しています。
また、RUNで必要なモジュールを追加しています。

```Dockerfile:project/docker/web/Dockerfile
FROM php:7.3-apache

RUN set -x && \
  pecl install xdebug && \
  docker-php-ext-enable xdebug && \
  a2enmod rewrite && \
  docker-php-ext-install pdo_mysql
```

- xdebug：PHPStormでリモートデバッグしたかったので追加
- rewrite：laravelの認証機能を追加した時、上手く動かなかったので追加

###⑦ project/docker/web/conf.d/000-default.conf

Apacheの設定ファイルです。
⑤にて、/etc/apache2/sites-available/000-default.conf にマウントします。
Laravelの公開フォルダは、public のため、DocumentRoot を /var/www/laravel/public としています。
（laravelは、⑤で /var/www/laravel にマウントしています）

```project/docker/web/conf.d/000-default.conf
<VirtualHost *:80>
	ServerAdmin webmaster@localhost
	DocumentRoot /var/www/laravel/public
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
```

###⑧ project/docker/web/ini/php.ini

PHPの設定ファイルです。
⑤にて、/usr/local/etc/php/php.ini にマウントします。
ここでは、xdebugの設定を行なっています。

```project/docker/web/ini/php.ini
; xdebug
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20180731/xdebug.so
xdebug.remote_enable = On
xdebug.remote_autostart = On
xdebug.remote_connect_back = Off
xdebug.remote_host = docker.for.mac.localhost
```

###⑨ project/laravel

project直下で、以下のコマンドを投入すると、laravelディレクトリが作成されます。
中には、プロジェクト一式揃っています。

```
$ composer create-project laravel/laravel --prefer-dist
```

　※ composerの導入は割愛します。


##Dockerの起動

project/docker配下で実施します。まずは、buildから。

```
$ docker-compose build
Building web
Step 1/2 : FROM php:7.3-apache
 ---> 59d2cf691156
Step 2/2 : RUN set -x &&   pecl install xdebug &&   docker-php-ext-enable xdebug &&   a2enmod rewrite &&   docker-php-ext-install pdo_mysql
 ---> Using cache
 ---> bc81175279b3
Successfully built bc81175279b3
Successfully tagged docker_web:latest
Building db
Step 1/2 : FROM mysql:5.7
 ---> 7452c4ea4f17
Step 2/2 : RUN touch /var/log/mysql/mysqld.log
 ---> Using cache
 ---> 3c43b21359e9
Successfully built 3c43b21359e9
Successfully tagged docker_db:latest
```

次に起動します。

```
$ docker-compose up -d
Creating docker_db_1  ... done
Creating docker_web_1 ... done
```

念の為、起動していることを確認します。

```
$ docker-compose ps
    Name                  Command               State                 Ports
-----------------------------------------------------------------------------------------
docker_db_1    docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp, 33060/tcp
docker_web_1   docker-php-entrypoint apac ...   Up      0.0.0.0:80->80/tcp
```

ブラウザから
http://localhost
にアクセスすると、laravelの画面が表示されます。

##最後に

ここでは書いていないですが、この環境にLaravelの認証機能を追加してみたところ、ユーザ追加が出来ました。
MySQLにも追加したユーザのデータがありましたので、DBアクセスも問題なさそうです。