Docker Engine 18.09リリース、BuildKitの搭載でコンテナビルドのスピードを最大9倍以上に高速化
DockerはcontainerdやBuildKitの最新版を搭載したDocker Engine 18.09のリリースを発表しました。 Docker Engine 18.09の最大の特徴は、新しく登場したコンテナイメージのビルダであるBui...
上記の記事のようにDocker 18.09からBuildKitと呼ばれる、Dockerfileからcontainerを作成するエンジンが正式版になったようです。
今更ながら調べてみると、Experimentalとはいえ、18.06から提供になっていたんですね。知りませんでした。
DockerCE18.06で使えるBuildKitを使おう - Qiita
概要2018/07/19にリリースされたDockerの18.06バージョンでは、BuildKitというものが実験的に統合されて使えるようになり、ビルドが30倍速くなる(こともある)! とDock…
どうやらこのBuildKit、使用すると、
みたいですね。multi stage buildなDockerfileを使用していると、特に効果は大きいのだとか。
というわけで実験。
手順:
なんかうちの環境では、experimentalを有効にする必要がありました。/etc/docker/daemon.json
{
"experimental": true
}
上記の設定を有効にするため、dockerサービスの再起動。
$ docker version
Client:
Version: 18.09.0
API version: 1.39
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:52:51 2018
OS/Arch: linux/arm64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.0
API version: 1.39 (minimum version 1.12)
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:17:01 2018
OS/Arch: linux/arm64
Experimental: true
有効になっていることを確認したら、docker buildしてみます。
実行前には、環境変数:DOCKER_BUILDKIT=1
を設定するようにしてください。
~/docker-build$ DOCKER_BUILDKIT=1 docker build --rm -t kometchtech/kresd -f kresd/Dockerfile.alpine kresd/
[+] Building 307.6s (11/11) FINISHED
> [internal] load .dockerignore 0.1s
> > transferring context: 2B 0.0s
> [internal] load build definition from Dockerfile.alpine 0.1s
> > transferring dockerfile: 4.05kB 0.0s
> [internal] load metadata for docker.io/arm64v8/alpine:edge 0.0s
> CACHED [runtime 1/2] FROM docker.io/arm64v8/alpine:edge 0.0s
> CACHED [internal] helper image for file operations 0.0s
> [knot-dns-build 2/2] RUN set -x && echo @test http://dl-cdn.alpinelinux.org/alpine/edge/testing | tee -a /etc/apk/r 232.4s
> [build 1/1] RUN git clone --recursive https://github.com/CZ-NIC/knot-resolver.git /tmp/knot-resolver && cd /tm 66.7s
> CACHED [runtime 2/2] RUN set -x && echo http://dl-cdn.alpinelinux.org/alpine/edge/testing | tee -a /etc/apk/reposi 0.0s
> [stage-3 1/2] COPY --from=build /tmp/root/ / 3.7s
> [stage-3 2/2] RUN ldconfig / || true 3.3s
> exporting to image 0.6s
> > exporting layers 0.6s
> > writing image sha256:355cc3b5c28b7c3ccafbad84fb70ac7742b2855707e4a48cdb372ca386eb053d 0.0s
> > naming to docker.io/kometchtech/kresd 0.0s
見てわかると思いますが、どの部分でCACHEを使用している、とか、multi stage buildになっている部分はここだよ、とか、各layerごとの処理時間なども出力されています。
実行中の出力を見ると、並列実行されているところも確認できるので、以前までシーケンシャルに実行されていた時と比較すると、だいぶ処理時間を減らすことができるかと思います。
今回使用したDockerfileは以下においてあります。
大きめなDockerfileのcontainer buildするときも、だいぶ処理時間を削減できると思うので、これからはBuildKitを活用していきたいです。
2019/06/12:追記
buildkitについては、contributerの須田さんの資料や、前佛さんの資料が役に立ちます。
Docker v18.09 新機能 (イメージビルド&セキュリティ)
NTTの須田です.Moby (≒Docker),BuildKit,containerdなど,コンテナ関連のオープンソースソフトウェアのメンテナ (開発委員.コミッタとも.)を務めています.