[docker][自分用メモ] Docker 18.09から正式になったBuildKitが思いのほか快適だった

AIX、UNIX、LinuxContainer
fancycrave-151127-unsplash.jpg
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など,コンテナ関連のオープンソースソフトウェアのメンテナ (開発委員.コミッタとも.)を務めています.
この記事を書いた人

kometchtech

うつ病を患いながら、IT業界の末席にいるおっさんエンジニア。科学計算をしたことがないのに、HPC分野にお邪魔している。興味のある分野で学習したことをblogにまとめつつ、うつ病の経過症状のメモも置いておく日々。じつはRouterboard User Group JPの中の人でもある。 Amazon欲しいものリスト / Arm板を恵んでくれる人募集中

kometchtechをフォローする
タイトルとURLをコピーしました