はじめに

マイクロサービスアーキテクチャで設計されたシステムを開発をしていると、複数のサーバーをもっと自由に使って試すことができたらいいなと感じることがあります。

実際の運用においては複数サーバーにそれぞれサービスを立ち上げて、相互にやりとりさせることでシステム全体を構築することになります。ところが開発中は開発者のPC一台が実行できる環境で、テスト用に本番と同じ数だけサーバーを用意できることはそう多くないと思います。

そうすると、開発中には問題にならなかったことに複数サーバーにデプロイして初めて気がつくことがあります。そもそもー台だけでは正しくテストできないものもあるでしょう。

そこで、1台のコンピューター上でも複数のサーバーでの動作を模倣させたくなります。そうです、仮想化です。

そこで、今回は仮想化技術の中でもDockerを利用することにして、sbtのプラグインで簡単にDockerイメージを作成し、sprayで作った簡単なRESTサービスをDockerを使って動かしてみることに挑戦してみましょう。

前提

動かす内容は去年「sprayを使って簡単なREST APIを構築する」という記事を書いたので、ここで作ったRESTサービスをそのまま使いましょう。

Dockerは最近Docker for Macが使えるようになったので、これを使うことにします。
そもそもDockerってなに?って方はちょっと古いですが過去にDockerに関する記事も書いているので、そちらを参考にするか最新情報を是非検索してみてください。
過去記事:今日から始めるDocker

Dockerやsprayに関する話は省略するので、そちらが不安な人は去年の記事もぜひ読んでみてくださね。

RESTサービスの作成

まずは全体のファイル構成はこんな感じ

ちなみに過去記事と違い Build.scala にしてみました。地味に.sbtの時よりトラップが多くて辛かったです。

まずDockerイメージの作成ができるプラグインを追加しておきます。ちなみにこの sbt-native-packager は何もDockerイメージを作るためだけのものではありません。ここでは紹介しませんが他にも機能があります。

そしてこれが Build.scala です。

注目したいのは .enablePlugins でいくつかのプラグインを有効化しているのと、
.settings
でdocker向けの追加設定を行っている点です。
必須なのは JavaAppPackagingDockerPlugin なんですが、alpineを使いたかったので AshScriptPlugin も入れてashに対応させています。
設定には他にもいくつかありますが、ここではalpineへベースイメージの変更のみを行っています。

Main.scala はほぼそのままですが、interfaceだけ 0.0.0.0 へと変更してます。Dockerで実行した際に localhost では繋がらなくなってしまうので、hostに関係なく処理をするようにしています。

こちら二つは以前の記事から変化なしです。

Dockerイメージの作成

では早速Dockerイメージを作ってみましょう。

を実行します。コンパイルが行われたのち、Dockerfileが生成されてDockerイメージの作成が行われます。出来上がるイメージは rest_sample:1.0 になりました。どうやら name:version となるようです。

実行

実行するときにはポートフォワードを設定してやる必要があります。REST自体は 8080 をlistenしているので、そこにホスト側の 8070 をつないでやりましょう。

これで http://0.0.0.0:8070/ping にアクセスしてみましょう。どうでしょう? PONG が返ってきましたか?

最後に

どうでしょうか?意外と簡単にDockerで動かすことができたんじゃないでしょうか?

実際のアプリケーションを動かすためには、Dockerで動かすことを前提とした設計をする必要があります。むしろそっちの方が大変なのですが・・・ここがうまくいけばマイクロサービスアーキテクチャの旨味をさらに引き出すことができるでしょう。

弊社ではまだ本番運用にDockerを持ち込むところまでは至っていないのですが、うまくいけばBlue-Green Deploymentなんかにもつなげることができると思い、現在も様々な検証を続けています。

マイクロサービスアーキテクチャやScala、あるいはDockerやBlue-Green Deploymentにに興味があるエンジニアの皆さん。弊社では世界に展開する自社メディアを育てたいエンジニアを積極的に募集中です。少しでも興味があればぜひお気軽にお声がけください。インフラとの垣根なんてもったいないです。興味がある分野にはどんどん挑戦できる環境で、一緒にいろんな事試していきましょう!