PHP
Apache
docker
PHP7

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

はじめに :whale:

新規でPHP開発をするにあたり、

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

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

※Docker自体のインストールはDockerをMacにインストールするをご覧ください。

また、@y_tsubukuが所属するユリシーズでは採用もしておりますので、良ければご覧ください :tada:

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

docker run -d --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にアクセスしてブラウザで確認する

403_Forbidden.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にアクセスしてみましょう。

phpinfo__.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にアクセスしてみましょう。
スクリーンショット 2017-05-26 14.54.22.png

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

終わりに

ご覧下さりありがとうございました。
次はMySQLとLaravelの環境を構築して、実際の開発環境を進められるように揃えていきます。(記事を書き次第、リンクさせる予定です。
↓書きました :tada:
DockerでLaravelの開発環境を構築する(Laradock)

Appendix

公式系

Docker Hub - PHPオフィシャルリポジトリ
Docker run reference

とても参考になった記事

Docker Hubのオフィシャルイメージを使ったLAMP環境(Apache+PHP+MySQL)構築