Open Container Initiative
From Wikipedia, the free encyclopedia
Open Container Initiative(OCI)は、OSレベル仮想化の一種である「コンテナ」のフォーマット・ランタイムの業界標準策定を目的として設立されたイニシアチブである[1]。Linux Foundationプロジェクトの1つである[2]。
概要
OCI Runtime Spec
Container
OCI RuntimeにおけるContainerは「『隔離とリソース制限を設定可能なプロセス実行』を提供する1つの環境」である[5]。例えばruncランタイム上で生成されたContainerは他のコンテナからファイルシステムやプロセスが隔離され、利用可能なCPUリソース等に制限がかけられている。ゆえにこのコンテナ(環境)内で実行されるプロセスは隔離とリソース制限を得ることができる。
OCI Runtime SpecではこのContainerのライフサイクル等を定義している。
status
OCI Containerはcreating, created, running, stopped以下のいずれかの状態あるいはランタイムが拡張した状態にある[6]。
Runtime
OCIにおけるRuntimeはContainerの管理を司るプログラムである。Runtimeはbundleから設定ファイルを読み込み、それに基づいてコンテナを生成、コンテナ内でプロセスを起動し、その他のコンテナライフサイクル管理を実行する[7]。
OCI Runtime Specに準拠した様々なコンテナランタイムが実装されている。
- runc: 広く利用されているリファレンス実装。containerd[8](を利用するDocker[9])やcri-o[10]のランタイムとして利用されている
- kata-runtime: 軽量VMで高い安全性を志向するKata Containers[11]のランタイム[12]
- runsc: 高い安全性を志向するgVisorのランタイム[13]
他にも様々なランタイムが開発された。
- RailCar: Rustで実装されたOCI Runtime実装 (開発終了)
filesystem bundle
OCIにおける filesystem bundle は、コンテナに必要な全ファイルが定められた形式で配置された1つのセットである[14]。bundleは設定情報を含むconfig.jsonおよびコンテナのrootファイルシステムから成る。Runtimeはコンテナidとfilesystem bundleからコンテナを生成する[15]。
OCI Image
OCI ImageはOCI Image Format Specificationによって定義されるコンテナイメージ仕様である[16]。OCI Imageにはディレクトリ/ファイル情報と実行時設定が含まれており[17]、OCI Imageに準拠したコンテナイメージをOCI Runtimeに準拠したコンテナランタイムへ渡すことでコンテナを実行できる[18]。
OCI Imageは以下の4要素で構成される[19]。
- Manifest: コンテナイメージに含まれるlayersとconfigurationのハッシュ値等が記述されたJSONファイル[20](例)
- image index (任意)
- set of filesystem layers: ファイルシステムのchangesets (tar, tar.gz, tar.zstdとメタデータ)
- Configuration: アプリケーションの引数、環境変数等の設定情報が記述されたJSONファイル[21](例)
OCI Imageはファイルシステム情報をそのまま持つのではなく、changesetつまり元ファイルシステムに対する変更差分を用いて保有している(c.f. Git)。これにより元ファイルシステムにすべての変更履歴(layers)を適用することで完全なファイルシステムを生成できるようになっている。
OCI Runtimeでは、OCI Image layersから得られたファイルシステム実体とImage Configurationの変換で得られたconfig.jsonからfilesystem bundleを得ることでコンテナを生成する(image → bundle → container)。