Docker-composeでLaravel5の簡単環境構築の方法（apache編）

Laravel5環境をDockerを使って構築する方法。

#ディレクトリ構成

```
├── Docker/
│   　├── App/
│  　 │    ├ 000-default.conf　#apacheの設定ファイル  
│  　 │    ├ Dockerfile
│  　 │    └ php.ini 
│  　 └── DB/
│  　      ├ my.cnf  
│   　     └ volume/ #データの保存場所
│
├── src/ #実際のlaravelが入る場所
└── docker-compose.yml
```

#各ファイル
##000-default.conf

```000-default.conf
<VirtualHost *:80>
       ServerAdmin laravel@localhost
       DocumentRoot /var/www/html/laravelapp/public
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
       <Directory /var/www/html/laravelapp/public>
           AllowOverride All
       </Directory>
</VirtualHost>
```

DocumentRootとDirectoryは
`/var/www/html/laravelapp/public`となっているが、
自分が決めたlaravelのアプリ名によって変更する必要がある。
（例）composer create-project laravel/laravel --prefer-dist blog
としたら、
`/var/www/html/blog/public`
と変更する必要がある。

##Dockerfile

```Dockerfile
FROM php:7.4-apache

ADD php.ini /usr/local/etc/php/
ADD 000-default.conf /etc/apache2/sites-enabled/

RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer

RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim \
libpng-dev \
libpq-dev \
&& docker-php-ext-install pdo_mysql

RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite

RUN docker-php-ext-install sockets
```

##php.ini

```php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
default_charset = "UTF-8"
mbstring.language = "Japanese"
extension=sockets
```

##my.cnf

```my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set=utf8mb4
```

##docker-compose.yml

```docker-compose.yml
# docker-composeで使用するバージョンを定義しています。
version: '3'
# アプリケーションを動かすための各要素のこと。servicesの中に、app、db、phpmyadminが子要素として設定されています。
services:
 # laravelを動かすコンテナがここから下に記載されています。
 app:
   #コンテナの名前をここで決めます。
   container_name: laravel_app
   # どのポートを繋ぐかという設定です。ホストの8080番ポートとコンテナの８０番をつないでいる。80番ポートのバーチャルホストは000-default.confにて設定済みです。
   ports:
     - "8000:80"
   # Dockerfileの設定の場所を指定しています。Dockerfileの内容に基づいてビルドします。
   build: ./Docker/App
   # コンテナとホスト側のディレクトリを同期する場所をここで指定しています。ここにlaravelのソースが入ります。
   volumes:
     - ./src:/var/www/html
 # MySQLを動かすコンテナがここから設定されています。
 db:
   #Docker HubからMySQL5.7の公式イメージを引っ張ってくる設定です。
   image: mysql:5.7
   # コンテナ名を指定しています。
   container_name: laravel_db
   # MySQLのコンテナ内の環境変数を指定しています。任意のものを設定してください。
   environment:
     MYSQL_ROOT_PASSWORD: root
     MYSQL_DATABASE: laraveldb
     MYSQL_USER: dbuser
     MYSQL_PASSWORD: dbpass
     TZ: 'Asia/Tokyo'
   # 起動時のコマンドになります。
   command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
   # ディレクトリの同期をしています。ここを書かないとコンテナを閉じたときにデータベースからデータがなくなるので注意してください。詳しくはdocker 永続化などと調べると良いかもです。
   volumes:
     - ./Docker/DB/volume:/var/lib/mysql
     - ./Docker/DB/my.cnf:/etc/mysql/conf.d/my.cnf
   # ホストの13306番ポートとコンテナのなかの3306番ポートとつなげる設定です。
   ports:
     - 13306:3306
 # phpmyadminの設定が書きに記載します。
 phpmyadmin:
   #コンテナ名を決めています。
   container_name: phpmyadmin
   #DockerHubからphpmyadminのイメージを引っ張ってくる設定です。
   image: phpmyadmin/phpmyadmin
   #phpmyadminの環境変数の設定です。MySQLの設定を参照して記載してください。PMA_HOSTSにはservicesのdbを指定しています。
   environment:
    - PMA_ARBITRARY=1
    - PMA_HOSTS=db
    - PMA_USER=root
    - PMA_PASSWORD=root
   ports:
    - 3000:80
```

#手順
##1.コンテナを立ち上げる

```
docker-compose up -d
```

##2.Laravelを導入する
###1.サーバーの中に入る

```
docker exec -it laravel_app bash
```

サーバーの中の`var/www/html`にいることを確認する

###2.Laravelのインストール

```
composer create-project "laravel/laravel=~5.0" --prefer-dist laravelapp(任意の名前）
```

今回は、npmを入れるのが面倒なのでバージョン５系を指定しています。
インストールが完了したら、
`localhost:8000`をアクセスして確認する

##3.Laravelの設定
###.envの編集

```scr/laravleapp/.env
DB_CONNECTION=mysql
DB_HOST=laravel_db　#docker-composeのmysqlのコンテナ名を指定
DB_PORT=3306
DB_DATABASE=laraveldb　#docker-compose.ymlのmysqlで指定したデータベース名
DB_USERNAME=dbuser　#docker-composeのmysql.ymlで指定したユーザ名名
DB_PASSWORD=dbpass　#docker-composeのmysql.ymlで指定したパスワード名
```

##4.マイグレーションを実行(今しなくてもいい）
サーバーの中に入った状態で、`cd laravelapp`コマンドでアプリ内に入って、

```:var/www/html/laravelapp
php artisan migrate
```

マイグレーションを成功したら、OK。

####phpmyadminは`localhost:3000`でアクセスできる

##5.権限を変更する
laravel_appコンテナ内に入って、/var/www/html/larvelappに移動する。（laravelプロジェクト内に入る）
そして、次のコマンドを実行する

```:var/www/html/laravelapp
chmod -R 777 storage
chmod -R 777 bootstrap/cache
```

##6.AppServiceProvider.phpの編集 （文字コードのエラーを防ぐ）
エディタで、`src/laravelapp/app/Providers/AppServiceProvider.php`を開いて、

```php:AppServiceProvider.php
use Illuminate\Support\Facades\Schema;
```

を追加して、さらに、

```php:AppServiceProvider.phpのboot関数
public function boot()
    {
        //
        Schema::defaultStringLength(191);
    }
```

boot関数の中身に一行を加える。

##7. config/app.phpの編集　（基本設定）
以下の二箇所を編集

```php:config/app.php
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
```