PHP
MySQL
開発環境
docker

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

始めに

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

(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
(中略)

Screen Shot 2018-04-18 at 12.36.14.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に変更します。

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

Screen Shot 2017-12-22 at 15.18.04.png

docker-compose.ymlの編集

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

Screen Shot 2017-12-22 at 15.19.19.png

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

PHPサーバの受け付けを変える

PHPサーバ(Apache+mod_php)では*.devでのみ待ち受けているので、そちらを*.testで待ち受けるように変更します。

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

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

$ 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

新しいバージョンに

思えば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

便利じゃないですか?
案件がたくさんあっても切り替え簡単なんです。
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

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

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

Screen Shot 2016-10-19 at 21.00.23.png

初回起動中です。

Screen Shot 2016-10-19 at 22.21.23.png

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

Screen Shot 2016-10-19 at 21.34.47.png

DAMPダウンロード

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

解凍します。

中身は

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

となっています。

リゾルバの変更

example.testtest1.testといったドメインにアクセスできる初期設定をします。
resolver_ja.commandを開きます。

Screen Shot 2016-10-19 at 21.39.05.png

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

Screen Shot 2016-10-19 at 22.24.34.png

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

Screen Shot 2016-10-19 at 22.24.51.png

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

Screen Shot 2016-10-19 at 21.40.30.png

終わったら閉じます。

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

DAMPの初回起動

DAMPを起動するにはdamp_ja.commandを開きます。
Screen Shot 2016-10-19 at 21.41.30.png

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

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

ドキュメントルートの設定

テスト用のドキュメントルートを作成します。
ホームディレクトリにpublic_htmlというフォルダを作成します。
その中にexample.testというフォルダを作成します。
Screen Shot 2016-10-21 at 18.28.33.png

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

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

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

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

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

Screen Shot 2016-10-19 at 21.43.52.png

起動、終了、強制終了

DAMPの起動

初回起動で流れるログが落ち着いたら準備完了です。

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

Screen Shot 2016-10-21 at 18.30.34.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ファイルを編集してください。

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でアクセスさせるようにするサンプルです。

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

フォルダの場所について

標準ではホームディレクトリのpublic_htmlがドメインのルートになります。

docker-compose.yml
(中略)
    volumes:
      # Add symlink directories if you use symlinks at documents.
      # - ~/git:/Users/home/username/git

任意の場所に変える場合には- ~/public_html:/var/www/vhostsを変更してください。
ホームディレクトリの「サイト」ディレクトリにする場合には

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