こんにちは、村田です。
本日は、「コンテナとは?」を改めて解説してみたいと思います。
コンテナ技術が注目され始めたのは2017年頃でしたでしょうか。その頃よりDockerを中心にコンテナ技術に関わり様々なところで講演を行ってきました。当初は、「コンテナとは?」「Dockerとは?」を解説していましたが、最近では知っている方も増えてきていたことから解説する機会も減っていました。技術が広まると、それを活用する企画や関連する商材なども広まり初め、エンジニア以外の方の耳にも入るようになっているのではないかと思います。
そこで、改めて「コンテナとは?」から「なぜコンテナが使われている?」までをご紹介したいと思います。
コンテナとは?
「コンテナ」という言葉から皆さんは何を連想しますか?
身近なところでは食材を保管する容器の「コンテナ」や貨物を運ぶための「コンテナ」を思い浮かべる方も多いのではないかと思います。どちらも同じ「コンテナ」であり、その特長は共有したものがあげられます。
- 規格が定められている
- 可搬性に優れている
- 様々な場所で使える
- すぐに使える
身近なところの食材を保管するコンテナがイメージしやすいと思うので、まずはその特長をもとにコンテナのメリットを想像してみてください。
コンテナ容器を使うことで同じ型の商品なら重ねて管理ができスペースを有効活用出来ます。また持ち運びしやすくお弁当にもコンテナ容器を利用する方もいるかと思います。そのまま利用するほか、冷凍や冷蔵ができて、電子レンジで温めたり、自然解凍させることですぐに使える。などの便利な点も使ってる方は理解があるかと思います。
ITシステムで使われる「コンテナ」技術もこれと同じような特長を持っている技術になります。
実は古くから使われているコンテナ技術
コンテナ技術は最近出てきた技術と思われる方も多いかと思いますが、古くからシステムに関わっている方、特にUNIXを使っていた方には馴染みのある技術になるかもしれません。
1979年よりUNIXにて実装がはじまった「chroot」が起源と言われていて、アプリケーションやユーザーのアクセス権限を特定のディレクトリ以下(ルートディレクトリの変更)に限定することで、プロセスを分離する技術がベースになっています。ルートディレクトリが指定したディレクトリに変更されるため、不正侵入を受けた場合にもそのディレクトリより先へのアクセスが行えないためセキュリティ面での利点もあります。新しい技術だから不安だと言う方もいるかもしれませんが、実はコンテナ技術は長く利用されている枯れた技術とも言えます。
コンテナの普及
古くから利用されてきたコンテナ技術ですが、利用が拡大したのは最近の事になります。仮想化技術の登場によりハードウェアリソースを効率的に利用できる仮想化は多くの企業が利用しており、現在もシステムの多くが仮想基板上に構成されています。しかし、仮想化技術にはハードウェアからエミュレーションしなければならず、そのオーバーヘッドと仮想イメージ自体もOS部分を含むために最小限の構成にしたとしてもサイズはそれなりに大きくなってしまうという課題もありました。
この課題を解決できる技術としてコンテナ技術は利用が拡大するようになりました。特に軽量であり可搬性に優れているという特徴はクラウドネイティブアプリケーションの思考にマッチし、現在では標準的に利用されるまで浸透してきています。
コンテナはコンテナランタイムによりOSレイヤから分離され、コンテナイメージ上にはライブラリとアプリケーションのみがイメージ化されるため、コンテナイメージは非常に軽量に作ることができます。また、ハードウェアのエミュレーションは行っていないのでオーバーヘッドが発生することもありません。ハードウェアリソースを効率的に利用することができるため、集約率も向上させることができるとも言われています。つまりコスト削減にもつながるわけです。
コンテナの普及を説明する上で、Dockerのことは説明しなければなりません。Dockerはこれまでのコンテナ技術がコンテナを実行できるだけであったのに対し、コンテナの作成とビルド、イメージの配布、バージョン管理のプロセスを容易にする仕組みを提供したことが広く使われるようになった要因となります。
本番環境での不安を解決したKubernetes
コンテナの利用が拡大するなか、Dockerだけでは本番環境で利用することの難しさがありました。
本番環境では、アプリケーションを実行しダウンタイムが発生しないように、コンテナを管理する必要があります。例えば、コンテナがダウンした場合、他のコンテナを起動する必要があります。このような動作がシステムに組込まれていると、管理が簡単になるのではないでしょうか。
そこを助けてくれるのがKubernetesです。
Kubernetesは分散システムを弾力的に実行するフレームワークを提供してくれます。アプリケーションのスケーリングとフェイルオーバーの面倒を見てくれて、デプロイのパターンなどを提供します。また、Kubernetesはシステムにカナリアデプロイを簡単に管理することもできます。
Kubernetesは以下を提供
- サービスディスカバリーと負荷分散
- ストレージ オーケストレーション
- 自動化されたロールアウトとロールバック
- 自動ビンパッキング
- 自己修復
- 機密情報と構成管理
Dockerだけでは、「大規模に利用する」や「本番環境で利用する」が難しかったところが、Kubernetesの利用により解決されます。
現在の新たな価値を創造するためのアプリケーション(SoEやMode2などでも表される)では、Kubernetesの利用が拡大していると言われているが、その背景には軽量で可搬性に優れたコンテナ技術があり、それらを大規模に展開できるオーケストレーションが求められてた結果であるとご理解いただけたらと思います。
今後は、このコンテナプラットフォームを活用したソリューションや、実際に使う場合の具体的な構成や利用シーンなどにも触れていきたいと思います。