Help us understand the problem. What is going on with this article?

はじめてのrunC

More than 3 years have 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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした