1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

コンテナ型仮想化技術の仕組み

Posted at

こんにちは。

前回の記事「Docker コンテナ構築入門」でDockerでのコンテナ構築方法を説明しました。
今回は__コンテナ型仮想化技術の仕組み__にフォーカスを当てた記事を書いていきます。

特徴とコンテナを構成するNamespace, cgroup, Capabilityについて説明します。

コンテナ型仮想環境

コンテナ型仮想環境は、仮想化技術の一種__です。
筆者は以前にOracle社のVirtualBoxを利用した経験があったため、VirtualBoxが該当するホスト型仮想環境と比較して説明します。
ホスト型は、仮想環境ごとにゲストOSを立ち上げるのに対し、コンテナ型は__ホストOSのカーネルを共有__して動作しています。
そのため、他の仮想化技術と比べ起動が__速く
、__軽量__に動作するといったメリットがあります。

環境比較画像

また、ホストOSと__独立した環境__を作成できるので、管理が楽といったメリットもあります。

コンテナを構成する代表的なLinuxカーネルの機能

結論から言うと、コンテナは複数の__Linuxカーネルの機能__を組み合わせて構成されており、「コンテナ」と呼ばれる単一の技術でできているわけではありません。

その中でも重要な以下の3つの要素を説明します。

  • Namespace "ネームスペース"
  • cgroup "コントロールグループ"
  • Capability "ケイパビリティ"

Namespace

__Namespace__は、プロセスが参照するプロセスIDやマウントポイントなど、カーネルリソースを他のプロセスと分離し、ファイルツリーなどが独立したOS環境のように見せる機能です。

日本語では__名前空間__とも呼ばれています。

Namespaceはすべてのプロセスに関連付けられており、デフォルトでは親プロセスと同じNamespaceを参照します。そのため、同じNamespaceに存在する__関係のないプロセス__や__リソース__まで参照できてしまい、__ファイルツリーの干渉__や__マウントなどのファイルシステム__に__影響__を与えてしまう可能性があります。

そこでコンテナは、新たなNamespaceを関連付けることで、__コンテナ内のリソースだけ見えるように隔離__しています。

なお、Namespaceには__7つ__種類が存在し、それぞれ隔離できるリソースは異なります。

名前空間 定数 分離対象
IPC CLONE_NEWIPC System V IPC, POSIX メッセージキュー
Network CLONE_NEWNET ネットワークデバイス、スタック、ポートなど
Mount CLONE_NEWNS マウントポイント
PID CLONE_NEWPID プロセス ID
User CLONE_NEWUSER ユーザー ID とグループ ID
UTS CLONE_NEWUTS ホスト名と NIS ドメイン名

ちなみに、Dockerを介さずLinuxコマンドでNamespaceを作成する方法は、こちらにまとめてあります。
unshareコマンドで、Namespaceを作成してみる

cgroup

__controll group__の略です。

cgroupはプロセスを__グループ化__し、グループ化したプロセスに対して__リソースの管理__を行う機能です。

例えばホストが持つCPUやメモリなどの__リソースを制限__することができます。
そうすることで、あるプロセスが多くのCPUやメモリを消費し、動作が遅く不安定になったり、他のプロセスが強制終了したりといったことを__抑制__することができます。

image.png

cgroupは具体的に、

  • CPU時間・メモリ使用量の制限
  • デバイスのアクセス制御
  • ネットワーク優先度の設定
  • 各リソースの使用量の確認

などといった事ができます。

Capability

通常プロセスは、__特権(root権限)__あるいは__一般ユーザ権限__で動いています。
特権が必要になるのは、

  • 特権ポート(<1024)を使用する場合
  • ネットワークの疎通確認に良く使う$pingコマンドなどのように__Rawソケット__を使用する場合
  • $ntpdなどで__システムの時刻を設定__する場合

などが該当します。

しかし、上記のようなプロセスを実行する際に特権すべてを与えてしまうと、プロセスに__脆弱性__があった場合に、不正な操作によりプロセスが持っている権限を悪用され、__システムに悪影響を与える__可能性があり、セキュリティの観点であまり良くありません。

それに対し、特権をさらに__細分化__し、プロセスに特権すべてを与えるのではなく__最小限にする__ことで、脆弱性が発見されて悪用されたとしてもそのプロセスが必要とする最小限の権限しか奪われないため、__被害の範囲を狭める__ことができます。

この__細分化した特権__が__Capability__です。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?