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をつけると削除が自動的に行われます。

$ docekr rm -f nginx

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

$ 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のコンテナを起動する手順でした。

今まさに読んでる本