Dockerでnginxとphp-fpmを起動する手順

Docker初心者の私がDockerの理解を深めるために実施したことを、これから何回かに渡ってブログに残していきます。

今回は、Dockerfileなどを使わずに、nginx+phpfpm環境をDockerで作る手順です。
phpfpmがバンドルされているようなnginxのイメージもあると思いますが、今回は基本的な理解を深めるために、nginxとphpfpmを別のコンテナにして作成します。

環境


docker for mac 1.13

今回はdocekr for macを使っていますが、基本的なdocker runのコマンド等を使用しているため、他のバージョンやOSでも同じように実行できるかと思います。

imageのダウンロード

まず、nginxとphp-fpmのイメージをダウンロードします。
どういった名前のイメージがあるかは docker searchを使うと良さそうです。


$ docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 5195 [OK]

OFFICIALが[OK]ですと公式イメージですので、最初は公式イメージを利用すると良さそうです。

イメージのダウンロードは docker pull を使用します。


$ docker pull nginx
$ docker pull php:5.6-fpm

イメージ名のみですと、そのイメージの最新版を取得します。
例えば、


$ docker pull php

ですと、PHP7を含んだイメージがダウンロードされます。
この場合、モジュール版でApacheだったりするので、上記のように自分の希望する環境のイメージをタグで指定すると良さそうです。

ファイルの作成(php)

nginxの設定ファイルとphpinfo用のファイルを置くディレクトリを作成します。
コンテナの中に置くこともできますが、変更が多いファイルはコンテナ外に置くのがDockerの理想とされています。
今回は、nginxの設定ファイルと、PHPファイルを外に置くようにします。


$ mkdir nginx
$ cd nginx
$ mkdir -p etc/nginx/conf.d/
$ mkdir -p var/www/html

$ echo "<?php phpinfo(); ?>" > var/www/html/index.php

ファイルの作成(nginx)

nginxでphp-fpmに接続する最低限の設定ファイルを作成します。
DocumentRootを指定、fastcgiとしてphpfpmの名前でtcp9000番ポートへ接続するように設定します。


server {
listen 80 default;
server_name _;
root /var/www/html;
index index.php index.html index.htm;
charset utf-8;

access_log off;
error_log off;

location / {
try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php$ {
fastcgi_pass phpfpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

コンテナの起動

まず、php-fpmを起動します。
ここでのポイントは、-vでphpファイルの場所を指定することです。
nginx側でDocumentRootをマウントしなくてOKです。
また、-dオプションでデタッチドモードになり、バックグラウンドで起動します。
※-dをつけないとフォアグラウンドで起動して、exitをするとプロセスが終了します。その場合、Ctrl+p,Ctrl+qとすると終了することなく抜けることができます。


$ docker run --name phpfpm-5.6 -v $(pwd)/var/www/html/:/var/www/html/ -dti php:5.6-fpm

次に、nginxを起動します。
起動時にphpfpmというserver.confに設定した名前でリンクするように指定します。
また、ここでのポイントとして、DocumentRootはnginx側で設定せず、設定ファイルのみを-vで指定します。


$ docker run --name nginx -v $(pwd)/etc/nginx/conf.d:/etc/nginx/conf.d -p 8000:80 --link phpfpm-5.6:phpfpm -dti nginx

あとは、ブラウザで、http://localhost:8000 へ接続してphpinfoが表示されればOKです。

終了

下記コマンドで起動しているかどうかを確認できます。


$ docker ps

下記で強制的に終了させることができますし、stopと指定することで停止することも可能です。
※docker run 時に –rmをつけると削除が自動的に行われます。

“`bash
$ docekr rm -f nginx
[/code]

不要になったイメージ(再利用しないもの)は、下記で削除できます。


$ docker rmi nginx

コンテナに入って調べたり、操作したりする

bashを起動して、中に入る場合です。


$ docker exec nginx bash

centosイメージを使ったコンテナで、シェルを起動せずに、パッケージをインストールしたい場合などは、execを使うことでインストールすることも可能です。


$ docker exec centos yum install nginx -y

おまけ

php-fpmにmysqliをインストールする手順です。
docker-php-ext-installで拡張モジュールがインストールできます。
今回は不要でしたが、mysqlへ接続する際にmysqliをインストールする場合は、下記のようにします。


$ docker exec -ti php-fpm-5.6 /usr/local/bin/docker-php-ext-install mysqli

まとめ

docker runは一時的に使用するためには大変便利です。
nginxを起動して、設定ファイルが問題無いか確認したり、mysqlをさっと起動してSQLを実行することもできます。
phpやRuby,Pythonなど複数の異なるバージョンのイメージを手軽に起動できるので、ほにゃららenvを使わなくても良かったりもします。

その反面、設定変更したりパッケージをインストールして使うには、そのままだとdocker execを使ったりbashをアタッチしたりしないといけません。
その場合はDockerfileを利用すると、手間を省略することができます。
Dockerfileについてはまた次回ブログに書いてみようと思います。

以上、Dockerでnginxとphp-fpmのコンテナを起動する手順でした。

今まさに読んでる本