Containerdを触ってみた
この記事は 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 <[email protected]> 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 <[email protected]> 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の先取りをするという意味で触ってみる価値はあると思いますが、これ単体で利用する価値は見いだせないのが現状です。 今後の動向だけチェックしておきますかね。