LoginSignup
34
28

More than 5 years have passed since last update.

はじめてのrunC

Last updated at Posted at 2017-01-04

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

34
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
28