■Dockerによるアプリケーションレベルの仮想化というか、実行空間の分離が簡単にできるようになり、早速適当な事例としてPHP7の先行ビルドをやってみることにしました。コンテナ内でapache+php7の環境を作り、bridge接続で外部からアクセスしてウェブページの表示確認を目的としてみます。もちろん、ウェブサイト本体の表示は維持することは前提です。
最初はZendのPHP7ページからDockerのコンテナ空間に直接マウントできるtar.gzファイルがあったのだけど、Fedora21環境ではライブラリ環境が新しすぎて駄目でした。結局git cloneでソースをコピーしてビルドすることにしました。
git clone https://git.php.net/repository/php-src.git
fedoraのコピーに手元にあるapacheの実行バイナリを取り込んでベースになるテスト環境を取り込み、そのパッケージ空間内部でgit cloneを実行しました。そのあとbuild confするわけですが、前提のモジュールが諸々足りないため、yumで追加インストールしました。
yum -y install autoconf yum -y install gcc gcc-c++ yum -y install re2c yum -y install bison yum -y install libxml2-devel yum -y install openssl-devel yum -y install bzip2-devel yum -y install libcurl-devel yum -y install libjpeg-devel yum -y install libXpm-devel yum -y install freetype-devel yum -y install t1lib-devel yum -y install gmp-devel yum -y install mysql-devel yum -y install aspell-devel yum -y install recode-devel
configureはPHPNGにあるように以下のオプションで実行しました。
./configure \ --prefix=$HOME/tmp/usr \ --with-config-file-path=$HOME/tmp/usr/etc \ --enable-mbstring \ --enable-zip \ --enable-bcmath \ --enable-pcntl \ --enable-ftp \ --enable-exif \ --enable-calendar \ --enable-sysvmsg \ --enable-sysvsem \ --enable-sysvshm \ --enable-wddx \ --with-curl \ --with-mcrypt \ --with-iconv \ --with-gmp \ --with-pspell \ --with-gd \ --with-jpeg-dir=/usr \ --with-png-dir=/usr \ --with-zlib-dir=/usr \ --with-xpm-dir=/usr \ --with-freetype-dir=/usr \ --with-t1lib=/usr \ --enable-gd-native-ttf \ --enable-gd-jis-conv \ --with-openssl \ --with-mysql=/usr \ --with-pdo-mysql=/usr \ --with-gettext=/usr \ --with-zlib=/usr \ --with-bz2=/usr \ --with-recode=/usr \ --with-mysqli=/usr/bin/mysql_config
apacheへ取り込みにあたりapr, apr-utilと、apahceに含まれるbuildディレクトリにあるツールが必要になります。
httpd.confの設定ではphp5の代わりにphp7を指定するだけになります。既存空間だとapacheを別ディレクトリにインストールしたり、ポートを付け替える必要があったりいろいろ工夫が必要になりますが、コンテナ空間だとそこは気にしなくて済むのが楽でした。
#LoadModule php5_module modules/libphp5.so LoadModule php7_module modules/libphp7.so
php.iniはとりあえずショートタグを禁止にしないと不便ということもあり、最小限の設定です。
short_open_tag = Off max_execution_time=600 memory_limit=128M error_reporting=0 display_errors=0 log_errors=0 user_ini.filename= realpath_cache_size=2M cgi.check_shebang_line=0 zend_extension=opcache.so opcache.enable_cli=1 opcache.save_comments=0 opcache.fast_shutdown=1 opcache.validate_timestamps=1 opcache.revalidate_freq=60 opcache.use_cwd=1 opcache.max_accelerated_files=100000 opcache.max_wasted_percentage=5 opcache.memory_consumption=128 opcache.consistency_checks=0
パッケージの起動では、ネットワークをデフォルトの"bridge"として、ポートマッピングでウェブサイト本体と棲み分けを行います。
docker run -p 20000:80 -d -t php7:test entry.sh
ウェブサイトの表示は大したことをやっていなくて、せいぜいxmlドキュメントを読み込んで加工するだけで、さすがにその程度で支障はないようです。ただ、うちの場合はdioを使っているシリアルポートへのアクセスがどういうことになるのか、そこは気になります。ただ、シリアルIOについてはサーバーの物理リソースを用意しなければテストできないのでそこは工夫が必要になります。