Skip to content

1-5. 改めて: コンテナって何だ?

コンテナの正体

さあ、ここまでの基礎を理解していれば、冒頭のコンテナの定義が何を示しているか理解できるはずです。

プロセスツリーのある枝から先を、Namespaceやchroot/pivot_root、cgroupなどの機能を使って隔離して実行したもの

コンテナのイメージ

図のようにプロセスを隔離すれば、その子プロセスを含めたプロセスグループコンテナとして振る舞うのです。
言い換えれば、あるプロセスに対して

  • Namespaceでリソース管理をホストと分ける
  • chroot/pivot_rootでルートディレクトリを変更する
  • cgroupで計算リソース制限をかける
  • その他Seccompなどセキュリティ面の制限をかける

などの処理を施せば、それはもう立派なコンテナなのです。

コンテナイメージ

コンテナを便利に扱うために発明されたのが、コンテナイメージという概念です。

コンテナイメージは、構築したいコンテナの/配下のファイル群をひとまとめにしたものです。
ハンズオンパートでもやりますが、このイメージの中にあるファイルを任意のディレクトリに展開し、そのディレクトリをchroot・pivot_rootを使ってルートディレクトリに指定することで、同じ環境を持ったコンテナを様々な場所で複製・再現できます。
これによって、動かしたいソフトウェアのバイナリと、動かすための環境を一緒に配布できるのです。

コンテナイメージ

もちろん、ただファイルを圧縮しただけのzipやtarとは異なり、効率の良い保存・転送のためにレイヤーに分けてデータを持っていたり、対応しているCPUアーキテクチャ等をメタデータとして持っていたりします。
これらイメージの中身は、各種コンテナランタイムやコンテナレジストリ (イメージの保管庫) で互換性を保つことができるよう、OCI Image Specという共通規格が定められています。
興味が湧いたらぜひ見てみて下さい。

なぜ様々なOSのイメージが存在するのか

ここまできてようやく、皆さんが良く抱く疑問「コンテナのOSはLinuxだけと言われているのに、なぜUbuntuやAlpine、CentOSなど『様々なOSのイメージが存在するのか」に答えることができます。
1-2で説明した、カーネルとOS (ディストリビューション) の関係を思い出してください。

OSとディストリビューション

コンテナを構成するプロセス管理/プロセス隔離の機能はLinuxカーネルが提供しています。
すなわち、コンテナの作成処理には、カーネル以外関係ないのです。

また、各ディストリビューションをそれたらしめているのはシェルやコマンド、ライブラリといったカーネル以外の部品であり、これらは全てファイルとして提供されています。
すなわち、ディストリビューションが配布しているファイル群そのままコンテナイメージにすれば、ホストのカーネルの上で動くプロセス (コンテナ) が異なるディストリビューションを動かすことができるのです。

ただし、コンテナの作成処理にはLinuxカーネルが必要なため、LinuxカーネルをベースとしないOS (WindowsやmacOS) をコンテナで動かすことはできません

コンテナランタイムに求められる役割

プロセスを隔離し、コンテナに仕立て上げるのがコンテナランタイムの仕事です。
しかし、それだけでは便利で実用的なコンテナとはなりません。

今のコンテナを取り巻くエコシステムが複雑に見えるのは、コンテナを便利に扱うため、様々な個人・団体が努力を重ねてきた証なのです。
次節では座学編のまとめとして、コンテナランタイムの歴史と今のエコシステムについて学んでいきましょう。