【Windows10 Home】dockerで PHP + Apache + MySQL + phpMyAdmin + Laravel を構築し、GitHubに上げるまで

#20201107追記
現在はWLS2を利用して簡単にdockerを利用することができますが、過去の遺産としてこの記事は残しておきます。

#Windows10 Homeでも流行りのDockerを使いたい！
※Dockerが流行っているかは私個人の感想です
※駆け出しエンジニアの為、間違えている箇所があるかもしれません（ご指摘いただけますと嬉しいです。）
※構築の手順だけ知りたい?そんな冷たいこと言わないでください

私のPCの環境
- Windows10 Home　64ビット(ノートPC)
- メモリ12GB

##はじめに
Dockerという存在を知ったのは5月の事で、それまではローカル環境でPHP開発をしようと思うとXamppに頼ってました
ぶっちゃけXampp使っていても全然よかったのですが、なんか世間ではDockerというものが流行っているらしいというのを見聞きしてちょっくら勉強してみようかなと思った次第です
あと、Laravelも今後使っていきたかったので、そのための準備としてもうってつけかなと思って

#調べていった（作業していった）順序
- Dockerとは何ぞや&何ができるんだろう?
- じゃぁDockerでPHPの環境ってどうやって作るんだろー
- なんかできそうだしやってみるかー　→　手順調べる
- PHP環境構築できたからLaravel入れてみるか
- 最後にGitHubにpushして終了！

##Dockerとは何ぞや&何ができんの?
[外部サイトですがこちら](https://knowledge.sakura.ad.jp/13265/)を見て
『ほーん仮想環境**みたいな**の作って色々開発環境作れるのか』※実際は違うみたいなのですが詳しいことは自分で調べてください
『ローカルに直接構築するわけじゃないから、不要なデータは楽に削除することもできるのか』
くらいの感覚です（今もそんな感覚）

##じゃぁDockerでPHPの環境ってどうやって作るんだろー
Qiitaで調べると手順がいっぱい出てきます

- ymlというのを使って設定をしていくのか
- Dockerfileっていうのがあって、そこで色々設定ができるのか

といった感じで、「なんかできそうだな」と思えてきました

##なんかできそうだしやってみるかー
###Dockerの導入
一般的であれば
**Windows proでCPUの仮想化を有効にしてHyoer-Vも有効にする**
といったものなのですが、そもそも私のパソコンはWindows Homeです
なんだアップグレードしないとできないのかーと思ったのですが、[こちら](https://qiita.com/idani/items/fb7681d79eeb48c05144)を参考にやってみることにしました
めっちゃ参考になりました。
ちなみに私の場合「Docker Quickstart Terminal」の起動には結構時間がかかります（長い時は5分くらい）

###[PHP,MySQL,phpMyAdmin]の構築
1. ここでは以下のディレクトリ構成を目指します
> work/
 　├ html/
 　│　└ index.php
 　├ mysql/
 　├ php/
 　│　└ php.ini
 　└ docker-compose.yml

2. 初めに
[こちら](https://qiita.com/naente_dev/items/d259ea84c172deeff7d8)を参考にやってみました
**ここで重要な事!!**
windows HomeでDockerを使う場合、マウントできるディレクトリは限られてきます
マウントするディレクトリはuser配下に作ってください!!（適当にディレクトリを作ってマウントできない原因がわからず2日潰れました）
別途設定すれば問題ないそうなのですが、それはここでは取り扱いません
私は(ここで解決しました)[https://qiita.com/kikako/items/7b6301a140cf37a5b7ac]
【例】
C:\Users\あなたのPCのユーザー名\work
workというディレクトリを作成しました

3. docker-composeのカスタマイズ
カスタマイズをするためにこのようなディレクトリ構成に変更しました

```docker-compose.yml
version: '3'

services:
  php:
    image: php:7.2-apache
    volumes:
      - ./php/php.ini:/usr/local/etc/php/php.ini
      - ./html:/var/www/html
    ports:
      - 32778:80
  mysql:
    image: mysql:5.7
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test
      MYSQL_USER: test
      MYSQL_PASSWORD: test
    command: --innodb-use-native-aio=0
    ports:
      - "32780:3306"
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_ARBITRARY: 1
      PMA_HOST: mysql
      PMA_USER: test
      PMA_PASSWORD: test
    restart: always
    links:
      - mysql:mysql
    ports:
      - '32779:80'
```
こんな感じに設定をして、htmlディレクトリ配下にphpinfo()を記述したindex.phpを置いて、[http://192.168.99.100:32778](http://192.168.99.100:32778)にアクセス
表示されなかったらどこか設定が悪いので色々調べる

##PHP環境構築できたからLaravel入れてみるか
よっしゃ構築できたーということで今度はLaravelを入れてみる
1. ここでは以下のディレクトリ構成を目指します

> work/
 　├ html/
 　│　└ my-laravel-app/
 　│　　　└ いろいろなファイル
 　│　　　└ public
 　├ mysql/
 　├ php/
 　│　└ php.ini
 　└ docker-compose.yml

2.　コンテナからcomposerを使えるようにする
ymlファイルの一部を変更する必要があるのでphpの記述している箇所を以下に変更してみた

```docker-compose.yml
  app:
    build:
      context: ./dockerfile
      dockerfile: Dockerfile
    volumes:
      - ./php/php.ini:/usr/local/etc/php/php.ini
      - ./html:/var/www/html
    ports:
      - 32778:80
```
あと、これに伴ってcomposerを使う必要があるのでdockerfileディレクトリ配下に以下を記述

```dockerfile
FROM php:7.2-apache
RUN apt-get update -y
RUN curl -sS https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_NO_INTERACTION 1
```
- COMPOSER_ALLOW_SUPERUSER 1
　これはDocker内でcomposerを使う時にsuper userで使用することを許可するコマンド
- COMPOSER_NO_INTERACTION 1
　これはDocker内でcomposerを使う時にいちいち質問されないように設定するコマンド

[こちら](https://qiita.com/nju33/items/fc85dc8071c99015bc92)を参考にしました。

3.Laravelを置きたいディレクトリに移動
`cd C:\Users\あなたのPCのユーザー名\work`

4.コマンド実施
    　　1. コンテナ内に入る
　　　　　`docker-compose exec app /bin/bash`または`docker-compose exec app /bin/sh`
    　　2. Laravelをインストール!(結構時間かかると思います)
  　　　　[外部サイトですがこちら](https://windii.jp/backend/laravel/laravel-with-docker-compose)を参考にして行いました
　　　`composer create-project --prefer-dist laravel/laravel my-laravel-app`

5.ドキュメントルートの変更
　ドキュメントルートを変更する必要があるので、以下を行います
　ちなみに[こちら](https://qiita.com/bluesDD/items/3cf77298ece0c83e9968)を参考にしました
　参考にしたページではコンソール上で書き換えているみたいなのですが、それができなかったのでいったんホストに移動させてサクラエディタで書き換えた後に上書きをしています
    　　1. `cp /etc/apache2/apache2.conf /var/www/html`
    　　2. `cp /etc/apache2/sites-available/000-default.conf /var/www/html`
    　　3. apache2.confと000-default.confを変更

```apache2.conf
170 <Directory /var/www"ここから"/html/public"ここまで追加">
171         Options Indexes FollowSymLinks
172         AllowOverride All
173         Require all granted
174 </Directory>
```
```000-default.conf
 10 
 11         ServerAdmin webmaster@localhost
 12         DocumentRoot /var/www"ここから"/html/public"ここまで追加"
 13 
```

　　4. `cp /var/www/html /etc/apache2/apache2.conf`
　　5. `cp /var/www/html　/etc/apache2/sites-available/000-default.conf`

6.dockerのマウントする場所を変更
このままだと[http://192.168.99.100:32778](http://192.168.99.100:32778)でうまく表示されないので、docker-composeを変更する

```docker-compose.yml
  app:
    build:
      context: ./dockerfile
      dockerfile: Dockerfile
    volumes:
      - ./php/php.ini:/usr/local/etc/php/php.ini
      - ./html/my-laravel-app:/var/www/html
    ports:
      - 32778:80
```

7.コンテナの再ビルド
    　　1. `exit` <- まずはコンテナから出ます
    　　2. `docker-compose stop`
    　　3. `docker-compose rm`
    　　4. `docker-compose up -d --build`

8.http://192.168.99.100:32778にアクセス!!!!!
表示されたー！ひゃｈｈｈっほおおーい
となります

###最後にGitHubにpushして終了！
最後にGitHubにpushします([外部サイトですがこちら](https://tweeeety.hateblo.jp/entry/2016/02/10/000712)を参考にしました）
1. アカウントを作成（[こちら](https://github.co.jp/)からできます）
2. レポジトリを作る
3. gitのインストール([こちら](https://qiita.com/toshi-click/items/dcf3dd48fdc74c91b409)を参考にやってみると笑顔になれます)
4. コンソールでlaravelが置いてあるところに移動します
(例)`cd C:\Users\あなたのPCのユーザー名\work\my-laravel-app`
5.コマンド色々
`git init` -> `git remote add origin git@github.com:ユーザ名/リポジトリ名.git` -> `git config --global user.name "Your Name"` -> `git config --global user.email "you@example.com"` -> `git fetch` -> `git pull origin master`
6. commitしてpushします（その前にbranch作ってもいいかもしれません）
`git commit -m '名前'` -> `git push -u origin master`

#最後に
あなたのお役に立てたら幸いです
間違った記載や誤字があればコメントいただけますと両手を上げて喜びます

#追記
https://teratail.com/questions/47368
これをしないとPOSTがうまくいかないのでやること