サーバー仮想化を可能にした「ハイパーバイザー」という技術は、ITシステムの構築・運用に革命的な変化をもたらした。1台の物理サーバー上で複数のOSやアプリケーションを稼働可能にするハイパーバイザーは、パブリッククラウドの基盤技術として現在のITインフラに欠かせない存在となっている。その一方で、ハイパーバイザーとはタイプの異なる「コンテナ型仮想化」の技術が急速に発展し、注目を集めている。コンテナ型仮想化で現在主流となっているのがDockerであり、Dockerと連携して環境を管理するツールがKubernetesだ。今やコンテナ型仮想化の代名詞ともいえる、この2つのキーワードを今回は押さえよう。

サーバー利用・運用の可能性を大きく広げるコンテナ技術

 今回採り上げるDockerとKubernetesは、現代のシステム仮想化の中心ともいうべきテクノロジーだ。

 まずDockerだが、これはいわゆるコンテナ技術の1つで、現代ではコンテナといえばDockerと言うほどメジャーな存在になっている。コンテナ技術自体はDockerの登場以前から存在しており、サーバー仮想化を実現する上で重要な手法の一つとされてきた。

 そもそもサーバー仮想化で広く使われているハイパーバイザーは、同じサーバーの上にLinuxやWindowsといった複数のOSを稼働させ、少ない台数の物理サーバーでさまざまな機能やサービスを実現できるという技術だ。だがこうした物理サーバー上に仮想サーバーを構築する「仮想マシン型」の仮想化には課題もある。

 課題の1つは、仮想化のオーバーヘッドが大きいことである。仮想マシン型の仮想化では、仮想マシンごとにゲストOSを動作させる必要があり、さらにその下ではハイパーバイザーが動いている。ハイパーバイザーはハードウェアをエミュレーションするため、そこに一定のメモリーやCPUリソースが割かれる。さらに管理用のホストOSを動かす必要もあるため、純粋にアプリケーションのために使えるリソースが削られてしまう。

 また、仮想マシンごとにゲストOSが必要ということは、それだけ設定・管理の工数が増えることを意味する。仮想マシンの数が増えれば、その分だけ管理負荷が増大してしまう。

 一方、コンテナ型の仮想化では、ホストOS上にアプリケーションとアプリケーションの動作に必要な“つなぎ”の機能を含んだパッケージを作る。これがコンテナだ。コンテナ型では、そのアプリケーションの専用区画を直接ホストOS上に配置できるため、オーバーヘッドをきわめて小さく抑えられる。ホストOSをコンテナ間で共有するため、コンテナが増えても環境構築の手間は増えない。ただし、仮想マシン型に比べると、コンテナ型の環境自由度は低く、複数のOSを1台の物理サーバーで動かすといったことは基本的にできない。

 コンテナ型の仮想化にはもう1つ大きなメリットがある。オーバーヘッドが小さいので、仮想マシン型以上の高密度な集積が可能になることだ。この利点を活かして、コンテナ技術は主にマルチテナント・サービスなどに活用されてきた。

ビジネスドリブンなアプリケーション環境を提供するDocker

 今やコンテナ技術の主役とも言うべき地位を獲得したDockerだが、いったい他のコンテナとどこがどう違い、どのように優れているのだろうか。主なポイントを下に3つ挙げてみた。

(1)差分管理:簡単&スピーディにコンテナを作成できる

 従来の多くのコンテナ技術では、コンテナに格納するファイルをひと固まりにする必要があった。仮想環境のファイルシステムをイメージファイル化した場合、従来のコンテナ技術の場合は、1コンテナ=1イメージの関係になる。

 一方、Dockerは、イメージの重ね合わせに対応しており、1つのコンテナを複数のイメージに分割することが可能だ。コンテナの読み込み専用の雛形イメージの上に書き込み用イメージを重ねれば、雛形に変更を加えることなく、設定ファイルを編集したり、既存のファイルを置き換えたりすることができる。例えば、Webサーバーのマルチテナント・サービスを提供する場合、Webサーバー用の雛形イメージを1つだけ用意し、テナントの数だけ書き込み用イメージを用意すればよい。これはディスクスペースの節約になるし、雛形イメージにアップデートが必要になった場合の手間も大幅に減らせる。

 さらに差分管理は、アプリケーションの可搬性も大きく高める。Linuxはソフトウェアの依存関係に厳しいOSで、Ubuntu用のアプリケーション(バイナリ)がRed Hatで動かないといったことが珍しくない。これをDockerの差分管理機能を使って、Ubuntuのライブラリ環境のイメージAとUbuntu用アプリケーションのイメージBを重ね合わせれば、どのLinux環境でもアプリケーションが動くようになる。もちろん、イメージA(Ubuntuのライブラリ環境)は、別のアプリケーションのイメージCで再利用することもできる。既存のコンテナの一部を差分イメージで少しだけ変えて使い回すといったことができるので、新しいコンテナを作るたびに環境構築をする手間を大きく省ける。これは、アプリケーション開発に注力したい開発者にとって、開発効率の向上といったメリットを与える。

(2)Docker Hub:構築済みのコンテナを公開・共有できる無償サービス

 Docker Hubとは、ユーザーが作成したDockerのコンテナ・イメージをアップロードして公開・共有可能な無償サービスだ。ここで公開されているコンテナは、自由にダウンロードして利用することが許されている。

 Docker Hubで公開されているイメージに、自分が欲しいものとピッタリなものがなくても、上の差分管理機能で手軽に補完可能だ。

 すでに構築済みのコンテナが必要に応じてすぐに入手できるので、コンテナ開発のための環境構築にエネルギーを割かれることが少なくなり、アプリケーションそのものの開発に注力できるのはもちろん、システム開発の簡素化&効率アップが実現できる。

(3)マルチOS対応:WindowsやMacでもDockerが使える

 DockerはもともとLinuxのカーネル機能に依存した技術なので、Linux専用のコンテナとして利用されてきた。だが、柔軟で効率的な差分管理機能や、Docker Hubで登録されている豊富なイメージは、多のOSを使っているユーザーにも魅力的である。そこで、仮想マシン型の仮想化技術を組み合わせることで、WindowsやmacOS(Mac OS X)でも、Dockerコンテンを実行するための環境が、Dockerの開発を主導するDocker社から提供されている。

 これらを利用する場合、仮想マシン上でDocker専用の軽量なLinuxを動かすことになるので、オーバーヘッドが小さいというコンテナのメリットは薄れることになる。ただし、Dockerの台頭とともに比重が大きくなった「柔軟かつ迅速なアプリケーションのデプロイ環境」が実現されることになる。開発環境としてDockerを活用したい場合、OSを問わずにDockerが利用できる意義は大きい。

 なお、混乱を招きやすい点ではあるが、Docker社は近年マルチアーキテクチャ対応を進めており、Linux以外のOSでネイティブ動作するDockerも存在する。これを使うと仮想マシンを介さずに、例えばWindowsサーバー上でWindows用プログラムを格納したDockerコンテナを動かすことができる(Windows Server 2016とWindows 10 Aniversary Update以降で利用可能)。Linux用のイメージとWindows用のイメージに互換性はないが、異なるOS用のイメージをワンパッケージにまとめることが可能であり、Docker社がDocker Hubで提供しているオフィシャル・イメージは、すでにLinuxだけでなくWindowsやARM、IBM Zといった幅広い環境に対応している。ただし、ユーザーがDocker Hubで公開しているイメージは特定のOS用(主にLinux)のものが多い点には注意が必要だ。

Kubernetesとはコンテナを効率よく連携させる管理ツール

 さて、今回のもう1つのキーワードが「Kubernetes」だ。これは簡単に言うと、様々な環境で稼働する数多くのDockerコンテナを、効率よく管理するための“オーケストレーションツール”である。

 コンテナはアプリケーションの機能を実行環境と一緒に“箱”の中にパッケージした、いわば“アプリケーション機能の単位”だ。実際のサーバーの上では、さまざまな機能を提供するコンテナが無数に配置され、なおかつ新しく追加されたり不要になったものは捨てられたりする。

 Docker自体はこうしたコンテナの“作成・廃棄”の機能は持っているが、コンテナを効率よく配置したり、管理したりといった機能は備えていない。こうした文字通りオーケストラの指揮者の役割を果たすのがKubernetesというわけである。

 KubernetesはもともとGoogleによって始められたプロジェクトで、その後MicrosoftやRed Hat、IBMを始め多くのベンダーやディストリビューターが加わって、現在の一大勢力を形成するに至った。

 Kubernetesが提供する主な機能には、以下のようなものがある。

  • アプリケーション(サービス)に必要な複数のコンテナをまとめてデプロイメント(配置)
  • サービスの負荷に応じてコンテナを自動的に増減(スケーリング)
  • コンテナイメージの自動ビルドを実行
  • コンテナイメージのバージョン管理とロールバック(問題が発生したらすぐ前のバージョンに戻せる)
  • ハイブリッドクラウド、マルチクラウド対応(アプリケーションをプライベート/パブリックのクラウド間で自由に移動できる)
  • リソース利用率の監視と制限

 このように、現在のコンテナ環境において、Kubernetesが果たす役割は非常に大きい。コンテナによる「柔軟かつ迅速なアプリケーションのデプロイ環境」の実現には、Kubernetesのようなオーケストレーションツールが不可欠である。

コンテナ技術はDX時代に不可欠のアプリケーション基盤

 いささか駆け足ではあったが、ここまでの解説でDockerとその連携ツールであるKubernetesが、サーバーの仮想化と仮想環境におけるアプリケーション利用を効率よく、省コストに発展させてゆく上で不可欠のテクノロジーだということは感じていただけたと思う。

 一昔前のコンテナは、あくまで軽量&省リソースの仮想化基盤を構築するという、システムのインフラ層に限定された技術にすぎなかった。だがDockerとKubernetesによって提供される現代のコンテナは、世の中のビジネスをドライブするための柔軟なアプリケーション基盤にまで昇華されている。

 コンテナの作成・追加・削除が簡単で、さまざまなOS環境で稼働でき、システム間の移動も容易なコンテナは、まさにデジタルトランスフォーメーション時代のアクティブでアジャイルなアプリケーション開発・運用・管理基盤なのである。