Docker 17.XX 予想 (2017/03/22時点)

# TLDR

* 毎月リリースされる
* 17.04では大幅な変更はないが，17.05以降では，色々面白い変更がありそう
* コンパイラやソースを，最終的なイメージに残さない機能が入りそう: https://github.com/docker/docker/pull/31257
* `docker ps`が刺さらなくなる: https://github.com/docker/docker/pull/31273
* 下位レイヤの，Kubernetesとの共通化が進む (containerdなど)

# バージョン番号について

2017年3月，1.13.1から飛んで17.03.0がリリースされた．(実質1.13.2)
今後はEdge版が毎月，Stable版が3ヶ月毎にリリースされる．

次のEdge版は17.04，Stable版は17.06になる見込み．

![image](https://i0.wp.com/blog.docker.com/wp-content/uploads/lifecycle.png?resize=1024%2C376&ssl=1)

(画像出典: https://blog.docker.com/2017/03/docker-enterprise-edition/)

# 17.04 に入ることが確定しているもの

17.04.0-CE RC1 リリースノートも参照: https://github.com/docker/docker/releases/tag/v17.04.0-ce-rc1

## bind mount consistency (主にDocker for Mac向け)

https://github.com/docker/docker/pull/31047

bind mount (ホストのファイルシステムをコンテナ内にマウントする機能．`docker run -v /foo:/bar`)について，"consistency"を指定できるようになった．consistent, cached, delegatedの3種類．(e.g. `docker run -v /foo:/bar:cached`)

12倍近く速くなることがある．
https://gist.github.com/yallop/d4af9dd1bb33ae61d48adf86692cdf9e

> performing many small writes (dd 100,000 1k blocks, write-only):
>  with a consistent shared directory: 22.7s
>  with preliminary delegated semantics: 1.9s (11.95×)

今のところDocker for Mac向け．将来的にはDocker for Windowsも対応するかもしれない．
Linuxではホストのファイルシステムがosxfsを経由せず，直接`mount(2)`されるので，関係ない．

## `--security-opt=no-new-privileges`のデフォルトでの有効化

https://github.com/docker/docker/pull/29984

`/etc/docker/daemon.json`に`{no-new-privileges: true}`と書いておくと，全てのコンテナがデフォルトで`--security-opt=no-new-privileges`付きで起動する．

`--security-opt=no-new-privileges`自体は1.11から存在している．
`--security-opt=no-new-privileges`の詳細は http://www.projectatomic.io/blog/2016/03/no-new-privs-docker/ を参照．

例えば`suid`とかを無効化できる．

```console
$ docker run -it --rm --user=1000  testnnp
Effective uid: 0
```

```console
$ docker run -it --rm --user=1000 --security-opt=no-new-privileges testnnp
Effective uid: 1000
```

## non-blockingなlogging

https://github.com/docker/docker/pull/28762

コンテナのloggingのモードとして，`blocking`と`non-blocking`を選べるようになった(`--log-opt mode=non-blocking`)．

`stdout`/`stderr`がブロックしてコンテナが動けない問題が解消される．

## `docker service create --read-only ...`

https://github.com/docker/docker/pull/30162

Swarm-modeタスクのrootfsを，強制的にread-onlyに出来る．
意図せずしてrootfs上にstateを持つことを避けられる．

## topology-aware scheduling

https://github.com/docker/docker/pull/30725
https://github.com/docker/swarmkit/pull/1473
https://github.com/docker/swarmkit/pull/1512

Swarm-modeのタスクを，複数のDCやラックに均等にまたがるように配置できるようになる．


# 17.XX 予想

17.XXに近い将来入りそうなPRをいくつか紹介する．
確実に入ると決まったわけではないし，入るとしても仕様は変更される可能性があることに注意されたい．

## `FROM`行のパラメータ化

https://github.com/docker/docker/pull/31352

ベースイメージのバージョンを，ビルド時に簡単に切り替えられる．

例えば，デフォルトでは`golang:1.8`をベースイメージとして指定しておき，

```dockerfile
ARG GO_VERSION=1.8
FROM golang:${GO_VERSION}
```

ビルド時に任意のバージョン(例えば`golang:1.7`)に切り替えたりできる．

```console
$ docker build --build-arg GO_VERSION=1.7 .
```

## コンパイラやソースを最終イメージに残さない

https://github.com/docker/docker/pull/31257

イメージにコンパイラやソースが残る問題が解決される．

例: (`FROM`が複数あるが，単一のDockerfile)

```dockerfile
FROM golang:1.8 AS builder
COPY . /go/src/github.com/foo/bar
RUN go build -o /app --ldflags '-extldflags "-static"' github.com/foo/bar

FROM scratch
COPY --context=builder /app /app
```

最終的なイメージは，`/app`ファイルだけを含み，Goコンパイラや，アプリのソースは含まない．busyboxさえ含まない．(もちろん必要に応じて含めてよい)

## `docker build --build-secret`

https://github.com/docker/docker/pull/30637

gitのキーなどを`docker build`時に`/run/secrets`に注入できるようになる．
multi-stage build (31257)と組み合わせると，秘密の資材を扱いやすくなりそう．


## `docker ps`が刺さらない

https://github.com/docker/docker/pull/31273

コンテナオブジェクトに対するロックのため，`docker ps`を実行すると返ってこないことがよくある．

go-memdbを用いることで，ロックが減る見込み．


# 17.XX 予想　(未実装)

まだ実装に至ってはいないが，実装される可能性が高いと思われるもの．

## 新containerdの採用 (予想と言うか決定事項)

overlayfsなどのstorage driver及び，イメージのpull/push機能は，従来はDocker本体に実装されていたが，containerdへの移植が進んでいる．

containerdは，現時点ではDocker社が開発しているが，近々CNCFに正式に移管される．
https://github.com/docker/containerd
https://blog.docker.com/2017/03/docker-donates-containerd-to-cncf/

containerdは，Kubernetesからも(Docker APIを経由せずに)[Container Runtime Interface (CRI)](http://blog.kubernetes.io/2016/12/container-runtime-interface-cri-in-kubernetes.html)を通じて利用可能となる予定．

話が脱線するが，CRIに対応したランタイムとしては，以下のようなものがある．

CRIランタイム | 更に下位のランタイム
--- | ---
[containerd](https://github.com/docker/containerd) | runc
[cri-o](https://github.com/kubernetes-incubator/cri-o) | runc
[dockershim](https://github.com/kubernetes/kubernetes/tree/master/pkg/kubelet/dockershim) | Docker(を経由してcontainerdを経由してrunc)
[rktlet](https://github.com/kubernetes-incubator/rktlet) | rkt
[frakti](https://github.com/kubernetes/frakti) | [hyperd](https://github.com/hyperhq/hyperd)を経由してKVMなど
[virtlet](https://github.com/Mirantis/virtlet) | libvirtを経由してKVMなど


## Container Storage Interface (CSI)

https://github.com/docker/docker/issues/31923

Docker, Kubernetes, Mesosphere, Cloud Foundry関係者を中心に，ストレージ用の新しい標準APIの策定が進められている．

従来の[Docker Volumes API](https://docs.docker.com/engine/extend/plugins_volume/)を置き換えるものとなりそう．