コンテナがもたらすメリットとは
「コンテナは普及しつつあるステージにある」
こう語り、野原氏のセッションはスタートした。
Dockerをはじめとするモダンなコンテナアーキテクチャは、「非常に軽量」「ポータビリティ性が高い」などの特徴がある。軽量であることから、起動も非常に高速で、開発やテストの高速化が可能になる。またポータビリティの高さは、依存関係を含めてパッケージングされているため、これにより「環境依存による不具合を削減できる」と野原氏は言う。
これにコンテナオーケストレーターを加えると、デプロイメントのコードがYamlやJSONになり自動化しやすくなる。オートヒーリングにより運用の簡略化、さらにはスケールアウト・スケールインの自動化などが可能になる。「従来、人の手でやっていた作業を自動化して効率化することが可能になる。Docker社がBuildやShip、Runに納めることができると言っていることが実現する」と野原氏は説明する。
また、コンテナはDevOpsとの親和性が非常に高い。例えば、Flickrは「早期にリリースし、頻繁にリリースする」ということを実践していた。これを可能にしていたのが、「DevとOpsが協力しようという取り組みだった」と野原氏は話す。それを可能にするために、Flickrではキーとなる10項目を挙げている。これらの項目はツールやテクノロジーによるものと、企業文化によるものに大別されている。
ツールやテクノロジーによる取り組みとしては、「1.インフラの自動化」「2.一元管理されたバージョンコントロール」「3.ビルドからデプロイまでのオペレーションの自動化」「4.機能の無効化/有効化」「5.明確な指標の共有」「6.通知の自動化」が挙げられる。
これを現在に置き換えると、インフラの自動化であればInfrastructure as Code(IaC)、一元管理されたバージョンコントロールであればGitや成果物管理の仕組み、ビルドからデプロイまでのオペレーションであればCI/CDツール、機能の無効化/有効化であればブルー・グリーンやカナリアリリース、Circuit Breakerなどの方法が該当するわけだ。
一方、企業文化による取り組みについては「リスペクト」「信頼」「問題発生時のあるべき対処」「責任追及の排除」といった項目を挙げている。
「つまり、DevOpsは開発から運用までのプロセスにおいて無駄を排除したり、効率化したりする活動で、特定のプロセスや手法ではないということ。そしてDevOpsは、多くのケースにおいて継続的改善を行うために取り入れることが多い」と野原氏は指摘する。つまり、DevOpsとはビジネス課題に対して迅速なアクションを取ることができるチームをつくることであるというわけだ。
DevOpsによってもたらされる主なメリットは、無駄の排除や業務の効率化が実現すること。「新しいサービスを市場にいち早く投入できることで、先行サービスの優位性が得られます。また、より多くのフィードバックも得られるため、品質の改善やエクスペリエンスの改善ができ、競争力強化につながります」(野原氏)
DevOpsでは、ツールを使って次のようなモダンな開発環境を構築することが求められる。ビジネス要件に対して開発者がコードをコミットしGitにアップ、そのコミットしたコードに対してCI/CDツールが動いてビルド・テストをする。その結果に問題があれば通知を開発者に送り、開発者は修正したコードをGitに入れる。CI/CDツールでのテスト結果に問題がなかった場合は、デリバリ/デプロイを行う。デリバリされたプログラムは、ユーザーからフィードバックを受け、それが新たなビジネス要件になるのだ。
だが、このようには簡単にことは進まない。CI/CDツールでは動いたのに本番環境では動かないなどの問題が発生するという。「なぜか環境依存の問題はすごく多い」と野原氏は指摘する。この問題を解決できる手法としてコンテナ化は非常に有効であるそうだ。
コンテナ環境ではカナリアリリースも容易に自動でできる。例えば、Webアプリケーションを2つのコンテナにトラフィックを半々に分けて提供する仕組みを構築していたとする。新しいバージョンのWebアプリケーションを開発者がコミットすると、CIツールがそれをフックしてコンテナにデプロイする。新しいバージョンのコンテナにトラフィックの10%を振り分けるようトラフィック比率を変更し、一定時間経過後にエラーレートを確認。そこで問題がなければ、古いバージョンを消去し、従来通り新しいバージョンを2つのコンテナにトラフィックを振り分けてユーザーに提供するという仕組みが完成する。こういったことができるのもコンテナが軽量だからだ。