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になる見込み.
(画像出典: 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向け)
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
のデフォルトでの有効化
/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
とかを無効化できる.
$ docker run -it --rm --user=1000 testnnp
Effective uid: 0
$ docker run -it --rm --user=1000 --security-opt=no-new-privileges testnnp
Effective uid: 1000
non-blockingなlogging
コンテナのloggingのモードとして,blocking
とnon-blocking
を選べるようになった(--log-opt mode=non-blocking
).
stdout
/stderr
がブロックしてコンテナが動けない問題が解消される.
docker service create --read-only ...
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
行のパラメータ化
ベースイメージのバージョンを,ビルド時に簡単に切り替えられる.
例えば,デフォルトではgolang:1.8
をベースイメージとして指定しておき,
ARG GO_VERSION=1.8
FROM golang:${GO_VERSION}
ビルド時に任意のバージョン(例えばgolang:1.7
)に切り替えたりできる.
$ docker build --build-arg GO_VERSION=1.7 .
コンパイラやソースを最終イメージに残さない
イメージにコンパイラやソースが残る問題が解決される.
例: (FROM
が複数あるが,単一の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
gitのキーなどをdocker build
時に/run/secrets
に注入できるようになる.
multi-stage build (31257)と組み合わせると,秘密の資材を扱いやすくなりそう.
docker ps
が刺さらない
コンテナオブジェクトに対するロックのため,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)を通じて利用可能となる予定.
話が脱線するが,CRIに対応したランタイムとしては,以下のようなものがある.
CRIランタイム | 更に下位のランタイム |
---|---|
containerd | runc |
cri-o | runc |
dockershim | Docker(を経由してcontainerdを経由してrunc) |
rktlet | rkt |
frakti | hyperdを経由してKVMなど |
virtlet | libvirtを経由してKVMなど |
Container Storage Interface (CSI)
Docker, Kubernetes, Mesosphere, Cloud Foundry関係者を中心に,ストレージ用の新しい標準APIの策定が進められている.
従来のDocker Volumes APIを置き換えるものとなりそう.