docker-composeでお手軽Laravel環境構築(docker-toolbox php apache mysql)

## ◆行うこと
・windowsでdocker toolbox を使用して、laravelプロジェクトを動作できる環境を作成する。

docker for windowsじゃなくてtoolboxを使う理由
Hyper-Vを有効化しちゃうとVirtualBoxが使えないようになるため
[参考にさせていただいた記事]https://goodbyegangster.hatenablog.com/entry/2018/09/09/201045

## ◆dockerとは
・Dockerは、Linuxのコンテナ技術を使ったもので、Linux上で何かやりたい(サーバーのインストールなど)ときに便利
・パッケージ化して配布できる
[参考にさせていただいた記事]https://knowledge.sakura.ad.jp/13265/

## ◆docker インストール
・Virtualboxをインストールしていない場合はインストール
[参考にさせていただいた記事]https://www.virtualbox.org/

・toolboxインストール
[参考にさせていただいた記事]https://docs.docker.com/toolbox/overview/

## ◆初回起動時する
・デスクトップ上のクジラのアイコンのショートカットをクリック->初期設定が行われる
・初期設定完了後、VirtualBoxを開くとdefaultというものが実行中になっており、これがdockerで使用するOS
ちなみdocker-toolboxのコマンドプロンプトでこのコマンドを打つとOSがわかる
$ docker info | grep Operating
Operating System: Boot2Docker 18.09.3 (TCL 8.2.1)
[参考にさせていただいた記事]https://teratail.com/questions/105687

## ◆dockerのコンテナとイメージ
[参考にさせていただいた記事]https://paiza.hatenablog.com/entry/docker_intro

## ◆dockerコンテナを作成していく

```Python:構成
dockerTest ----- php
             |
             --- mysql
             |
             --- db
             |
             --- docker-compose.yml
             
sample ----- index.php
laravelProject 
```

docker-composeは、複数のコンテナ(今回だとphpやmysql)のサービスを構築・実行する手順を自動・管理できる機能
[参考にさせていただいた記事]https://qiita.com/TsutomuNakamura/items/7e90e5efb36601c5bc8a

これを利用するためにdocker-compose.ymlを作成していきます。

```Python:docker-compose.yml
version: '2'
services:
  mysql:
    build: ./mysql
    container_name: mysql57
    ports:
      - '3306:3306'
    environment:
      MYSQL_USER: dbuser 
      MYSQL_PASSWORD: dbuser
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - ./db:/var/lib/mysql
    command: --innodb-use-native-aio=0

  php:
    build: ./php
    container_name: php72
    ports:
      - '80:80'
    environment:
      - APACHE_DOCUMENT_ROOT=/var/www/public
    working_dir: /var/www/
    volumes:
      - "../sample/:/var/www/html"
    depends_on:
      - mysql
  ```    

これでdocker-compose.ymlは一応完了

[補足(ファイルの中身の解説を書いております)]
[参考にさせていただいた記事]https://qiita.com/naga3/items/d1a6e8bbd0799159042e

serviceとcontainer_nameはわかりやすければ何でもいい。
ymlファイルはインデント(行の開始位置をずらす)で管理している。
例えば、servicesの配下にmysqlとphpがservice。

buildはこのディレクトリの中のDockerFileを元にイメージをビルドする

volumesはローカル同期するもの
 - ./db:/var/lib/mysql　mysqlの場合は保存領域を設定している
[参考にさせていただいた記事]https://qiita.com/onokatio/items/fcc9f8f94f8533bb030a
 
--innodb-use-native-aio=0　　エラー防御のため
[参考にさせていただいた記事]https://webxreal.com/docker-lamp/

working_dir
はコンテナ内にログインした際のディレクトリを表している

depends_on:
      - mysql
phpがmysqlに依存していることを表す。mysqlから立ち上がるので、phpからmysqlにアクセスできるようになる
[参考にさせていただいた記事]http://www.obenri.com/_webserver/document_root.html

## ◆mysqlディレクトリの中身の作成
docker-compose.ymlのmysqlの中で、build: ./mysqlと書いたので、同階層のmysqlディレクトリの中のDockerFileが
mysqlのコンテナの構成内容として読まれます。

```Python:DockerFile
FROM mysql:5.7
COPY ./my.cnf /etc/mysql/conf.d/
```

FROMは元となるDockerイメージの指定
COPY は設定をローカルファイルのものをコピーしております。

[参考にさせていただいた記事(DockerFileの書き方について)]https://qiita.com/soushiy/items/0945bcbc7ecce4822985

[FROMでとれるイメージは公式サイトにあります]https://hub.docker.com/_/php

```Python:my.cnf
[mysqld]
character-set-server=utf8
```

文字コードだけ指定させていただきました。

## ◆phpディレクトリの中身の作成
```Python:DockerFile
FROM php:7.2.7-apache
COPY php.ini /usr/local/etc/php/

RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf

RUN apt-get update \
  && apt-get install -y libmemcached-dev libmcrypt-dev zlib1g-dev wget unzip libyaml-dev  \
  && docker-php-ext-install pdo_mysql mysqli mbstring zip
  
RUN apt-get install -y git ssh
RUN   a2enmod rewrite
```

FROM・COPYはmysqlと同じです(php-apacheを使わせていただきました。)

ドキュメントルート(アクセス時に見に行くディレクトリ)を変更するため、sedで置換してあげる
そのあと必要なものをインストールすることにした

```Python:php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
```

## ◆dbディレクトリは作成するだけ

## ◆コンテナを作成する
上の構成を参考にdockerTestと同階層にsampleを作成する。
その下にindex.phpを作成する。index.phpの中身は
<? php phpinfo(): ?>

コマンドを実行して、コンテナを作成する

```
\dockerTest>docker-compose up -d
```

作成が完了したら、

```
\dockerTest>docker-machine ip で確認してアクセスする。
```

phpの画面が出れば成功

## ◆laravelプロジェクトのpublicを指定して、アクセスする
docker-compose.ymlの中身を変える

```
php:
    build: ./php
    container_name: php72
    ports:
      - '80:80'
    environment:
      - APACHE_DOCUMENT_ROOT=/var/www/public
    working_dir: /var/www/
    volumes:
      - "../laravelProject/:/var/www/"
    depends_on:
      - mysql
```

apacheのルートをlaravelProject配下のpublicに指定してあげて、起動したときにアクセスできるようにする

```
\dockerTest>docker-compose up -d
```

作成が完了したら、

```
\dockerTest>docker-machine ip で確認してアクセスする。
```
laravel画面が出てクリア

##おまけメモ

apache設定

```:000-default.conf
<Directory /var/www/public>
    OptionsOptions Indexes DirectoryIndex FollowSymLinks MultiViews
    AllowOverride All
    Require all granted
</Directory>
```

phpのDockerFIle

```
FROM php:7.3-apache
COPY php.ini /usr/local/etc/php/
WORKDIR /var/www
ENV APACHE_DOCUMENT_ROOT /var/www/public/

RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf

RUN apt-get update 
RUN apt-get install -y libmcrypt-dev zlib1g-dev libzip-dev 
RUN docker-php-ext-install zip pdo_mysql mysqli mbstring iconv 
RUN apt-get install -y git ssh
RUN   a2enmod rewrite
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN curl -LO https://deployer.org/deployer.phar && mv deployer.phar /usr/local/bin/dep && chmod +x /usr/local/bin/dep
```