コンテナ関連コミュニティの動向 (2017年4月・5月)



気になっているニュースを適当に書き連ねてみた．

# DockerCon (4/17-20)

https://blog.docker.com/2017/04/dockercon-2017-day-1-highlights/

技術的な話題:

- Moby Project (Docker : Moby ≒ RHEL : Fedora)
- Linuxkit (コンテナ用Linuxディストリビューション．オプションで[okernel](https://github.com/linuxkit/linuxkit/tree/master/projects/okernel)(nested kernelのようなもの)も使える．)
- Multi-stage build (Docker 17.05の新機能．Dockerfileにビルドコンテキスト(FROM行)を複数記述し，コンテキスト間でファイルを転送できる．)

など．

商用系の話題:

- VISAやMetLifeでの商用導入事例
- OracleのDocker Storeでの販売開始
- レガシーアプリをコンテナ化するDocker社の事業

など．

https://github.com/docker/docker が https://github.com/moby/moby にリネームされたため，色々な誤解が広まっているが:

- Dockerの製品名はDockerのまま
- `docker` コマンドも `docker` コマンドのまま ([`moby` コマンド](https://github.com/moby/tool)は全然関係ない開発者向けツール)
- `Dockerfile` も `Dockerfile` のまま
- CLIはMobyから除外され，Docker社が単独でmaintainする"product"となったものの，プロプラにはなっていない ( https://github.com/docker/cli )

詳しくは https://www.slideshare.net/AkihiroSuda/moby-project にまとめてみた．

# Docker・Moby 新API

https://forums.mobyproject.org/t/proposal-engine-v1-rest-api-transition/49/10

Docker daemonは，単一のRESTサービスから，複数のgRPCサービスへと分割される．
各gRPCサービスは，それ自体さえもがcontainerd上のコンテナとして動作する．

従来のREST APIをエミュレートするレイヤも用意されるので，既存のアプリケーションを書き直す必要はない．
ただ，互換性に関する問題が全く生じないとは言えないかも知れない．


# Moby 新フォーラム

プロジェクトの方向性に関する議論は，githubから[Discourse](https://forums.mobyproject.org/)に移った．

また，定例ミーティングが，毎日午前1時(JST)に，[Docker Community Slack](https://blog.docker.com/2016/11/introducing-docker-community-directory-docker-community-slack/)の`#moby-project` チャネルで開かれるようになった．
誰でも参加できるが，Docker社以外の人はあまり参加していない?


# Buildkit構想

https://github.com/moby/moby/issues/32925

`docker build` を再実装する構想．

- low-levelなフォーマットとして「LLB」が提供される．LLBは人間が直接読み書きするものではない．
- LLBの命令間の依存性は，DAGとして表現される．並行性の抽出などによる高速化が可能となる．
- 従来のDockerfileは，LLBに変換されて実行される．今後，Dockerfile以外の上位言語も出てくるかもしれない?



# OCI

runC, runtime spec, image specのいずれも，近いうちに1.0がリリースされそう．

- https://github.com/opencontainers/runtime-spec/issues/726
- https://github.com/opencontainers/image-spec/issues/615

ただ，x86_64 Linux以外のプラットフォームへの対応について，最終確認にもう少し時間がかかるかもしれない．

なお，今のところ，イメージ配布プロトコルは[OCIのスコープ外](https://www.opencontainers.org/about/oci-scope-table)となっているが，標準化へ向けての試みもある．
https://github.com/cyphar/parcel

# CRI (Container Runtime Interface; Kubernetesの共通ランタイム仕様)

containerdがrktと同時(3/29)にCNCFに寄贈された．
また，4月中旬，Googleを中心として [CRI-containerd](https://github.com/kubernetes-incubator/cri-containerd) プロジェクトが発足した．
CRI-containerdを用いることで，containerdをCRI準拠ランタイムとして用いることができる．
主要なCRI準拠ランタイムは，いずれもKubernetes Incubator下で開発されている．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90542/b77280af-9d1f-7080-8923-e7eaaf0915fd.png)
(図中に示していないCRIランタイムとしては [frakti](https://github.com/kubernetes/frakti)や[dockershim](https://github.com/kubernetes/kubernetes/tree/master/pkg/kubelet/dockershim)もある)


CRI-Oとcontainerdとのスコープは殆ど重なっているが，違いとしては

- CRI-O が直接CRIを実装しているのに対し，containerdはCRIを実装していない．別途CRI-containerdを要する．
- CRI-O は [Dockerからフォークしたライブラリ(`containers/image`, `containers/storage`)](https://github.com/containers) を用いているのに対し，containerdはほぼスクラッチから実装している．そのため，containerdのほうが拡張性が高い．Go 1.8のプラグインにも対応している．


# CNI (Container Network Interface) のCNCF入り (5/23)

https://www.cncf.io/blog/2017/05/23/cncf-hosts-container-networking-interface-cni/

# CSI (Container Storage Interface)

https://docs.google.com/document/d/1JMNVNP-ZHz8cGlnqckOnpJmHF-DNY7IYP-Di7iuVhQI/edit

Mesosphere関係者が中心となって提案している，コンテナ向け永続ストレージの仕様．
まだ実装には至っていない模様．

# Make containers kernel objects

https://lkml.org/lkml/2017/5/22/645

namespace・cgroupsより高級なシステムコールをカーネルに追加する提案．
`fd = container_create(name, flags)`, `pid = fork_into_container(fd)`など．

OCI runtime specがあるので，システムコールでしなくていいのでは，という意見が強そう．

# Longhorn

https://github.com/rancher/longhorn

Rancher Labsが開発したコンテナ向け分散iSCSIストレージ．
DockerConにてデモが展示されていた．

命名は，DockerCon開催地のテキサスにかけているのだと思われる．
https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%AD%E3%82%B5%E3%82%B9%E3%83%AD%E3%83%B3%E3%82%B0%E3%83%9B%E3%83%BC%E3%83%B3


# MicrosoftのDeis買収 (4/10)

https://blogs.microsoft.com/blog/2017/04/10/microsoft-acquire-deis-help-companies-innovate-containers/

Helm目的?


# 雑多 (4月以前の話)

- Red Hatが，[OpenCompose](https://github.com/redhat-developer/opencompose) を立ち上げた．Docker Composeに類似したYAMLファイルで，Kubernetesのリソースを定義できる．[Kompose](https://github.com/kubernetes-incubator/kompose) と似ているが，Komposeと異なり，Docker Composeとはやや異なる独自フォーマットを採用している．

- Linuxのxfsがreflinkをサポートした．コンテナのスナップショットドライバなどに使えるかも知れない．