Webサービス開発1　～ローカル開発環境構築編～


# はじめに
## 今回の目的
- Webサービスを制作するにあたり、開発環境を構築したい。
- 下記[前提](https://qiita.com/drafts/b2aad8c63b606cf4004f)を使用したうえで開発する事。
- 得た知識・情報等を（すぐ忘れるので）活用できるよう、Qiitaにもれなく投稿する事。

## 前提
勉強の為、下記を使用します。
なおサービスを公開するかは未定ですが、一応そこを念頭に置いて本番環境と差分が少ないDockerで構築する事に決めました。

### ホストOS
- Windows10 home

### 実行環境
- LAMP(PHP 7.0.14-2/MySQL 5.7.25)

### 仮想マシン
- Docker  version 18.03.0-ce
- Docker-machine version 0.14.0
- Docker-compose version 1.20.1

### フレームワーク
- Laravel Framework 5.5.45

## 自身の状況
これまでにPHP・MySQLでのWebサービスの開発に1年半ほど携わった経験あり。（自社サービス・受託の兼務でした。）
今回、やっと初めて個人でWebサービス開発に取り組みます。
まだまだ不慣れなQiita投稿、諸々初めて尽くしですが頑張ります。

## 本記事のゴール
ローカル開発環境の構築。

## 作業内容
### ローカル開発環境の選定
まず[前提](https://qiita.com/drafts/b2aad8c63b606cf4004f)である程度固まっているので、これらを使用できるローカル環境を調査。
仮想化に関しては、VirtualBox + Vagrantは構築及び使用経験があった為、未開の地であったDockerを選択。

### Dockerについて参考にしたサイト
- http://docs.docker.jp
- https://qiita.com/wMETAw/items/b9bc643ded4b92bf6add
- https://knowledge.sakura.ad.jp/13265/


### memo

- Windows10 HomeでHyper-Vというネイテイブ仮想環境が無い為、Docker ToolboxインストーラでVirtual Box含め構築する。
- Docker MachineはVirtual Boxを操作するツール。
- ファイル編集に関しては共有ディレクトリにする（マウントする）事で、コンテナ側のファイルをローカル(ホスト側)のテキストエディタで編集する事が可能。共有ディレクトリの設定については、Docker環境構築工程にて。
- Dockerに色々なイメージ(ソフトウェア)を積んだコンテナが載っている。

Docker-docs-jaより

> **イメージ（image）** とは実行可能なパッケージであり、軽量で、単独で動作（stand-alone）します。パッケージにはコード、ランタイム、ライブラリ、環境変数、設定ファイルなど、ソフトウェアの実行に必要な部品すべてを含みます。

> **コンテナ（container）** とはイメージのランタイム・インスタンス（runtime instance；実行状態にあるモノ）です。言い換えれば、イメージからメモリ内に展開し、実際に実行する何かです。

#### Dockerコマンド一覧
http://docs.docker.jp/engine/reference/commandline/

#### DockerMachineサブコマンド一覧
http://docs.docker.jp/machine/reference/index.html

#### Docker-composeコマンド一覧
http://docs.docker.jp/compose/reference/overview.html

### ローカル開発環境の構築

#### 1. Dockerインストール～Docker環境にLaraDockでapache + Laravelの表示確認まで
参考にしたサイト：https://pg-happy.jp/laradoc-windows10-home-install.html

Windows10 Homeにインストールしたかったので、上記サイトを参考にしてDockerToolBoxでインストールしました。
ターミナルはDocker Quickstart Terminalを利用しています。
Docker Quickstart Terminalを起動すると自動的にVirtualBoxのマシンが起動されるが、終了時にはDocker Quickstart Terminalを閉じただけではマシンは停止しないので、以下のコマンドでマシンを終了させる。

http://devcenter.magellanic-clouds.com/learning/docker-toolbox.html より

```bash
# マシン一覧
$ docker-machine ls

# マシンの停止
$ docker-machine stop　
```

また、DockerToolBoxを使用しているので、Laradockをcloneする際もLaradock-ToolBoxをブランチしました。
Laradockをcloneしコンテナ作成後、$ docker-machine ip で確認したIPアドレスにアクセス。
下記のように、apache初期画面が表示されればOK.（参考サイトだとnginxだったので）

![docker_001.png](https://qiita-image-store.s3.amazonaws.com/0/364667/752fcf74-194a-7da7-c4e1-beffda859d48.png)

さらに、上記参考サイトではWEBサーバーとしてnginxが選択されていますが、今回apacheにしたかったのでトップページでLaravelプロジェクトのpubilc配下を表示させる設定は以下のようにしました。

```:dockerWorkspace\laradock\apache2\sites\default.apache.conf
-  DocumentRoot /var/www/
+  DocumentRoot /var/www/laraveltest/public

-  <Directory "/var/www/">
+  <Directory "/var/www/laraveltest/public">
```


```:dockerWorkspace\laradock\apache2\Dockerfile
-  ENV WEB_DOCUMENT_ROOT=/var/www/
+  ENV WEB_DOCUMENT_ROOT=/var/www/laraveltest/public
```

#### 2. MySQLの接続確認
参考にしたサイト：https://qiita.com/maejima_f/items/34cf3b8eb5ffbe256ad9

その後、文字コード確認

```bash
mysql> show variables like 'char%';
```

 すると、見事にlatin1に。。。。なので、以下を追記。

```:/laradock/mysql/my.cnf
[mysql]
default-character-set=utf8

[mysqld]
character-set-server=utf8
```

再度確認…
![docker_003.png](https://qiita-image-store.s3.amazonaws.com/0/364667/666a795c-79b2-6beb-c930-f3c893e743c0.png)

反映されてます～
やっとこ完了です:sweat_smile:

### 自分メモ2
#### docker-compose up ・ run ・ start の違いとは・・・？
[公式](http://docs.docker.jp/compose/faq.html)に答えがありましたε-(´∀｀*)ﾎｯ

>一般的には docker-compose up が使われるでしょう。 up を使うと docker-compose.yml ファイル中で定義したサービスの開始または再起動を行います。デフォルトは「アタッチド」モードであり、全てのコンテナのログが画面上に表示されます。「デタッチド」モード（ -d ）では、Compose はコンテナを実行すると終了しますが、コンテナは後ろで動き続けます。
docker-compose run コマンドは「ワンオフ」（one-off；１つだけ、偶発的） または「アドホック」（adhoc；臨時）なタスクの実行に使います。実行するにはサービス名の指定が必要であり、特定のサービス用のコンテナを起動し、かつ依存関係のあるコンテナも起動します。 run の利用時は、テストの実行であったり、データ・ボリューム・コンテナに対するデータの追加・削除といった管理タスクです。 run コマンドは実際には docker run -ti を処理しており、コンテナに対してインタラクティブなターミナルを開き、コンテナのプロセスが終了すると、その時点の該当する終了コードを返します。
docker-compose start コマンドは既に作成済みのコンテナの再起動には便利です。しかし止まっているコンテナを起動するだけであり、新しいコンテナは作成しません。