Docker の特徴

Docker が誕生する前から様々な仮想化のためのソフトウェアや製品がありました。 VMWare の製品や VirtualBox, KVM, Xen, Hyper-V これら以外にも様々なものがあります。

上記のような仮想化の製品はアプリケーションレベルで OS を動かすもの(VMWare Playerなど)や、 HyperVisor (VMWare ESXiなど)と呼ばれるものが主流です。 アプリケーションによる仮想化は仮想マシンを動かすためのレイヤーが多いためオーバーヘッドが大きいですが、Windows や Mac といったユーザが直接操作する機器上で直接 VM を使えるためユーザの利便性が高いです。 一方、HyperVisorによる仮想化はOSそのものが仮想化のために設計されているため、アプリケーション型に比べてオーバーヘッドが小さいという利点があります。 こちらは一般的にサーバー仮想化や仮想デスクトップといった業務目的での利用されます。

上記仮想化方式の仕組みを以下に図示します。

Docker は上記のアプリケーションレベルでの仮想化や、HyperVisor レベルでの仮想化と根本的に異なる仕組み(レイヤー)で仮想化を実現しています。

そもそも Docker では上記のような Virtual Machine を使わずに、ひとつの OS(Kernel) を複数の実行環境(名前空間)に分離して利用しています。 そのためユーザから見たらホストOS(仮想マシンを動かす土台となるマシン)の上で複数のゲストOS(ホストの上で動く仮想マシン)が動いているように見えますが、Kernel から見るとOSそのものを仮想的に動かしているというよりも、複数の「グループ分けされたアプリケーションレベルのプロセス」が動いているだけのように見えます。

このカーネルから見て分けられた空間のことを「名前空間(name space)」と呼んでおり、コンテナはそこで動くプロセスの集合のような存在です。 名前空間が分けられているので、コンテナ間は互いに相手が見えておらず、コンテナ上のアプリケーションにとってはそのコンテナ自体が OS であるかのように見えています。

HyperVisor と Docker のアーキテクチャの比較図を以下に記載します。

アプリケーションとしての Docker

上記図を見てもらうとわかりますが、コンテナだけでなく、Docker (コンテナの管理プロセス)自体もホスト上のアプリケーションレベルで動作しています。 Docker 自体は Linux にもともとある仮想化関連の技術を組み合わせるとともに、それらを管理する機能を提供しています。

Docker が使っている技術

上記で述べたように Docker はコンテナによる仮想化方式を提供していますが、それは Docker がフルスクラッチで作ったものではなく Linux で使われているいくつかの技術を利用して作られています。

利用されている機能の代表的なものは以下となります。

  • LXC (Linux Container)
  • namespaces(プロセスの分離)
  • cgroups(コンテナのリソース制御)
  • AUFS(コンテナイメージの差分管理)

これらの機能は Linux で提供されるものを使っているため、当然ながらそれを提供する Kernel のバージョンに依存しています。 古いバージョンの kernel ではこれらの機能が提供されていない可能性があり、その場合は Docker を利用できません。

新しいホストOS で Docker を利用するだけなのであれば上記の技術に関して特に深く意識をする必要はないと思います。

Git Hub と Docker