TenForward

技術ブログ。はてなダイアリーから移転しました

コンテナの歴史と Linux カーネルのコンテナ関連機能についての割とどうでも良い愚痴

この記事は Linux Advent Calendar 2014 の 18 日目のエントリとして書いています。

Docker が盛り上がって、Docker が使ってる「コンテナ」という技術が盛り上がって、Doker の解説がそこら中にあふれるようになったので「Docker? そんなの FreeBSD が jail でずっと前からできてたぞ」というちょっと的外れな発言を見かけることは少なくなりました。一方でコンテナの歴史を追って見る的な企画をみかけるようになりました。

みかけた歴史の解説でいくつか「ちょっと違うやろー」というものを見かけたのでここで愚痴ります。

コンテナの歴史として大体書かれているのが

1979 年 chroot(2) システムコールの Version 7 Unix への導入
1983 年 chroot(2) システムコールの 4.2BSD への導入
2000 年 FreeBSD jail が FreeBSD 4.0 に導入
2005 年 Solaris Containers 登場
2008 年 Cgroup が Linux カーネル 2.6.24 にマージ
2014 年 Docker 1.0 リリース

というものです。

もちろん「chrootFreeBSD jail → Linux のコンテナ」という大きな流れを否定するつもりはありません。しかし、前述の年表のようなものにはかなり違和感を覚えます。

しかも私が見たいくつかの記事では「FreeBSD jail (相当|と同様) の機能として cgroup が実装」「ここで初めてLinuxにコンテナの機能が実装された」というような説明がなされています。つまり「FreeBSD jail≒Linux Cgroup≒Linuxカーネルに実装されたコンテナ」というわけですな。これはおかしい!!

どこが!? そう、LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術:連載|gihyo.jp … 技術評論社 を読んでいただいている方はおわかりいただけるのではないでしょうか!? (宣伝)

Linux カーネルに実装されているコンテナ関連の機能

Linux カーネルに実装されているコンテナ関連の機能の主要なものは大きく 2 つあると言えるでしょう。もちろん Cgroup はその一つです。しかし Cgroup だけではコンテナは実現できません。

ここでその 2 つの機能のおさらいです。

Cgroup
コンピュータに備わる物理的なリソース(cpu, memory, etc)を隔離/制限するための機能
Namespace(名前空間)
カーネル/OSが扱うリソース(ホスト名、ネットワークスタック、PID、etc)を隔離するための機能

そう、この 2 つです。なんで Cgroup だけが取り上げられるん? (もちろんこの2つの他にも使っている技術は様々あります)

そもそも前述の流れだと FreeBSD jail からの流れになっており、FreeBSD jail 相当の機能として Cgroup となっています。FreeBSD jail ってディレクトリツリーとかプロセスとかネットワークスタックとか (これは Vimage か) の隔離ですよね?

この流れからいくと取り上げるべきは Cgroup ではなく Namespace じゃないですか? 今の所 6 つある Namespace のうち、最初にカーネルにマージされたのは Mount Namespace で、なんと 2.4.19 でのマージです (2002 年)。*1

jail 相当とも言える PID Namespace が導入されたのは 2.6.24 で 2008 年なので、前述の年表で「Linuxのコンテナ機能がとりあえず実装されたとき」として 2008 年を取り上げるのは問題ないと思いますが、jail に対応する機能としては Namespace を取り上げるべきなのです

歴史を語るのは重要なんですが、ちゃんと機能を理解して書いてほしいなあというわりとどうでもよい愚痴でした。

ああ、Linux Advent Calendar 2014 の他のに比べて著しくレベル低いですね… (^^;)

*1:ちなみにMount Namespaceを表すカーネル内の定義は、当時他にNamespaceがなかったためCLONE_NEWNS(Clone New Namespace)というなんとも一般的でマウントなのかどうかわからないものになってます。