DockerでLaravel(Apache+php-fpm+mysql)を構築する手順書

mac + DockerでLaravel環境を作る為の手順書です

以下の環境を作成致します

- CentOS  7
- Apache  2.4
- php     5.6
- MySQL   5.5
- Laravel

またDockerなどはインストールされているものとします

最終的なディレクトリ

```
project_name
  ├── laradock
  │     ├─ apahce2
  │     │    └─ Dockerfileなど
  │     ├─ mysql
  │     │    └─ Dockerfileなど
  │     ├─ php-fpm
  │     │    └─ Dockerfileなど
  │     ├─ workspace
  │     │    └─ Dockerfileなど
  │     ├─ .laradock
  │     │    └─ data
  │     │
  │     ├── docker-compose.yml
  │     └── .env
  │
  └── laravel-app
       └── laravelのアプリを配置
```

## Dockerの必要な設定をする

### laradockをクローンをし.envを作成する

ついでにのちに必要になる`.laradock/data`も作成しておく

```
$ git clone https://github.com/laradock/laradock.git
$ cd laradock
$ cp env-example .env
$ mkdir -p　.laradock/data
```

### envファイルをいじる

`$ vim .env`

```diff:.env
# laradock内に作りたい為(13行目)
- DATA_SAVE_PATH=~/.laradock/data
+ DATA_SAVE_PATH=.laradock/data

# workspaceとはバージョンを別にしたい為(20行目)
+ PHP_FPM_VERSION=56

# ポートの重複を避ける為(84,85行目)
- APACHE_HOST_HTTP_PORT=80
- APACHE_HOST_HTTPS_PORT=443
+ APACHE_HOST_HTTP_PORT=8888
+ APACHE_HOST_HTTPS_PORT=8443
```

### mysqlの設定

`$ vim mysql/Dockerfile`

```diff:Dockerfile
# 1行目
- FROM mysql:8.0
+ FROM mysql:5.5
```

### apacheの設定

`$ vim apache2/Dockerfile`

```diff:Dockerfile
# 1行目
-　FROM webdevops/apache:ubuntu-16.04
+　FROM webdevops/apache:centos-7
```

### docker-compose.ymlの設定

`$ vim docker-compose.yml`

```diff:docker-compose.yml
# php-fpmの設定(78,82行目)
- dockerfile: "Dockerfile-${PHP_VERSION}"
+ dockerfile: "Dockerfile-${PHP_FPM_VERSION}"

- ./php-fpm/php${PHP_VERSION}.ini:/usr/local/etc/php/php.ini
+ ./php-fpm/php${PHP_FPM_VERSION}.ini:/usr/local/etc/php/php.ini
```

## composeする

- workspace
- php-fpm
- apache
- mysql

の４つを立ち上げます

```
$ docker-compose up -d workspace mysql php-fpm apache2
```

結構時間がかかるのでコーヒーを飲んで待ちましょう。

## laravelアプリの作成と設定の変更

### workpsaceのコンテナ内へ入る

```
$ docker-compose ps "workspace"
          Name                Command      State          Ports
-----------------------------------------------------------------------
laradock_workspace_1   /sbin/my_init   Up      0.0.0.0:2222->22/tcp

$ docker exec -it laradock_workspace_1 bash
```

### コンテナ内でlaravel-appを作成する

```
root@{コンテナID}:/var/www#　
長いので省略
# composer create-project --prefer-dist laravel/laravel project_name
```

ここでも時間がかかるので待ちましょう
終わったら`# exit`してコンテナから出ましょう

### docker-compose.ymlの設定の変更

```diff:docker-compose.yml
- ${APPLICATION}:/var/www
+ ${APPLICATION}project_name:/var/www
```

この状態で
http://localhost:8888
へアクセスしても繋がりません。

なぜ繋がらないのかログを見ましょう

```
$ docker logs -f laradocktuna_apache2_1

-> Executing /opt/docker/bin/service.d/httpd.d//10-init.sh
2017-07-09 06:43:10,580 INFO success: apached entered RUNNING state, process has stayed up for > than 0 seconds (startsecs)
AH00526: Syntax error on line 119 of /etc/httpd/conf/httpd.conf:
DocumentRoot '/var/www/html' is not a directory, or is not readable
2017-07-09 06:43:10,629 INFO exited: apached (exit status 1; not expected)
```

永遠にログが出続けていますね…。✌︎('ω'✌︎ )

注目すべきは

```
DocumentRoot
'/var/www/html' is not a directory

(/var/www/htmlのディレクトリが見つからないよ！)
```

なので

apacheコンテナに入ってDocumentRootを設定してあげましょう

### apacheコンテナに入る

```
$ docker-compose ps "apache2"
         Name                       Command               State                      Ports
-------------------------------------------------------------------------------------------------------------
laradocktuna_apache2_1   /opt/docker/bin/entrypoint ...   Up      0.0.0.0:8443->443/tcp, 0.0.0.0:8888->80/tcp

$ docker exec -it laradock_apache2_1 bash
```

### httpd.confの設定を変更する

```
[root@{コンテナID} public]#
長いので省略
# vi /etc/httpd/conf/httpd.conf
```
```diff:httpd.conf
# DocumentRootを変更する(119行目)
- DocumentRoot "/var/www/html"
+ DocumentRoot "/var/www/public"
```

httpdサービスをリロードする
`# service httpd restart`
終わったら`# exit`して構いません

http://localhost:8888
へアクセスしてみると…。

<img width="726" alt="スクリーンショット 2017-07-09 15.52.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/177207/9a5d60e0-e4ff-702f-d6bd-7e24d3428ded.png">


## 最後に

DocumentRootの設定をわざわざコンテナに入らずにやる方法もあります。

事前にhttpd.confを用意しておいて
DockerfileでCOPY文を書く事です。

その他Dockerfile等で済ませられる方法があれば
コメントよろしくお願いします。

またこちらに最小化したものを置いておきます
https://github.com/tunagohan/laradock