クラウドを扱うエンジニアの皆さんが時々触れる用語に「コンテナ」という言葉があるかと思います。業務の効率化や提供サービスの充実化などを目指してコンテナ型仮想化を導入する企業も増えてきましたが、コンテナとは実際何なのでしょうか?また、どのようなメリットがあるのでしょうか?
コンテナという用語を聞いて、一般的にイメージされるのは港や空港におろされる大きなサイズから小さいサイズまである四角い立方体の箱のようなものではないでしょうか?箱はサイズによって様々なものを運ぶ貨物輸送用の「入れ物」の役割を担っており、1隻の船や1機の飛行機で色々なものをまとめて運ぶために活用されています。
今回ご紹介するコンテナもある種の「入れ物」ですが、ITに関わるコンテナとは一体何なのでしょうか?
コンテナ型仮想化とは?
「コンテナ」とはアプリケーションの起動に必要なアプリケーション本体やライブラリ、設定ファイルなどをひとまとめにしたもので、その「コンテナ」をホストOSの中で仮想的に分離して使える技術です。
コンテナは仮想化技術の1つですが、「仮想化技術」と聞いて一番イメージされるのはハードウェア上に仮想化用のソフトウェア(ハイパーバイザー)をインストールし、作成された見かけ上のサーバー(仮想サーバー)ごとにゲストOSやミドルウェア、アプリケーションなどを用意することで複数のサーバーを仮想的に構築する方法だと思います。一般的にはサーバー仮想化技術(ハイパーバイザー型仮想化技術)と呼ばれています。仮想サーバー上のアプリケーションを実行する際はそれぞれのゲストOSを動かさなくてはいけないので仮想サーバーごとにプロセッサやメモリ、ストレージなど多くのリソースが必要となります。
では、コンテナはどうでしょうか?コンテナはホストOS上に構築されているので、ゲストOSを起動する必要なくアプリケーション実行環境を構築することが可能となっています。そのためリソースの消費も少なく、さらに仮想サーバーと比較して起動時間も短くなります。また、既にアプリケーションやミドルウェアの稼働確認が行われているコンテナを他のサーバーにスムーズに移動し、実行に移すことも可能です。その点、仮想サーバーの場合は実行環境が変わるたびに設定確認をする必要があるのでコンテナよりも時間や人的コストが発生するでしょう。
サーバー仮想化技術とコンテナの違いは構造図で比べると理解しやすいかもしれません。
一見サーバー仮想化技術よりもコンテナの方が勝っているのではないか?と思いがちですが、一概にそうとは言えません。というのも、仮想サーバーを利用した場合、それぞれのOSを起動させるので1つの独立したサーバーとして機能します。仮想サーバーごとに異なるOSを動かせるので自由度の高いアプリケーションの構築、運用が可能になるのです。一方コンテナは1つのOSから作られているため、複数のコンテナに対するOSは同じとなり限定的になってしまいます。例えば、WindowsOS上でLinuxコンテナを動作させることはできません。勿論、逆もまた然りです。
AWSクラウドアーキテクチャの基本として、障害を考慮した設計やセキュリティ、スケーラビリティの考え方・実装について具体的な例を用いながらベストプラクティスを紹介したセミナーの講演資料です。
コンテナのメリット・デメリット
メリット
・アプリケーションやライブラリなどがまとまっているので、様々な環境での開発とデプロイが簡単にできる
・アプリケーションの障害発生時、スムーズに代替環境へ移行が可能
・システムリソースの負担が最小限で済む
・処理が軽量で起動時間も早いのでコスト低減とパフォーマンス向上が望める
デメリット
・コンテナ環境でベースとなるOSを異なったOSのシステムで動かすことが出来ない
・比較的新しい技術のため、学習コストが高い
コンテナは便利な反面、仕組みや管理の難易度が高くなります。アプリケーションのパフォーマンスを維持するためには管理やメンテナンスを適宜行わなくてはいけませんので、サーバーやアプリケーションの知識だけでなく、コンテナについての知識を身につけておく必要があります。またホストOSやコンテナ、アプリケーションなどをシームレスに管理できる状態にしておきましょう。
技術支援・コンサルティングサービス
コンテナが注目される理由
今現在、コンテナが注目されるのは何故なのでしょうか?
それは多くのソフトウェアがマイクロサービス化しているためと考えられます。マイクロサービスとは「アプリケーションのシステムを小さなモジュールごとに分割、独立して開発し、連携させることで全体システムを構築する」方法です。マイクロサービスを取り入れることで一見複雑で大規模なアプリケーションも安全且つスピーディに開発することができます。
マイクロサービスはそれぞれモジュールごとに異なる開発基盤を利用する場合が多いですが、コンテナを利用したモジュールを用意することでお互いの環境に影響されることなく開発が進められます。
仮想サーバーでも上記のようなことは行えますが、仮想化サーバーにはゲストOSやハイパーバイザーなどが介在しているため、セットアップなど環境構築に工数が多く発生してしまいます。その面、コンテナならスムーズに構築ができるのでマイクロサービスと相性が良いのです。
コンテナ型アプリケーション実行用プラットフォーム「Docker」
コンテナについて調べていると出てくる用語に「Docker(ドッカー)」というものがあります。これはDocker社が開発している、オープンソースのコンテナ型仮想化ソフトウェアです。コンテナ型仮想化ソフトウェアの中で一番メジャーなソフトウェアだと言えるでしょう。
Dockerが選ばれる理由として、まず導入が簡単であるということが挙げられます。メンバー全員が手軽に同じ環境を手に入れることができるので開発フローに取り入れやすくなります。また、軽量でスピーディーな開発ができることもDockerを導入するメリットの一つです。軽量なので立ち上げるスピードも圧倒的に早くなり、開発に集中することが可能となります。さらにDockerコンテナは、ホストOS上のシステム領域に影響を及ぼしません。Dockerコンテナではカーネルは共有していますがユーザ領域が完全に分けられているためDockerコンテナ上で環境を変えた場合でもホストOSには一切影響しません。
「Kurbernetes」とは?
「Kurbernetes(クバネティス、またはクーベネティス)」は、一言で説明すると「複数の異なるサーバー間でコンテナをやり取りするためのシステム」です。
コンテナの活用が進んでくると複数の環境にそれぞれ複数のコンテナを置く必要がでてくると思いますが、Dockerにはそれらを効率良く管理したり、組み合わせたりする機能が備わっていません。そこで利用できるのが管理や自動化に活用できる「Kurbernetes」です。この仕組みは「コンテナオーケストレーション」と呼ばれています。Kurbernetesはコンテナのプラットフォームとして実行やスケーリング、監視などの機能が備わっており、それぞれのコンテナの司令塔のような役割を担っています。複数のDockerを管理する工数を削減するため導入されています。
昨今注目を浴びてきているコンテナですが、サーバー仮想化技術とのメリットやデメリットをよく把握した上で用途に応じて使い分けられるとよいでしょう。
▼ AWSに移行しただけでは正常に稼働し続けません。運用最適化のためのベストプラクティスをご紹介!