runcを読む その1

モチベーション

ある日、Youkiというコンテナランタイムが出てきて衝撃を受けた。
自分もコンテナが何か知りたくなったので、runcを読むことにした。

正攻法と挫折

OCIの仕様を読み込むところから始める。

…と思ったが、抽象的過ぎてイメージがつかめない。
ふんわりと分かったこと

①以下のOperationがある

  • state
  • create
  • start
  • kill
  • delete

②コンテナランタイムを起動するためにはbundleconfig.jsonが必要

runcの大体の動作を把握する

実際に動かしてみる。

ubuntu18.04からbundleを取得する

docker run --rm -d --name ubuntu ubuntu:18.04 tail -f /dev/null
docker export ubuntu > rootfs.tar
docker kill ubuntu
mkdir rootfs
tar xf rootfs.tar -C rootfs

runc は、runc specで適当なconfig.jsonを生成できる。

runc spec

準備完了。runcを実行する。 確かにUbuntu18.04LTSのイメージが実行されている

sudo runc run ubuntu
# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.6 LTS (Bionic Beaver)"
ID=ubuntu
(中略)
# exit
cat /etc/os-release 
NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
ID=ubuntu
(中略)

runc runを実行できた。 次回から、runc のコードリーディングを本格的に進めていく。