2017.01.22   |   Docker

セットアップの複雑なアプリケーションをDocker化してみた

2年位前に作ったアプリケーションをDocker化してみたよというお話。

UniqueOGPというブログ用のシェア画像を自動生成する画像APIなのですが、サーバーサイドのNode.jsでCanvasを扱うために色々インストールする必要があり使いづらいものとなっていました。

関連: ブログのアイキャッチ、OGP画像をタイトルから自動生成してみる


ちなみにこんな画像がAPIで作れます。

Dockerならこういった依存関係をまとめてパッケージ化できるので、コマンド1,2行叩くだけで同じ環境を再現してアプリを動作させることができるようになります。

最近やっと使いこなせるようになってきたDockerの練習を兼ねて今回UniqueOGPのDocker化にチャレンジしてみました。

Docker化

このアプリケーションを動かす上で一番大変なのがNodeCanvasというライブラリのセットアップです。
サーバーサイドのNode.js上でブラウザのようなCanvasを描写するためのものなので、画像を扱う系のライブラリだったりをコンパイルして入れる必要があってかなりセットアップが大変です。実際2年前作ったときは依存関係とかに苦戦した記憶があります。

この部分を自分でDockerコンテナに詰めてもいいのですが、幸いNodeCanvasのセットアップをDocker化しているものがあったので、それをベースにアプリ用のDockerを構築することにしました。

Docker/node-canvas

Dockerだと他人のコンテナに自分のやりたいことを追加して実行環境を作れるのが便利ですね。
このイメージを取ってきたら、自分のアプリケーションをセットアップしてあげるだけです。

実際に書いたDockerfileは以下。

FROM geekduck/node-canvas

ADD src /opt/node/js

RUN ["/bin/bash", "-c", "npm install"]

RUN mv /opt/node/js/fonts/NotoSansCJKjp-Black.otf /usr/local/share/fonts/

EXPOSE 8088

ENTRYPOINT node index.js

https://github.com/pistatium/unique_ogp/blob/master/Dockerfile

自分のソースをコンテナに入れて、npm installして依存関係をダウンロード。
使うフォントを配置してアプリの起動スクリプトを実行するだけの構成です。

docker build -t pistatium/unique_ogp .
docker run -it -p 8088:8088 pistatium/unique_ogp

の手順でビルドして実行してあげればもうAPIサーバーの完成です。
ブラウザでDockerのIPの8088ポートへアクセスすれば文字に応じて画像を生成してくれます。
Docker最高ですね。

自動ビルド

今回DockerHubを使った自動ビルドにも挑戦してみました。

自動ビルドを使うとGitHubなどにソースコードをコミットしたタイミングで、指定したDockerfileをビルドしてDockerHub上にアップロードしてくれます。
つまりAPIとして使う側は

docker run -it -p 8088:8088 pistatium/unique_ogp

のように叩くだけで最新イメージを取得してアプリを動かすことが出来るようになります。

もちろん手動でDockerHubに上げることも出来ますが、変更あるたびに上げ直すのは手間ですし、使う側もどんなDockerfileをビルドして作られたイメージなのかが分かると安心できるので、積極的に自動化していきたいですね。

自動ビルドの設定はブラウザでポチポチするだけで出来るので説明は割愛しますが、登録時Chromeが応答不能に陥るのは何度やっても解せませんでした…。ブラウザ開き直すとちゃんと登録完了してましたが謎です…。

DockerHub pistatium/unique_ogp

もし興味があればPullして使ってみてください。

最近はAWS ElasticBeanstalkを使ってDockerイメージを本番環境で動かすようなことも会社で試しているので、この辺も時間あったらまとめたいです。