docker_nginx_phalcon

Dockerでつくる開発環境【php-fpmコンテナ編】

いよいよ、今回はアプリケーションサーバのコンテナを動かしてnginxと連動させてみたいと思います。
前回はnginxで静的コンテンツを表示することはできているので、今回うまくいけばあとはDBサーバのコンテナを使えるようにすればよさそうです。

アプリケーションサーバにはphpを選んでみました。さらにphalconという高速なフレームワークも入れてみます。

Dockerfile

nginxと同様、今回もDockerfileを作ります。

FROM ubuntu:14.04

RUN apt-get update && \
    apt-get install -y -q software-properties-common && \
    apt-add-repository ppa:phalcon/stable && \
    apt-get update && \
    apt-get install -y -q php5-common php5-cli php5-fpm php5-dev php5-pgsql php5-gd php5-curl php-pear php5-imagick php5-mcrypt php5-memcached php5-phalcon libpcre3-dev curl && \
    php5enmod mcrypt && \
    php5enmod phalcon && \
    sed -i 's/\;date\.timezone\ \=/date\.timezone\ \=\ Asia\/Tokyo/g' /etc/php5/fpm/php.ini && \
    sed -i 's/\;date\.timezone\ \=/date\.timezone\ \=\ Asia\/Tokyo/g' /etc/php5/cli/php.ini && \
    sed -i "s/expose_php=.*/expose_php=Off/" /etc/php5/fpm/php.ini && \
    sed -i -e "s/;daemonize\s*=\s*yes/daemonize = no/g" /etc/php5/fpm/php-fpm.conf && \
    sed -i "s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/" /etc/php5/fpm/php.ini && \
    sed -i -e "s/;catch_workers_output\s*=\s*yes/catch_workers_output = yes/g" /etc/php5/fpm/pool.d/www.conf && \
    echo "php_admin_value[display_errors] = 'stderr'" >> /etc/php5/fpm/pool.d/www.conf && \
    sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 20M/" /etc/php5/fpm/php.ini && \
    sed -i "s/post_max_size = 2M/post_max_size = 20M/" /etc/php5/fpm/php.ini && \
    rm -rf /var/lib/apt/lists/*

VOLUME ["/etc/php5","/var/run"]

EXPOSE 9000

ENTRYPOINT ["/usr/sbin/php5-fpm", "-F"]

phalcon公式サイトのUbuntuでのダウンロード方法に従ってapt-getでインストールさせています。あとはphp.iniやphp-fpm.confの設定を変えています。

Dockerではコンテナごとに1プロセスを動かすことが多いのでdaemonとしてではなくphp5-fpmをフロントエンドで動作させるようにしています。

ビルドしてイメージを作成

早速、Dockerfileを使ってイメージをビルドします。

$ docker build -t test/phalcon ./

php5-fpmのコンテナを動かします

php5-fpmのサーバからファイルが読み込めるように、/var/wwwにマウントして起動させます。

$ docker run -d -v /Users/abe/dockers/www:/var/www --name phalcon  test/phalcon
ea8a17fae14fdd102bfa453b47723e2d17c66553e4785c5fc150c66efb17c41c

ちなみに www の中には以下のindex.phpを入れています。

<?php

use Phalcon\Mvc\Micro;

$app = new Micro();

$app->get('/', function () use ($app) {
    echo "Hello World!";
});

$app->handle();

phalconのマイクロフレームワークを使って Hello World! を表示させるだけのスクリプトです。

nginxを動かす

次に前回作ったnginxのイメージを使ってコンテナを動かします。
注意する点は以下の通り。

  • fastcgi_passでphpコンテナ内の/var/run/php5-fpm.sockを読める必要がある
  • phpコンテナと同様、wwwを/var/wwwにマウントする
  • ポートマッピングの設定をする
  • 前回同様、サイト設定のファイルを/etc/nginx/sites-enabled/内にマウントさせる

これを考慮して作ったサイト設定ファイルは以下の通りです。

server {
	listen 80;

	set $root_path '/var/www';
	root $root_path;
	index index.php index.html index.htm;

	# Make site accessible from http://localhost/
	#server_name localhost;

	sendfile off;

	location / {
		# First attempt to serve request as file, then
		# as directory, then fall back to displaying a 404.
		try_files $uri $uri/ /index.php?$args;
		# Uncomment to enable naxsi on this location
		# include /etc/nginx/naxsi.rules
	}

	location ~ \.php$ {
		try_files $uri =404;
		fastcgi_split_path_info ^(.+\.php)(/.+)$;
		fastcgi_pass unix:/var/run/php5-fpm.sock;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include fastcgi_params;
	}

	location ~* ^/(css|img|js|flv|swf|download)/(.+)$ {
		root $root_path;
	}

	# deny access to .htaccess files, if Apache's document root
	# concurs with nginx's one
	#
	location ~ /\.ht {
		deny all;
	}
}

ほぼ、phalconのサイトのNginx インストールノートのまんまです(笑)。

さて、それでは実行してみます!

$ docker run -d -v /Users/abe/dockers/www:/var/www --name nginx -p 8080:80 -v /Users/abe/dockers/conf/phalcon_nginx.conf:/etc/nginx/sites-enabled/default --volumes-from phalcon nginx
601b186fb71fe46399f6a6a0b3f1e202021cfb714076217421c2d613e80dee38

動作確認

ブラウザで確認します。

スクリーンショット 2016-02-13 22.23.12

問題ないようですね。
ここまで出来たら、phpではなく他のアプリケーションサーバのコンテナ(tomcatとか)でもうまくできそうです。
今回の例のようにnginxイメージは一回作っておけば、このように設定だけで色々と使い回しが出来るので便利ですね。
コンテナごとの結合力が疎なのでこういうことができるのだと思います。

次回はいよいよデータベースサーバのコンテナを作ってphp+phalconからアクセスできるようにしてみます。

LINEで送る
Pocket

コメント “Dockerでつくる開発環境【php-fpmコンテナ編】

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です