コンテナのさしすせそ
ぜんぜんさしすせそではないが・・・
コンテナとは
An environment for executing processes with configurable isolation and resource limitations. For example, namespaces, resource limits, and mounts are all part of the container environment.
プロセスを
隔離し
リソース制限を行い
設定可能で
環境
であればコンテナだといえる
プロセスより下の話
ここではプロセスを支える基盤を仮想化していくコンテナ技術を述べていく
下に行けば行くほどより多くのものを仮想化するが、そのぶん鈍重になっていく
なるだけ軽い仮想化を選べるようにしよう
chroot
プロセスの
ファイルシステムを
隔離する
正確には、その名前の通り、そのプロセスから見えるファイルシステムのルートを変更する
例えば chroot ./foo /busybox shなどすると、./fooをファイルシステムのルート/にした状態で./foo/busyboxが起動し、シェルになる
例えば、ユーザからのリクエストを受けるようなプログラム(典型的にはWebサーバ)が、バグや攻撃(典型的にはディレクトリトラバーサル)によってサーバの他のファイルシステムにアクセスされることを防ぐために、あらかじめchrootした状態でサーバを起動させる
なにかあってもchrootしたより上のディレクトリはどうやっても見えない
欠点
ただし、プロセス空間は隔離されないため他のプロセスは見える
ただし、リソース制限機能がないためCPUを使い果たすことができる
フォークボムなどが典型例
ただし、ネットワーク隔離機能がないためポートが競合したりする
ただし、rootじゃないと発動できない
rootが起動するので、root権限のままになる。小細工すると脱獄できる
OCIの定義によれば、chrootはコンテナとは呼べないことになる
ファイルシステムだけ隔離できればいいのであればchrootでもいい
現代におけるコンテナの直感とは離れている
起動・終了といった単位もない
FreeBSD Jail
Chroot(ファイルシステム)に加えて以下が隔離される
プロセスリスト
シグナル
ネットワーク
プロセス間通信
例えば名前付きパイプを経由しても他のJailやホストとは通信できないはず
当初はリソース制限機能がなかったが、現代では可能
また、さらにroot特権が制約され、システムコールの内容に制約がかかる
カーネルは同一のものが動作している
欠点
FreeBSDでしか使えない
2025年時点ではDockerほど流行っていない
Jailを再現するための可搬な手段がない
この意味で抽象化に失敗している
Docker
Jailに加えて以下の機能を持つ
Dockerfileによる再現性のあるビルド機構
層状のコンテナイメージ
JailはFreeBSDのカーネル機能を利用して動作するが、DockerはLinuxのカーネル機能を利用して動作する
cgroups, namespace, etc.