読者です 読者をやめる 読者になる 読者になる

log.fstn

技術よりなことをざっくばらんにアウトプットします。

Containerdを触ってみた

f:id:foostan:20151218172540p:plain

この記事は Docker Advent Calendar 2015 19日目の記事です。

はじめに

Dockerから新しいプロダクトが発表されました。

Containerd: a daemon to control runC | Docker Blog

runCのネズミ?がDockerのコンテナを運ぶというロゴ?はなんだかシュールですね。 この潜水艦が Containerd みたいです(この絵みるとコンテナが流されちゃうんじゃないかと心配になる…)。

Today we’re releasing a new daemon to control runC called: containerd. It’s built for performance and density, and will eventually be built into Docker Engine.

最終的にDocker Engineに組み込まれるとのことなので、一旦 Containerd という形で切り出してもんだ上で、Docker Engineのコアの部分を置き換えるっていう戦略なのでしょうか。

ちなみに runC については以前触ったのでリンク張っておきます(もう内容は古いかもしれませんが) fstn.hateblo.jp

環境用意

こちらのVagrantfileで用意します。 github.com

起動すると

  • containerd コマンド
  • ctr コマンド

が利用できる状態になっています。

vagrant@vagrant-ubuntu-trusty-64:~$ containerd -h
NAME:
   containerd - High performance conatiner daemon

USAGE:
   containerd [global options] command [command options] [arguments...]

VERSION:
   0.0.4

AUTHOR(S):
   @crosbymichael <crosbymichael@gmail.com>

COMMANDS:
   help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --id "vagrant-ubuntu-trusty-64"          unique containerd id to identify the instance
   --debug                      enable debug output in the logs
   --state-dir "/run/containerd"            runtime state directory
   -c, --concurrency "10"               set the concurrency level for tasks
   --metrics-interval "1m0s"                interval for flushing metrics to the store
   --listen, -l "/run/containerd/containerd.sock"   Address on which GRPC API will listen
   --oom-notify                     enable oom notifications for containers
   --help, -h                       show help
   --version, -v                    print the version

vagrant@vagrant-ubuntu-trusty-64:~$ ctr -h
NAME:
   ctr - High performance conatiner daemon controller

USAGE:
   ctr [global options] command [command options] [arguments...]

VERSION:
   0.0.4

AUTHOR(S):
   @crosbymichael <crosbymichael@gmail.com>

COMMANDS:
   checkpoints  list all checkpoints
   containers   interact with running containers
   events   receive events from the containerd daemon
   help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --debug                  enable debug output in the logs
   --address "/run/containerd/containerd.sock"  address of GRPC API
   --help, -h                   show help
   --version, -v                print the version

また下記を参考に起動するイメージを作成しておきます。

containerd/bundle.md at master · docker/containerd · GitHub

まずはDocker イメージをpullして展開します

$ mkdir -p redis/rootfs
$ docker pull redis
$ docker create --name tempredis redis
$ docker export tempredis | tar -C redis/rootfs -xf -
$ docker rm tempredis

下記のパスに設定ファイルを作成します

redis
├── config.json
├── rootfs/
└── runtime.json

またいくつか依存するパッケージがあるようなのでインストールします。 ここではdocker.ioをインストールしていますが、さすがにdockerまでは必要ないと思います。

$ sudo apt-get update
$ sudo apt-get install docker.io

使ってみる

containerd を起動します。 検証のため --debug オプション付けてます。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo containerd --debug
WARN[0000] low RLIMIT_NOFILE changing to max             current=1024 max=4096
DEBU[0000] containerd is not init, set as subreaper      pid=1916
DEBU[0000] Supervisor started                            runtime=libcontainer stateDir=/run/containerd
DEBU[0000] GRPC API listen on /run/containerd/containerd.sock
DEBU[0000] containerd: starting signal handler           bufferSize=2048

別ターミナルを開いて ctr を利用してみます。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo ctr containers
ID                  PATH                STATUS              PID1
vagrant@vagrant-ubuntu-trusty-64:~$ sudo ctr containers start redis /vagrant/redis
5435
vagrant@vagrant-ubuntu-trusty-64:~$ sudo ctr containers
ID                  PATH                STATUS              PID1
redis               /vagrant/redis      running             5435

redisが起動したようなので試しにredisを利用してみます。 network namespace の設定はしていないので下記のように接続できます。

vagrant@vagrant-ubuntu-trusty-64:~$ telnet localhost 6379
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
set foo bar
+OK
get foo
$3
bar
quit
+OK
Connection closed by foreign host.

コンテナ内で別のプロセスを実行する場合は ctr containers exec コマンドを利用します。 Dockerのコマンドとほぼ同様ですが、オプションが若干違います。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo ctr containers exec --tty -a --id redis /usr/local/bin/redis-cli
127.0.0.1:6379> get foo
"bar"
127.0.0.1:6379> exit

ctr containers stats でコンテナの状態を監視できます。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo ctr containers stats redis
cgroup_stats:<cpu_stats:<cpu_usage:<total_usage:5935936142 percpu_usage:5935936142 usage_in_kernelmode:3090000000 usage_in_usermode:370000000 > throttling_data:<> > memory_stats:<usage:<usage:11071488 max_usage:16642048 > swap_usage:<> > blkio_stats:<> hugetlb_stats:<key:"2MB" value:<> > > timestamp:1450459010
cgroup_stats:<cpu_stats:<cpu_usage:<total_usage:5938023381 percpu_usage:5938023381 usage_in_kernelmode:3090000000 usage_in_usermode:370000000 > throttling_data:<> > memory_stats:<usage:<usage:11071488 max_usage:16642048 > swap_usage:<> > blkio_stats:<> hugetlb_stats:<key:"2MB" value:<> > > timestamp:1450459011
cgroup_stats:<cpu_stats:<cpu_usage:<total_usage:5940149159 percpu_usage:5940149159 usage_in_kernelmode:3100000000 usage_in_usermode:370000000 > throttling_data:<> > memory_stats:<usage:<usage:11071488 max_usage:16642048 > swap_usage:<> > blkio_stats:<> hugetlb_stats:<key:"2MB" value:<> > > timestamp:1450459012
cgroup_stats:<cpu_stats:<cpu_usage:<total_usage:5942861518 percpu_usage:5942861518 usage_in_kernelmode:3100000000 usage_in_usermode:370000000 > throttling_data:<> > memory_stats:<usage:<usage:11071488 max_usage:16642048 > swap_usage:<> > blkio_stats:<> hugetlb_stats:<key:"2MB" value:<> > > timestamp:1450459013

他には

  • checkpoints
  • events

などといったコマンドがあります。 checkpoints は CRIU を利用して、コンテナを停止/再開 するためのコマンドでしょう。 events は 'receive events from the containerd daemon' とあるので、containerd からイベントを発行する機能があるのでしょうか、詳細は不明です。

最後に

Containerdを軽く触って見た感じ、runCと同じような印象を持ちました(そもそも薄いラッパーなのでそりゃそうか)。 ただ現在は alpha release なので、今後機能やドキュメント等も増えていくことでしょう。

冒頭にも述べましたが、Containerdは今後Docker Engineに組み込まれる予定です。Dockerの先取りをするという意味で触ってみる価値はあると思いますが、これ単体で利用する価値は見いだせないのが現状です。 今後の動向だけチェックしておきますかね。