Dockerを利用してPHPの開発環境を用意してみましょう。
Dockerのインストール
MacにDockerをインストールするのは簡単です。
公式サイトから「Docker for Mac」をダウンロードしてインストールするだけです。
下記から「Docker for Mac」をダウンロードします。
Install Docker Desktop for Mac | Docker Documentation
インストールが終わったら、ターミナルから確認してみましょう。
下記のコマンドでバージョンを確認してみます。
$ docker --version Docker version 18.09.1, build 4c52b90
OKですね。
NginxでWebサーバーを構成する
DockerイメージとDockerコンテナ
続いてDockerのイメージを用意します。
Dockerイメージとは、Dockerコンテナを作り出すための設計図のようなものです。
Dockerコンテナとは、Dockerイメージに基づいて、具現化されたファイルシステムとアプリケーションが実行されたものです。
語弊があるかもしれませんが、プログラミングでいうところのDockerイメージは「クラス」で
Dockerコンテナは「インスタンス」のようなものと考えるとわかりやすいかもしれません。
DockerコマンドでNginxサーバーを起動する
では、実際にNginxでWebサーバーを構成してみたいと思います。
DockerイメージはDocker向けのコンテナ共有サービス「Docker Hub」に公式イメージとして公開されているものがあるので、そちらを利用したいと思います。
DockerイメージからDockerコンテナを実行してみます。
まずは作業用のディレクトリを用意します。
今回は「php_docker」というディレクトリ名にしてみます。
$ mkdir php_docker $ cd php_docker $ docker container run -d -p 8000:80 --name web nginx:latest
docker container runコマンドでDockerイメージを指定することで、Dockerコンテナを実行することができます。
簡単ですが、コマンドについて解説します。
-d オプションでバックグラウンドでDockerコンテナが実行されるように指定してます。
-p オプションでホスト側の8000ポートからコンテナ側の80ポートにポートフォワーディングできるようにしています。この設定によってホスト側から8000ポートでアクセスできるようになります(ブラウザからhttp:// localhost:8000アクセスできる)
–name オプションでコンテナに名前をつけることができます。
名前をつけておくとdockerコマンドでコンテナを指定しやすくなるので、ぜひ指定しておきましょう。
最後にimageを指定します。image名は「nginx」です。
image名の後ろに「:」があり、さらにその後ろに「latest」と指定してあります。
これはタグというもので、イメージのバージョンのようなものです。
latestと指定すると最新のnginxイメージを利用してDockerコンテナが作成されます。
http://localhost:8000からwebサーバーが起動していることが確認できたらコンテナを停止しておきましょう。
$ docker container stop web
docker-composeでNginxサーバーを起動する
さて、nginxのコンテナだけを起動させるのであれば、Dockerコマンドでもいいのですが、phpで開発するのであれば、mysqlのコンテナやAPサーバー(PHP-FPM)コンテナも同時に起動させる必要が出てきます。
各コンテナを連動させるには、立ち上げの順序等を気にする必要があり、Dockerコマンドのみで、コンテナを連動させるのは、ちょっと面倒です。
そこで、便利なのが、docker-composeです。
コンテナ同士の依存関係やポートフォワーディング等の設定をyaml形式のファイルで管理することができます。
「Docker for Mac」をインストールしていれば、docker-composeはすぐに利用できます。
まずは、バージョンを確認してみましょう。
$ docker-compose --version docker-compose version 1.23.2, build 1110ad01
OKですね。
では、docker-composeでnginxサーバーを構築してみましょう。
下記のファイルを用意します。
docker-compose.yml というファイルを上記で作成した作業用のディレクトリ(php_docker)に作成します。
version: '3' services: web: image: nginx:latest ports: - "8000:80"
dockerコンテナを起動してみます。
docker-compose up -d
ブラウザからhttp:// localhost:8000アクセスできることを確認してみましょう。
コンテナを停止するには、下記コマンドを実行します。
docker-compose stop
docker-compose.ymlを使ってもう少し設定をしてみます。
ホスト側で編集したソースコードやnginxの設定ファイルをコンテナ側と共有できるようにします。
具体的にはvolumesを使用します。
作業ディレクトリにsrcディレクトリとwebディレクトリを作成します。
srcディレクトリにindex.htmlを作成し、webディレクトリにnginxの設定ファイルとしてdefault.confを作成します。
では、index.htmlを用意します。
$ mkdir src $ cd src $ vi index.html
htmlはこんな感じです。
Hello Docker !!
続いて、設定ファイルを作成します。
$ cd ../ $ mkdir web $ cd web $ vi default.conf
default.confはこんな感じです。
server { listen 80; root /var/www/; index index.html; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; }
docker-compose.ymlを編集します。
version: '3' services: web: image: nginx:1.15.6 ports: - "8000:80" volumes: - ./web/default.conf:/etc/nginx/conf.d/default.conf - ./src:/var/www/
volumesの「:」の左側にホストのファイルパス、右側にコンテナのファイルパスを記述します。
ブラウザからhttp:// localhost:8000へアクセスして
Hello Docker!! と表示されていればOKです。
これで静的HTMLを配信するためのNginxサーバーの構築ができました。
PHPを動作させるAPサーバーを構築する
続いてPHPを動作させるためのAPサーバーを用意します。
今回はPHP-FPMを利用します。
イメージは公式イメージを利用します。
docker-compose.ymlを編集します。
version: '3' services: web: image: nginx:1.15.6 ports: - "8000:80" depends_on: - app volumes: - ./web/default.conf:/etc/nginx/conf.d/default.conf - ./src:/var/www/ app: image: php:7.2.15-fpm volumes: - ./src:/var/www/
depends_onでコンテナの依存関係を定義しておきます。
続いて、PHPを実行できるようにnginxの設定ファイルを編集します。
server { listen 80; root /var/www/; index index.php index.html; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass app:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }
srcディレクトリにindex.phpを追加します。
phpinfo();
コンテナを実行してみます。
docker-compose up -d
PHP の設定情報が表示されればOKです。
これでPHPの動作環境も整いました。
srcディレクトリでphpのファイルを作成すれば、コンテナとディレクトリは共有されているので、phpの開発をする環境は整いました。
本当はMySQLサーバーも用意したいのですが、記事が長くなりましたので
今日はここまでにしたいと思います。
[追記:2019-3-30]
続き、書きました。