ローカル開発環境をもっとたくさんの人に使ってもらいたくてDockerで作りました

# 始めに
最近ウェブ開発でローカル環境を使って欲しいなぁ、とすごく思うようになりました。
慣れてしまえば開発効率が上がると思うんですけど、その導入が大変なんですよね。
仕事で一緒になった方々に手作業で構築していましたが、もっと簡単にできないかなということで作りました。
Mac用です。名前はDAMP(Docker Apache MySQL PHP。 XAMPP, MAMPから取りました。)です。
Apache、MySQL、PHPが動きます。

# （2018年11月8日）PHP7.2に対応しました
1.7.2でPHP7.2に対応しました。
https://github.com/yousan/damp/releases/tag/1.7.2
サンプルの`docker-compose.yml`はこちらです。
https://github.com/yousan/damp/blob/master/docker-compose-public_html.yml

Mac本体の買い替え＋PHP7.2化するとかなり早くなりました。
WordPressやCakePHPの開発に使っています。

# （2018年4月18日追記） `*.test`が動かない問題への対処その2

現状の確認 -> パッチ -> 確認 を行うことで `*.test` で動くようになります。

```
# 確認
$ docker exec -it php.test cat /etc/apache2/sites-available/000-default.conf
(中略)

<VirtualHost *:80>
    ServerAlias *.dev
    UseCanonicalName Off
(中略)


パッチを当てる
$ curl -L https://raw.githubusercontent.com/yousan/damp/develop/bin/dev_to_test.sh\?"`date`" | bash

# 確認
$ docker exec -it php.test cat /etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
    ServerAlias *.test
    UseCanonicalName Off
(中略)
```

<img width="756" alt="Screen Shot 2018-04-18 at 12.36.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/361ca0a4-3723-f39c-f962-af0371f3b5eb.png">

damp自体のdocker-composeをバージョン1.6.1としていて、そちらではdnsmasqを`*.test`に対応しました。
ただPHP5.6のイメージがaptでコケてしまうため、こちらを修正するためのスクリプトです。

# （2017年12月22日追記） `*.test`が動かない問題への対処
Google Chromeのバージョン63より、 `*.dev`というドメインが必ずHTTPSにリダイレクトされるようになりました。

https://laravel-news.com/chrome-63-now-forces-dev-domains-https

https://github.com/laravel/valet/issues/433

ここで紹介しているDAMPでは `*.dev` を使っていたため、Chromeではうまく動かないです。`*.test`に統一しました。

（2017年12月22日追記）

## MacOSのドメイン解決の変更
`*.test`のドメイン解決（名前解決）をDockerのDnsmasqで行うため、`/etc/resolver/dev`を`/etc/resolver/test`に変更します。

```bash
$ cd /etc/resolver/
$ sudo mv dev test
```

![Screen Shot 2017-12-22 at 15.18.04.png](https://qiita-image-store.s3.amazonaws.com/0/47327/849ebfb4-a81b-5617-2e1c-9341bf1c8c7d.png)


## docker-compose.ymlの編集
DAMPのdocker-compose.ymlのうち、`*.dev`となっているものを`*.test`に直します。

![Screen Shot 2017-12-22 at 15.19.19.png](https://qiita-image-store.s3.amazonaws.com/0/47327/11d48983-acd7-fc6d-62ed-88386b5c9eda.png)

コンテナ名とかの箇所の変更ですね。

## PHPサーバの受け付けを変える
PHPサーバ（Apache＋mod_php）では`*.dev`でのみ待ち受けているので、そちらを`*.test`で待ち受けるように変更します。


```php
$ docker exec -it php.test sed -i 's/ServerAlias *.dev/ServerAlias *.test *.dev/' /etc/apache2/sites-available/000-default.conf
```

下記のコマンドで確認できます。

```bash
$ docker exec -it php.test sed -i 's/ServerAlias *.dev/ServerAlias *.test *.dev/' /etc/apache2/sites-available/000-default.conf
```

ServerAliasの項目が変更されていればOKです。

![Screen Shot 2017-12-22 at 15.30.12.png](https://qiita-image-store.s3.amazonaws.com/0/47327/74f77748-ceb0-9134-788b-d3db4422d601.png)

## 新しいバージョンに
思えばDAMPを作ったのは一年ほど前ですね。
PHPも5.6で作りましたが、今となっては7が欲しいなぁと思っています。
このPHPサーバの機能はUbuntuをベースにしていますが、そこから追加しているパッケージが見つからなくなっているため、リビルドが出来ない状態です。

是非Alpineあたりで新しいバージョンにしていきたいと思います。

# なにができるの？

フォルダを作るとブラウザでアクセスできるローカル環境ができます。
例えば `~/public_html/test.test` というフォルダを作ると http://test.test でアクセスすることができます。

![Screen Shot 2016-10-21 at 18.21.22.png](https://qiita-image-store.s3.amazonaws.com/0/47327/1163ca70-0ac5-cd81-76d5-ddeedb238b83.png)

便利じゃないですか？
案件がたくさんあっても切り替え簡単なんです。
`VirtualHost`ってたくさん書かなくても良いんです。
Hostsの編集もいらないんです。

## 中身
ローカルマシンで下記を起動します。

* ウェブサーバ (Apache httpd)
* PHP (mod_php)
* データベースサーバ (MySQL (MariaDB))
* DNSサーバ

基本的な機能はMAMPやVagrantと一緒です。

# 事前準備
## Docker for Macのインストール
ここからダウンロードしてインストールします。
> https://docs.docker.com/docker-for-mac/

![Screen_Shot_2016-10-19_at_20_53_09.png](https://qiita-image-store.s3.amazonaws.com/0/47327/d95e8e09-05c7-cff8-fb3b-6284a489e380.png)

ページ中央あたりにある「Get Docker for Mac(stable)」です。

インストールが完了したら起動します。

![Screen Shot 2016-10-19 at 21.00.23.png](https://qiita-image-store.s3.amazonaws.com/0/47327/44e2594c-814a-9a49-4c84-4af1cd101550.png)

初回起動中です。

![Screen Shot 2016-10-19 at 22.21.23.png](https://qiita-image-store.s3.amazonaws.com/0/47327/8a734ba1-2cfd-c11a-5f0c-3a125b89ad7a.png)

常駐トレイにくじらのアイコンが出たら起動完了です。

![Screen Shot 2016-10-19 at 21.34.47.png](https://qiita-image-store.s3.amazonaws.com/0/47327/eaa10212-52ac-a2a9-c171-9e0aa7edb4d4.png)


## DAMPダウンロード
DAMP本体をダウンロードします。
https://github.com/yousan/damp/archive/master.zip

解凍します。

中身は

| ファイル名 | 説明 |
|:-:|:-:|
| resolver_ja.command  | *.testを有効化します。一回だけ使います。 |
| damp_ja.command  | DAMP本体です。  |
| stop_all_docker_ja  | 強制終了します。  |

となっています。

## リゾルバの変更
`example.test`や`test1.test`といったドメインにアクセスできる初期設定をします。
resolver_ja.commandを開きます。

![Screen Shot 2016-10-19 at 21.39.05.png](https://qiita-image-store.s3.amazonaws.com/0/47327/8057426a-5281-dcad-a7a4-84248df060c1.png)

環境によっては「開発元が不明のため」というエラーがでる場合があります。

![Screen Shot 2016-10-19 at 22.24.34.png](https://qiita-image-store.s3.amazonaws.com/0/47327/5b9c2a4e-6e37-a4f7-c549-c77be72f4244.png)

この場合には「システム環境設定＞セキュリティ＆プライバシー」から実行を許可してください。

![Screen Shot 2016-10-19 at 22.24.51.png](https://qiita-image-store.s3.amazonaws.com/0/47327/80946c93-f897-cb74-c850-7edef77c27ed.png)

パスワードを求められるので現在macOSにログインしているユーザのパスワードを入力します。

![Screen Shot 2016-10-19 at 21.40.30.png](https://qiita-image-store.s3.amazonaws.com/0/47327/13d138ec-dff2-1cc8-71e7-f7fc078cc67a.png)


終わったら閉じます。

ここまでで事前準備は終わりです。

## DAMPの初回起動
DAMPを起動するには`damp_ja.command`を開きます。
![Screen Shot 2016-10-19 at 21.41.30.png](https://qiita-image-store.s3.amazonaws.com/0/47327/a9245bcc-2107-2bea-80be-03517673648e.png)


初回はダウンロードがあるので時間が掛かります。回線環境の良いところで実行してください。

ダウンロードをまっている間にテスト用のドメインを作成しましょう。

## ドキュメントルートの設定
テスト用のドキュメントルートを作成します。
ホームディレクトリに`public_html`というフォルダを作成します。
その中に`example.test`というフォルダを作成します。
![Screen Shot 2016-10-21 at 18.28.33.png](https://qiita-image-store.s3.amazonaws.com/0/47327/91026796-c1df-096e-5436-e41f8f9a8f72.png)


例:) `/Users/yousan/public_html/example.test`


ここに `index.html` を作成し、中に適当なことを書いておきます。

```html:~/public_html/example.test/index.html
<html><body>
Hello World!!
</body></html>
```

このフォルダ設定は変更することもできます。

この辺りでDAMPのダウンロードは終わっているでしょうか。ログが落ち着いたら準備完了です。

![Screen Shot 2016-10-19 at 21.43.52.png](https://qiita-image-store.s3.amazonaws.com/0/47327/14534bee-9011-e59d-8f2d-2edde3bb6d7d.png)


# 起動、終了、強制終了
## DAMPの起動
初回起動で流れるログが落ち着いたら準備完了です。

ブラウザで http://example.dev にアクセスしてみてください。

![Screen Shot 2016-10-21 at 18.30.34.png](https://qiita-image-store.s3.amazonaws.com/0/47327/0b60c7cf-98f1-a890-4565-0e7c5d4cf6b9.png)


Hello World! が表示されたでしょうか？

このように、 `*.dev` という名前でフォルダを作成するとそのドメインでブラウザからアクセスする事ができます。
簡単ですね！

## アクセスログ
DAMP (Apache)へのアクセスはDAMPを開いているウィンドウに流れます。エラーなどはそちらから追跡が可能です。

## DAMPの終了
DAMPの終了はDAMPを開いているウィンドウで Ctrl+C (コントロールキーとC) を押します。
終了したらウィンドウは閉じてください。

もしCtrl+Cを押す前にウィンドウを閉じてしまった場合、内部的にDAMPが起動したままになります。
その場合には `stop_all_docker.command` を開いてください。
強制的に全てのDAMP (Dockerプロセス) を終了させます。

## PHP
DAMPではPHPが利用できます。通常のPHPコードを書けば良いです。

```yaahooo.php
<?php echo 'Hey YO!'; ?>
```

## MySQL
DAMPではMySQLが利用できます。

| 名前 | 値 |
|:-:|:-:|
| 接続先  |mysql.test   |
| ユーザ名  | root  |
| パスワード  | example |

## phpMyAdmin
phpMyAdminが利用できます。

http://pma.test
に接続します。

ユーザ名: root
パスワード: example

## 使えないドメイン名
コンテナ名として使っているため、下記のドメインは使うことができません。

`mysql.test`, `dnsmasq.test`, `pma.test`, `php.test`, `php5.6-apache.test`は使えません。

# その他
## シンボリックリンクについて
Mac側のシンボリックリンクが使えます。
但し一部設定の変更が必要です。
DAMPのフォルダ内にある`docker-compose.yml`ファイルを編集してください。

```yaml:docker-compose.yml
(中略)
    volumes:
      # Add symlink directories if you use symlinks at documents.
       - ~/git:/Users/home/username/git
```
シンボリックリンク先となるディレクトリを同名で追記してください。
`- /Users/home/username/git:/Users/home/username/git`
例えばホームディレクトリにあるgit以下のファイルにアクセスさせたい場合にはこれを追記してください。
各種フレームワークで`public`ディレクトリをドキュメントルートに設定する必要がある場合、シンボリックリンクを張るとうまく使えます。

Laravelでexampleというプロジェクトを作って`example.test`でアクセスさせるようにするサンプルです。

```bash
$ cd ~/git; composer create-project --prefer-dist laravel/laravel example
$ cd ~/public_html
$ ln -s ~/git/example/public ./example.test
```

## フォルダの場所について
標準ではホームディレクトリの`public_html`がドメインのルートになります。

```yaml:docker-compose.yml
(中略)
    volumes:
      # Add symlink directories if you use symlinks at documents.
      # - ~/git:/Users/home/username/git
∑
```
任意の場所に変える場合には`- ~/public_html:/var/www/vhosts`を変更してください。
ホームディレクトリの「サイト」ディレクトリにする場合には

```yaml:docker-compose.yml
- ~/Sites:/var/www/vhosts
```
としてください。

## MySQLのデータについて
MySQLのデータは消える場合があります。必要に応じてバックアップを取ってください。
なおMac側からMySQLへの接続が可能です。
接続先ホスト名 mysql.test
ユーザ名 root
パスワード example

## Windows対応について
現在はWindowsでは動きませんが、DockerがWindowsでも動くと聞いたので環境が整ったりすれば是非とも作っていきたいです。


## 外部のサーバでの運用について
DAMPはMac以外の環境でも(たぶん)利用可能ですが、公開されているサーバなどでの利用は今のところ想定していません。
外部のサーバで使うとセキュリティリスクがありますのでご注意ください。

## 動かすために必要な条件
Docker for mac の必要要件です。

* Intelプロセッサ搭載の2010年より新しいモデル (EPTなどのMMU仮想化技術搭載必須)
* Yosemite (macOS 10.10.3)以上
* 4GB以上のメモリ
* Virtual Box 4.3.30未満がインストール**されていないこと**

> Docker for Mac requirements
https://docs.docker.com/engine/installation/mac/#/docker-for-mac

その他DAMP側ではデフォルトで特定のポート番号を利用します。それらが競合すると動きません。

* 53/tcp,udp
* 80/tcp
* 3306/tcp

80, 3306についてはdocker-compose.ymlで変更可能です。

# さらにその他
## 雑感
中身についてはなんの事は無く、DockerにApache httpd, MariaDB, dnsmasqを載せただけのものです。
MAMPやVagrantの配布されているイメージと大差ありません。
でもそれらの導入もやってみるとなかなか難しかったりして、もっと便利に使ってもらいたいな、という思いがありました。

またApacheの`VirtualDocumentRoot`とdnsmasqを組み合わせた環境が非常に便利だなと思っていました。
周囲の開発者の人には環境を構築したりしていたのですが、もっと簡単にできないかな、ということをずっと考えていました。

最近になってDockerがMacでインストールできるようになり(知らなかった…)、VirtualBox経由ではなくなったためにセットアップが楽になったので「これ面白そう！」と思って作りました。

## 補注
文章を平易にするためにMySQLとMariaDB、ApacheとApache httpdなどが厳密ではありません。

## 修正箇所
「こここうした方がイイよ」といった修正箇所がありましたらプルリクエストをお願いします。(とくにセキュリティ系)

DAMP: https://github.com/yousan/damp
Dockerfile: https://github.com/yousan/damp_dockerfile

## DAMPという名前について
まぁそうなるよね… (カブり的な意味で
https://www.google.co.jp/search?q=DAMP+docker+apache+mysql+php&hl=en