Posted at

OpenShift難民が自分用PaaSを作った話

More than 1 year has passed since last update.

個人ウェブサービスをOpenShift v2で無料運用していたのだが、残念ながら2017年9月でサービス終了の運びとなった。v3やHerokuではコスト的に複数サービスを回すのが辛いので、これを機会に自前のPaaSを構築することにした。


やりたいこと


  • 小規模な個人サービス4つを\1,000/月以内で運用

  • うち1つはRails+MySQL、1つはPHP+MySQL、残りはPHPのみ

  • git pushでデプロイ(OpenShift v2やHerokuと同様に)


IDCFクラウドでDokkuなら楽勝のはずが

条件に合う事例として、次の記事がすぐに見つかった。

IDCFクラウドで自分だけのHerokuを構築する

IDCFクラウドの最小構成は\500/月で安いし、DokkuはミニHerokuとして使えそうだ。この記事はIDCF公式のBlogでも紹介されていたこともあり、そのまま従っていけば楽勝だろうと高をくくっていた…のだが。

確かにDokkuの公式ドキュメントとこの記事を参考にしてスムーズにappを構築していけたのだが、3サービス目のappを立ち上げた所でストレージの空きが0%になってしまった。


何が問題だったのか

DokkuはHerokuと同様に、コンテナ管理にはDockerを使用している。そのベースイメージとしてherokuishを利用しているのだが、これが曲者で、なんとイメージサイズが1.35GBもあった。MySQLのイメージも400MB近いし、加えて色々な実験をするうちに15GBのストレージを全て食ったようだ。

なお、現状のherokuishはHerokuのイメージであるcedar-14をベースとしているが、最新のheroku-16では465 MBまでスリム化されているようだ。とはいえ、Dokkuでいつ採用されるかは不明であるし、採用されたとしてもDockerイメージとしてはまだ巨大なため、別のやり方を検討することにした。


どのように解決したか

Dokkuの公式ドキュメントにDockerfile Deploymentとあるように、自前のDockerfileもデプロイに使えるということで、試してみることにした。

今回はストレージを食わない事を優先したかったのと、複数コンテナの連携をうまくDokkuで実現できるのかという懸念があったため、邪道とは思いつつもPHP-FPMとnginxを同一コンテナで立ち上げる最小限のイメージを作ることにした。以下がそのDockerfileの内容である。

FROM php:7.1-fpm-alpine

RUN curl -sS https://getcomposer.org/installer | php \
&& mv composer.phar /usr/local/bin/composer \
&& docker-php-ext-install \
mbstring \
pdo_mysql \
&& apk add --update --no-cache \
nginx \
&& mkdir -p /run/nginx \
&& echo -e "#!/bin/sh\nphp-fpm -D\nnginx -g 'daemon off;'" \
> /usr/local/bin/php-nginx \
&& chmod +x /usr/local/bin/php-nginx

EXPOSE 80

CMD ["php-nginx"]

Alpine Linuxにしたこともあって、イメージサイズは70MBほどに収まった。なお、一応イメージはDocker Hubにも公開している。

このイメージをベースに(Railsのサービスについては既存イメージを使用)各appを構築したところ、特にハマる事も無くDokku上に展開できた。

気になるストレージの使用率は35%程度で落ち着いている。メモリーの使用率が80%近くなってはいるが、こちらはswapを1GB確保しているのでひとまずは問題無いだろう。


まとめ

安価なクラウドやVPSで自前PaaSを構築する事例は多々あり、いずれもメモリーを確保する事に注意を促しているが、実際に複数サービスを運用するとなると、留意すべきはむしろストレージの方であった。

Dokkuの場合、自前のDockerfileも使えるため、スリムなイメージを用意すればストレージの小さい環境でも複数サービスを運用できそうである。小規模な個人サービスを複数運用しているのであれば検討しても良いかもしれない。