全7378文字

コンテナを支えるLinux カーネルの機能

 コンテナはLinux カーネルのいくつかの機能を組み合わせて実現しており、「コンテナ」という単一の技術が存在するわけではありません。その機能のうち、主なものを紹介します。

namespace(名前空間)
 プロセスから見えるシステムリソースを他のプロセスから分離します。namespaceによって分離できるシステムリソースには、マウントポイント、プロセス ID、ネットワーク、ユーザーIDなどがあります。例えばコンテナは同一ホストOS上で動作していても、それぞれ異なるネットワークインターフェースやIPアドレスを持ちます。これらは、ネットワークのNamespaceにより実現しています。

cgroup(コントロールグループ)
 CPUやメモリー、ネットワーク帯域などのハードウエアリソースを、コンテナに割り当てたり制限したりします。仮想マシンと同様、「CPUを1つ、メモリーを2GB増設する」といった形で、ハードウエアリソースをコンテナに割り当てられます。

Capability
 root権限を細かく分け、必要な権限のみをプロセスやファイルに付与します。Capabilityはスレッドごとに設定されます。例えばコンテナでrawソケット(ネットワークプロトコルのヘッダー情報までアクセス可能なソケット)を使ってPingコマンドを実行したり、TCP/UDPポート番号1024 以下に対してプロセスをバインドしたりするのは、Capabilityによって実現しています。

Overlayfs
 Linux用のファイルシステムとして知られる「UnionFS」の実装の1つで、複数のイメージレイヤー(ディレクトリーやファイル)を重ね合わせて1つのファイルシステムとして見せます。同一ホスト上で動くコンテナ同士でイメージレイヤーを共有するため、全体のコンテナのデータサイズ(イメージサイズ)を小さくできます。コンテナが軽量と言われるのにはこうした背景があります。

 イメージレイヤーの更新にはCOW(Copy On Write)と呼ばれる仕組みを使っています。ベースとなるイメージレイヤーを読み取り専用として参照し、ここに含まれるファイルに対する書き込みが発生した際には該当のファイルをコピーして書き込みを行います。