コンテナを支える3つの技術 (Namespace, cgroup, Capability)
Namespace
ハイパーバイザー型仮想化における「物理サーバ」と「仮想サーバ」は、それぞれが1つの「サーバ環境」として位置づけられています。
しかし、コンテナ型仮想化では、1つのコンテナは「1つのプロセス」として扱われています。
各プロセスに対して、それぞれのシステムリソースを、他のプロセスと分離しているのがNamespaceという機能。
この機能によって、たとえば、コンテナAとコンテナBという2つのコンテナがあり、それぞれのコンテナ内に全く同じファイルZというものがあったとしても、「コンテナAのファイルZ」、「コンテナBのファイルZ」として管理されます。
このように、Namespaceによって、それぞれのコンテナが相互に隔離され、お互いに干渉せずに稼働させることが可能です。
cgroup
作業中にパソコンの動作が重くなるのを防いでくれるのがcgroupです。
動作が重くなる原因は、特定のプロセスに高い負荷がかかっていることによって、ホストOSに影響を与えているから。
cgroupの役割は、プロセスをグループ化して、CPUやメモリなど、ホストOSの物理的なリソースを分離し、プロセスが用いるCPUの使用率やメモリの割り当てや、デバイスへのアクセスを制御すること。
これにより、特定のプロセスがCPUやメモリリソースを大量に消費することを防ぎ、ホストOSやほかのプロセスに影響が出るといったリスクを抑えています。
Capability
Capabilityは、root権限を細かく分けて、プロセスやファイルに設定する機能です。
Capabilityがないとどうなるかというと、実行しているプログラムに脆弱性があった場合、rootユーザは動作するプロセスは全ての権限を持っているので、他のプロセスやホストOSそのものに影響を与えてしまうことに。
これを防ぐために、Capabilityはrootが持っている権限をバラし、rootの持つすべての権限を付与せずに、必要な権限のみを付与できるようにしたものです。
Discussion