はじめてのrunC

More than 1 year has passed since last update.

Dockerについて理解を深めるために、runCについても知っておく必要がありそうだったのでメモ。


runCとは

OCI仕様に基づいて、コンテナ生成・実行などを行うコンテナランタイム。

runCのコードは、

https://github.com/opencontainers/runc

にあり、仕様が変更されるとこのコードも変更される。


runCとDockerの関係

Docker(containerd)は、コンテナの管理などを行い、コンテナ生成・実行はrunCが行っている。

https://qiita-image-store.s3.amazonaws.com/0/13002/02de6fd8-ea0d-2fc9-a18f-817109819baf.png

が、わかりやすい。


Getting Started

https://github.com/opencontainers/runc/blob/master/README.md

に書いてあることを実行しただけ。


インストール

runCは、golangで実装されており、Go version 1.6以上のインストールが事前に必要。

$ go get github.com/opencontainers/runc

$ cd $GOPATH/src/github.com/opencontainers/runc
$ make
$ sudo make install
$ runc -v
runc version 1.0.0-rc2
commit: c441a2fe0ccfce89d5781e894de783727d6743ee
spec: 1.0.0-rc3


コンテナ実行

runCでコンテナを実行するためには、root filesystemが必要。すでにDockerを利用している場合は、Dockerコマンドを利用して

exportして試してみるのが手軽。

$ mkdir /mycontainer

$ cd /mycontainer
$ mkdir rootfs

次に、configurationを生成。

$ runc spec

config.jsonの詳細は、仕様を参照。

実行やコンテナ状態の確認は以下のとおり。使い勝手はDockerとさほど変わらない。

$ sudo runc run mycontainerid

/ #
$ sudo runc list
ID PID STATUS BUNDLE CREATED
mycontainerid 13503 running /mycontainer 2017-01-04T05:25:00.254835235Z
$ sudo runc ps mycontainerid
UID PID PPID C STIME TTY TIME CMD
root 13503 13495 0 14:24 pts/0 00:00:00 sh
$ sudo runc state mycontainerid
{
"ociVersion": "1.0.0-rc3",
"id": "mycontainerid",
"pid": 13503,
"status": "running",
"bundle": "/mycontainer",
"rootfs": "/mycontainer/rootfs",
"created": "2017-01-04T05:25:00.254835235Z"
}

runc spec で生成したconfig.jsonでは、コンテナを実行すると、シェルが実行される。DOCKERFILEなどと同じ感覚で、config.jsonを修正することでコンテナ実行時の挙動を変えることができる。

例えば、以下の変更を加えると、コンテナ起動後5秒間経つと、コンテナが停止する。

--- a/config.json

+++ b/config.json
@@ -5,7 +5,7 @@
"arch": "amd64"
},
"process": {
- "terminal": true,
+ "terminal": false,
"consoleSize": {
"height": 0,
"width": 0
@@ -15,7 +15,7 @@
"gid": 0
},
"args": [
- "sh"
+ "sleep", "5"
],
"env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",

確認コマンドは以下のとおり。

$ sudo runc create mycontainerid

$ sudo runc list
ID PID STATUS BUNDLE CREATED
mycontainerid 13663 created /mycontainer 2017-01-04T05:38:54.182455265Z
$ sudo runc start mycontainerid
$ sudo runc list
ID PID STATUS BUNDLE CREATED
mycontainerid 13663 running /mycontainer 2017-01-04T05:38:54.182455265Z
$ sudo runc list // 5秒後に実行
ID PID STATUS BUNDLE CREATED
mycontainerid 0 stopped /mycontainer 2017-01-04T05:38:54.182455265Z