概要
コンテナは、Linuxカーネルの技術をベースにLinux上の起動プロセスを隔離した状態で起動することです。
これを実現するためには複数の技術要素がありますが、コア機能としてはプロセス空間や名前空間の分離です。
Dockerの登場
概念としてのコンテナの登場は、プロセスコンテナ(process container)と呼ばれるLinuxカーネルに対するパッチセットとなります。
https://lwn.net/Articles/199643/ (2006/9/14投稿 Rohit Seth's container patch)
We use the term container to indicate a structure against which we track and charge utilization of system resources like memory, tasks etc for a workload. Containers will allow system admins to customize the underlying platform for different applications based on their performance and HW resource utilization needs. Containers contain enough infrastructure to allow optimal resource utilization without bogging down rest of the kernel. A system admin should be able to create, manage and free containers easily.
これは、Linux上のプロセスをコンテナと呼ばれる階層下にグループするための技術で、これらのプロセス群の周辺に壁を設けることがコンテナと呼ばれる技術の実装に該当します。
コンテナを実現するため、Linuxカーネルの「名前空間」と「cgroups」という機能を利用します。
どちらもプロセス間に壁を設け分離(isolate)ものですが、カバー範囲が異なります。
* 名前空間:プロセス間内で何が(ソフトウェア的に)見えるかを制限
* cgroups:プロセスグループが(ハードウェア的に)どれだけ利用できるかを制限
名前空間(namespace)
コンテナを区画化する仕組み
Linuxカーネルの名前空間(namespace)を制御して複数のプロセスが1つのマシン上にある1つのカーネルを共有可能にします。
その具体的な方法としてホスト上で実行するプロセス空間(ユーザー空間)を分離(isolate)しています。
Linuxカーネルのnamespace機能は、Linuxのオブジェクトに名前を付与することで下記の独立した環境を構築可能にします。
http://man7.org/linux/man-pages/man7/namespaces.7.html
namespace name | description | version |
---|---|---|
PID | 実行するプロセスIDの分離 namespaceの異なるプロセス同士は互いにアクセス不可 | Linux3.8- |
Network | ネットワークデバイス、ルーティングテーブル、ファイアウォールルール、ポートetcを分離 | Linux3.0- |
Cgroup | プロセスの名前空間を分離するためルートディレクトリを扱う | Linux4.6- |
IPC | System Vプロセス間通信(IPC:Inter Process Communication)とPOSIXメッセージキューを分離 | Linux3.0- |
Mount | マウントポイント、ファイルシステムを分離 | Linux3.8- |
User | ユーザーID(UID)、グループID(GID)の分離 | Linux3.8- |
UTS | ホスト名(unameおよびhostnameコマンドで取得できる名前)の分離 | Linux3.0- |
名前空間は、プロセスを分離するだけではなく、複数の名前空間を組み合わせコンテナとして様々な名前空間を隔離した状態のプロセスを実行可能にします。
cgroups(コントロールグループ)
リソース管理の仕組み
cgroup(control groups:コントロールグループ)は、リソース管理・リソースの集計/追跡を実施します。
これはLinuxカーネルの機能で、プロセスの集まりに対してリソース使用を制限/割当/分離しています。
※リソース:CPU・メモリ・ディスクI/O・ネットワーク
上記の技術の基礎となったのは、「プロセスコンテナ(Process Container)」2006年にLinuxカーネルに送られたパッチです。
さらに2007年に「Control Groups」への名称変更、2008年にKernel2.6.24で取り込まれたものです。
cgroupsでコンテナ内のプロセスに対してリソース制限をかけることで、例としてあるコンテナがホストOSのリソースを使いつくし、同じホストOS上で稼働している他のコンテナに影響を与えることを防止します。
cgroupsの主なサブシステム
項目 | 説明 |
---|---|
cpu | CPU使用量の制限 |
cpuacct | CPU使用量の統計情報を提供 |
cpuset | CPUやメモリの配置を制御 |
memory | メモリやスワップの使用量の制限 |
devices | デバイスへのアクセス許可/拒否 |
freezer | グループに属するプロセスの停止/再開 |
net_cls | ネットワーク制御のタグを付加 |
blkio | ブロックデバイスの入出力量制御 |
cgroupsは、階層構造を使用してプロセスをグループ化して管理できます。
名前空間とcgroups