2015年6月23日火曜日

さっそくruncを動かしてみた

DockerCon 2015 で 「Open Container Project」発足と新しいランタイム「runC」が発表になりました。
https://www.opencontainers.org
http://www.publickey1.jp/blog/15/dockerrunclinuxwindows.html

すでにrunCもダウンロード可能です。
https://github.com/opencontainers/runc

こうなったら、やってみるしかありません。
みんながあまり好きではない、CentOS7で試してみましょう。

GOのインストールからスタートです。
エクセレントなやり方がわからず強引にやってます。
PATH、GOPATHの設定は.bash_profileにするといいと思います。
 # yum install golang
 # export GOPATH=$HOME/go
 # export PATH=$PATH:$GOHOME/bin
 # go get github.com/opencontainers/runc/libcontainer/utils
 # go get github.com/opencontainers/runc/libcontainer/nsenter
 # go get github.com/opencontainers/runc/libcontainer/devices
 # go get github.com/opencontainers/runc/libcontainer/configs
 # go get github.com/opencontainers/runc/libcontainer/cgroups
 # git clone https://github.com/opencontainers/runc.git
 # cd runc
 # make
 # make install


次は、dockerイメージをexportして、適当なディレクトリに展開します。
 # docker export コンテナID > image.tar
 # mkdir rootfs
 # cd rootfs
 # tar xvf ../image.tar

最後に、container.jsonを例にしたがって作成します。
長くなりますが、githubのREADME.mdをコピーして、ユーザーのみrootに変更します。
 # cat container.json 
{
    "version": "0.1",
    "os": "linux",
    "arch": "amd64",
    "processes": [
        {
            "tty": true,
            "user": "root",
            "args": [
                "sh"
            ],
            "env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "TERM=xterm"
            ],
            "cwd": ""
        }
    ],
    "root": {
        "path": "rootfs",
        "readonly": false
    },
    "cpus": 1.1,
    "memory": 1024,
    "hostname": "shell",
    "namespaces": [
        {
            "type": "process"
        },
        {
            "type": "network"
        },
        {
            "type": "mount"
        },
        {
            "type": "ipc"
        },
        {
            "type": "uts"
        }
    ],
    "capabilities": [
        "AUDIT_WRITE",
        "KILL",
        "NET_BIND_SERVICE"
    ],
    "devices": [
        "null",
        "random",
        "full",
        "tty",
        "zero",
        "urandom"
    ],
    "mounts": [
        {
            "type": "proc",
            "source": "proc",
            "destination": "/proc",
            "options": ""
        },
        {
            "type": "tmpfs",
            "source": "tmpfs",
            "destination": "/dev",
            "options": "nosuid,strictatime,mode=755,size=65536k"
        },
        {
            "type": "devpts",
            "source": "devpts",
            "destination": "/dev/pts",
            "options": "nosuid,noexec,newinstance,ptmxmode=0666,mode=0620,gid=5"
        },
        {
            "type": "tmpfs",
            "source": "shm",
            "destination": "/dev/shm",
            "options": "nosuid,noexec,nodev,mode=1777,size=65536k"
        },
        {
            "type": "mqueue",
            "source": "mqueue",
            "destination": "/dev/mqueue",
            "options": "nosuid,noexec,nodev"
        },
        {
            "type": "sysfs",
            "source": "sysfs",
            "destination": "/sys",
            "options": "nosuid,noexec,nodev"
        }
    ]
}

やっとコンテナを動かせます。
コマンドひとつです。
 # runc
(ここからコンテナのシェルです)
# ls
bin  boot  dev etc  home  lib lib64  media  mnt  opt proc  root  run  sbin  srv  sys  tmp  usr  var
# pwd
/
# hostname
shell
# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 04:13 ?        00:00:00 sh
root         7     1  0 04:13 ?        00:00:00 ps -ef

もうちょっと突っ込んだことは、ぼちぼちみなさんやり始めるんでしょうね。
次はWindowsコンテナかw



0 件のコメント: