DockerでPHP7.0×Apacheの環境を構築する（更新: 2017/6/27）

## はじめに :whale: 
新規でPHP開発をするにあたり、

* どうせならDockerで開発したい :whale: 
* でも、やっぱりファイルはホスト側で書いて同期させたい :file_folder:  

と思い構築手順をまとめました。
ザクザク行けば15分程度でApacheを起動してPHPを動かせると思います。

※Docker自体のインストールは[DockerをMacにインストールする](http://qiita.com/kurkuru/items/127fa99ef5b2f0288b81)をご覧ください。

また、[@y_tsubuku](https://twitter.com/y_tsubuku)が開発する[yaritori - メール共有システム](https://yaritori.jp/)も、良ければご覧ください :tada: 

追記） [エンジニアの募集もはじめました！!](https://www.wantedly.com/projects/509643)

## PHP7.0 + Apacheを起動する :rocket: 

`docker run -d -p 80:80  --name php70-apache  php:7.0-apache`
でイメージからコンテナを立ち上げる。（ローカルにimageがない場合はDocker Hubから取得してくれる。）
今回はNAMESに`php70-apache`と指定しました。
また、`-p`オプションでポートを80番でフォワードします。

```
$docker run -d -p 80:80  --name php70-apache  php:7.0-apache
Unable to find image 'php:7.0-apache' locally
7.0-apache: Pulling from library/php
10a267c67f42: Pull complete 
370377701f89: Pull complete 
455c73a122bc: Pull complete 
fb71bac61c47: Pull complete 
288a1d91ad4e: Pull complete 
86e0256ba4b0: Pull complete 
f14fbe7a9dfb: Pull complete 
0f36dd91c0ab: Pull complete 
ee4d938396ab: Pull complete 
a0e5f6ef63c3: Pull complete 
0aecbd237b32: Pull complete 
79b4b986d794: Pull complete 
8d9a245edba8: Pull complete 
Digest: sha256:2f52564c919bef8efb56b12ee6490b03c41af0c37823a6bc0930cfa4586d09f4
Status: Downloaded newer image for php:7.0-apache
d71231ac60056802ece90fba8fcff3230e593b705f76a77b59078194bec93211
```

`docker container ls`で立ち上がっているか確認する。

```
$docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
d71231ac6005        php:7.0-apache      "docker-php-entryp..."   15 hours ago        Up 31 seconds       0.0.0.0:80->80/tcp   php70-apache
```

良い感じ！NAMESにもちゃんと`php70-apache`が反映されてます。

[localhost](http://localhost/)にアクセスしてブラウザで確認する

<img width="459" alt="403_Forbidden.png" src="https://qiita-image-store.s3.amazonaws.com/0/99874/8313f733-75d6-0149-8761-878957f1902c.png">

これでApacheが立ち上がっている事を確認できました。

ですが、今はForbiddenページしか表示されないので、実際にPHPを書いて表示させてみましょう。

まずは、`php70-apache`コンテナにログインします。

```
$docker container exec -ti php70-apache bash
```

すると、カレントディレクトリがドキュメントルートである`/var/www/html`となっているはずです。

```
#一応確認
root@d71231ac6005:/var/www/html# pwd
/var/www/html
```

```
$echo '<?php phpinfo();' > index.php
```

これで再度、[localhost](http://localhost/)にアクセスしてみましょう。

<img width="960" alt="phpinfo__.png" src="https://qiita-image-store.s3.amazonaws.com/0/99874/ae6c1b3e-ac7a-3f31-a9c8-d303973f8baf.png">

良い感じ！これでPHP7.0とApacheが正しく動作していることを確認できました。

## ホスト⇔コンテナ間でディレクトリを同期する :file_folder: 
直接コンテナにファイルを置いて、そこでザクザク開発するのもありっちゃありですが、
**コンテナを削除した際に同時にそのコンテナ内にあるファイルも消えてしまいます**。

ですので、ホスト側とコンテナのディレクトリを同期させて、そこにファイルを書き込む形式をとりましょう。

まずは、先程作成したコンテナは削除します。

```
# コンテナを停止
$docker container stop php70-apache
# コンテナを削除
$docker container rm php70-apache
```

そして、新しくディレクトリが同期されるコンテナを作成しましょう。
ホスト側の同期対象となるディレクトリを
`/Users/y-tsubuku/docker/php70-apache/www`
コンテナ側はドキュメントルートである
`/var/www/html`としました。

```
$docker run -d -p 80:80 -v /Users/y-tsubuku/docker/php70-apache/www:/var/www/html --name php70-apache php:7.0-apache
41daf7f2647bc016db8b3d60ba14b67644b0f33f3d36477ab9e2ff63a70c2e6a
```
これで`/Users/y-tsubuku/docker/php70-apache/www`にいる場合に

```
$echo '<?php phpinfo();' > index.php
```

これで再度、[localhost](http://localhost/)にアクセスしてみましょう。
<img width="952" alt="スクリーンショット 2017-05-26 14.54.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/99874/86a55557-03ac-2692-a576-29ab32108cc5.png">

これで、（先程と同じ画面ですが）ホスト側で作成されたファイルがコンテナへ正しく同期されていることを確認することができました。

## 終わりに
ご覧下さりありがとうございました。
次はMySQLとLaravelの環境を構築して、実際の開発環境を進められるように揃えていきます。（~~記事を書き次第、リンクさせる予定です。~~）
↓書きました :tada:
[DockerでLaravelの開発環境を構築する(Laradock)](http://qiita.com/kurkuru/items/6ce0b9c4632b944347b8)

## Appendix
### 公式系
[Docker Hub - PHPオフィシャルリポジトリ](https://hub.docker.com/_/php/) 
[Docker run reference](https://docs.docker.com/v1.11/engine/reference/run/)

### とても参考になった記事
[Docker Hubのオフィシャルイメージを使ったLAMP環境(Apache+PHP+MySQL)構築](http://qiita.com/naga3/items/be1a062075db9339762d)