Sockerというコンテナランタイムを作った

昨年度「情報科学特別演習」という授業を履修し、コンテナについて勉強していた。

担当は新城先生という先生に担当していただいて毎週ミーティングをしていた。
もちろん毎週進捗が生まれるわけではないので、雑談しているだけの会も多々あったが学びが多かった。

個人的にはシステムプログラミングに触れる経験が初めてだったので、知らないことだらけで大変だった。*1

なんだかんだでそれっぽいコンテナランタイムを作ることができ、名前をSockerとした。ランタイムの実装を終わらせたあとDockerのネットワークを再現したくなり時間を溶かした。

github.com

それから半年たった今、当時のコードをすべて書き直した。
これからしばらく趣味の開発に割ける時間が減りそうだったので、夏休みの最後になにかやっときたかった気持ちが大きい。
またBinary Hacks Rebootedという本を読んでコンテナ欲が再燃したのも理由としてかなり大きい。

現状、コンテナに関する章しか読めていないが、とても読みやすくて面白いのでおすすめ。

今回の書き直しのポイント

今回の書き直しのポイントは何より、OCIの標準規格に沿った実装をしたことだ。

コンテナランタイムはOpen Container Initiative(OCI)という団体がその標準規格を定めており、Dockerなどは標準規格に対応するランタイムであれば任意のランタイムを使うことができる。
なお、OCI自身もrunCというコンテナランタイムを保有しており*2Dockerはデフォルトでこのランタイムを利用している。

Sockerも標準規格に沿った実装をしているが、いくつか実装しておらず実用上難しい点がある。

その一つがコンテナのライフサイクルだ。これは、どこでライフサイクルを管理するのが良いのかがわかっていないので実装していない。

他にもプロセス関連のuid mappingやCgroup・Capabilityなどは実装していないがこれらは時間があるときを見つけて実装していきたい。

また、Windowsにネイティブ対応できたらめっちゃ面白そうだなとも思っている。

*1:システムコールのシの字も知らなかった

*2:もともとDockerが開発していたものを、OCIに寄贈した