Dockerについて理解を深めるために、runCについても知っておく必要がありそうだったのでメモ。
runCとは
OCI仕様に基づいて、コンテナ生成・実行などを行うコンテナランタイム。
runCのコードは、
https://github.com/opencontainers/runc
にあり、仕様が変更されるとこのコードも変更される。
runCとDockerの関係
Docker(containerd)は、コンテナの管理などを行い、コンテナ生成・実行はrunCが行っている。
が、わかりやすい。
Getting Started
に書いてあることを実行しただけ。
インストール
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