Windows10 に PHP7+Laravel環境をDockerで構築

# 概要

掲題のとおり「Windows10 に PHP7+Laravel環境をDockerで構築」を、
↓こちらの神記事を参考に、初心者向けに解説していきます。
> [最強のLaravel開発環境をDockerを使って構築する【新編集版】](https://qiita.com/ucan-lab/items/5fc1281cd8076c8ac9f4)

「どうしてそういう設定を施すのか？」といったことは元記事が丁寧に説明して下さっているので、ここではとにかくローカルPC内にLaravelサーバを立ち上げるまでの手続きを駆け足でご紹介すると共に、Windows10でやると行きづまる所を補足しています。

# 私が試した環境

* Windows10 Pro 64bit版
* Docker Desktop for Windows - 2.3.0.2 （今回の手順中でインストールします）
* Git for Windows - 2.25.0.windows.1 （今回の手順中でインストールします）
* Make for Windows - 3.81 （今回の手順中でインストールします）

# 下準備編

いくつかのソフトウェアが必要なので、ダウンロード＆インストールしましょう。

## Docker, docker-compose（Docker Desktop for Windows）

↓こちらをご参考に。
> [Windows 10 に Docker Desktop for Windows をインストールする](https://qiita.com/yagrush/items/fbb7d23d1d4f73eb27a1)  

※ ↑の記事内に記載していますが、Windows10のエディションやパソコンのCPUによる条件がありますので、ご注意下さい。

## Git, Git-Bash（Git for Windows）

↓こちらからダウンロードしてインストールしましょう。
https://gitforwindows.org/

Git for Windows を入れれば Git-Bash も一緒に入ります。

Git-Bash があれば、WindowsでもLinuxやMacと同じ作法のコマンド操作ができます。
（※完全に同じことができるわけではありません！一部だけです。）
今回はコマンド作業が必要なので、これを使います。


## make for Windows

元記事では`make`コマンドを使用されているので必要です。
（複雑なコマンドをショートカットのようにまとめるのに使用されています。）

↓こちらからダウンロードしてインストールしましょう。
http://gnuwin32.sourceforge.net/packages/make.htm

## makeコマンドがあるフォルダを環境変数`PATH`に追加しておく。

どこからでも`make`コマンドを打てるようにしておきましょう。
手順は割愛しますが、代わりに↓こちらの記事を紹介させていただきます。
> [Windows で環境変数 PATH をいじる方法のまとめ](https://qiita.com/sta/items/6d29da0dc7069ffaae60)

makeコマンドがあるフォルダの場所は、デフォルトのインストール設定では↓です。

```
C:\Program Files (x86)\GnuWin32\bin
```

make for Windows をインストールするときにインストール先フォルダをカスタマイズした場合は、↑を参考に探してみてください。

## 一部コマンドをwinpty経由で実行するよう設定する。

Gitインストール時、オプション`Use MinTTY`をONにした場合、この設定作業が必要です。

1. Windowsにログオンしているユーザーのホームフォルダ(例: `C:\Users\山田太郎`)の中に`.bashrc`という名前のテキストファイルを作ります。（すでに存在する場合は不要です。）
2. `.bashrc`の中身に↓を追記して保存します。

```shell
alias docker='winpty docker'
alias docker-compose='winpty docker-compose'
alias make='winpty make'
```

Git-Bashに慣れている方は、vimコマンドなどで作業してももちろんOKです！

※ winptyは、Windowsへのコマンド指示をLinuxっぽいインターフェースでできるようにするラッパー的なソフトです。
ここでは、`docker`、`docker-compose`、`make`コマンドだけ、自動的にwinpty経由で実行するよう設定をしています。
これをしないと、dockerコンテナの中に入って作業する系のコマンドが↓のようなエラーで失敗します。

```
$ docker-compose exec app composer create-project --prefer-dist laravel/laravel .
the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'
```

また`make`の中で実行されるコマンドもwinpty経由で実行させるには`make`自体をwinpty経由で実行しなければダメなので、3行目でそのように設定しています。

# 構築編

こちらは駆け足でザッと参ります。
一通り完了したら、ぜひ元記事も読んでみてください。

## Git-Bashを起動する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553715/ec6197c1-6756-adfc-6209-718e4ba8d957.png)

## 適当なフォルダを作って移動する。

ソースコードをダウンロードして色々やるので、万が一汚れても大丈夫なフォルダを作ってそこで作業しましょう。
ここでは例として、Cドライブ直下にtempというフォルダを作ってそこに移動してます。

```sh
cd /c
mkdir temp
cd temp
```

## 元記事で公開されているソースコード一式をダウンロードする。

githubに公開されているので、gitコマンドを使ってダウンロードします。
このコマンドなら、githubアカウントを持ってなくてもダウンロードできるはず…

```sh
git clone git://github.com/ucan-lab/docker-laravel.git
```

余談ですが、セキュリティ的には https:// で始まるURLで`git clone`するのが推奨されているので、githubアカウントをお持ちであれば↓こちらのコマンドでもOKです。

```sh
git clone https://github.com/ucan-lab/docker-laravel.git
```

## `make`コマンド向け設定ファイルが存在するフォルダに移動する。

```sh
cd docker-laravel/infrastructure
```

## LaravelサンプルWEBサイトを新規作成するコマンドを実行する。

```sh
make create-project
```

数分かかるかも。
ずらーっと流れるログが↓のようになって止まったらOK。

```sh
・
・
・
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
32 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

XXXXXX@XXXXX MINGW64 /c/temp/docker-laravel/infrastructure
$
```

## LaravelサンプルWEBサイトにアクセスしてみる。

↓をWEBブラウザで開いてみてください。
http://127.0.0.1

↓こういうWEBページが表示されたら、成功！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553715/f95e470a-334e-1932-bcfe-e9236b094df9.png)

これはLaravelフレームワークを使って作られているサンプルWEBページで、それを動かすためのWEBサーバが自分のPC内で起動している証です。

# お疲れ様でした。

:thumbsup::thumbsup::thumbsup:

この記事では端折った部分もあるので、ぜひ元記事も一読してみてください。
> [最強のLaravel開発環境をDockerを使って構築する【新編集版】](https://qiita.com/ucan-lab/items/5fc1281cd8076c8ac9f4)