HeadlinesBriefing HeadlinesBriefing.com

Dockerは不思議:自作のコンテナランタイムを作ってみた

Hacker News •
×

趣味で自分のコンテナランタイムを作ることにしました。まだ始めたばかりですが、Dockerは不思議だということがわかってきました。Dockerについて学んだ不思議なことをいくつか紹介します。

コンテナは実体のあるものではありません。VMと違って、コンテナは特別な制限を受けたプロセスにすぎません。カーネルは今もそのプロセスを実行しており、/proc で見つけることができます。Linuxのコンテナ機能という単一の機能は存在せず、コンテナは実のところ、トレンチコートをまとった5つの異なるLinuxカーネル機能です。名前空間(namespaces)はホストとコンテナから見えるものを隠し、cgroupsはリソースの使用量を制限し、ネットワークの仕組みがコンテナのネットワークを分離します。

イメージはただのフォルダです。Dockerはそれをどこかに置き、chroot(またはpivot_root)を呼び出して、そのフォルダをコンテナの新しいルートディレクトリにします。Goはコンテナランタイムには正直なところ不向きな言語です。DockerのランタイムであるruncはGoで書かれていますが、Goの設計上の選択はそれを適さないものにしています。Goのランタイムはネイティブにマルチスレッドですが、多くのLinuxシステムコールはシングルスレッド環境を必要とするため、runcにはGoが初期化される前に動くCのモジュールがあります。Goにはforkもないため、runcは/proc/self/exeをexecして、forkを近似しています。

Dockerにはroot権限が必要です。多くのLinuxカーネルAPIがroot権限を要求するため、Dockerデーモンは通常root権限で動作します。rootレスのランタイムでは、ネットワークスタック全体をユーザー空間で作り直さなければならないこともあります。学ぶのは楽しいものです!普段使っているツールを自分で書いてみることは、それを理解する素晴らしい方法です。

出典: Hacker News · 要約:HeadlinesBriefing