SlideShare a Scribd company logo
1 of 34
Download to read offline
Copyright(c)2022 NTT Corp. All Rights Reserved.
BuildKitの概要と最近の機能
2022/8/20
⽇本電信電話株式会社
ソフトウェアイノベーションセンタ
徳永 航平
Container Runtime Meetup #4
Copyright(c)2022 NTT Corp. All Rights Reserved. 2
名前
徳永 航平
GitHub:@ktock / Twitter:@TokunagaKohei
所属 ⽇本電信電話株式会社
興味
コンテナ、特にコンテナランタイム
containerdレビュワ、BuildKitメンテナ
Container Runtime Meetup共同運営
Copyright(c)2022 NTT Corp. All Rights Reserved. 3
⽬次
BuildKitの概要
1.
3. BuildKitの中⾝の概要
4. BuildKit v0.10からの機能と
これからのBuildKit
2. BuildKitのさまざまな機能
Copyright(c)2022 NTT Corp. All Rights Reserved. 4
BuildKitの概要
1.
⽬次
3. BuildKitの中⾝の概要
4. BuildKit v0.10からの機能と
これからのBuildKit
2. BuildKitのさまざまな機能
Copyright(c)2022 NTT Corp. All Rights Reserved. 5
BuildKitの概要
l Moby傘下のコンテナビルダプロジェクト
l `docker build`(要`DOCKER_BUILDKIT=1`)のコアコンポーネント(since 18.09)
l Dockerに限らずKubernetes上でのビルドや汎⽤のビルダフレームワークとして
も使われる
l Moby&Docker, img, OpenFaaS Cloud, container build interface,
Tekton Pipelines, The Sanic builud tool, vab, Rio, kim, PouchContainer,
Docker Buildx, Okteto Cloud, Earthly earthfiles, Gitpod, Dagger, envd
l 対応⾔語︓Dockerfile, Buildipacks, Mockerfile, Gockerfile, bldr, HLB,
Earthly, Cargo Wharf, Nix, mopy, envd, cue(Dagger)
採⽤例
https://github.com/moby/buildkit#used-by
https://github.com/moby/buildkit#exploring-llb
Copyright(c)2022 NTT Corp. All Rights Reserved. 6
BuildKitプロジェクトのあゆみ
2018 2019 2020 2021 2022
v0.3.0 v0.4.0 v0.5.0 v0.8.0 v0.10.0
(10⽉) (3⽉) (4⽉) (12⽉) (3⽉)
〜2017
[1] https://docs.docker.com/engine/release-notes/18.09/#new-features ; [2] https://docs.docker.com/engine/release-notes/19.03/#19030 ; [3] https://github.com/knative/build-templates/pull/70 ; [4]
https://github.com/tektoncd/catalog/pull/20 ; [5] https://github.com/moby/buildkit/pull/1446 ; [6] https://github.com/moby/buildkit/pull/2522 ; [7] https://github.com/moby/buildkit/pull/2615
v0.6.0
(8⽉)
v0.7.0
(3⽉)
v0.9.0
(7⽉)
11⽉ Docker Engine 18.09に採⽤[1]
3⽉ Docker EngineにBuildx plugin採⽤[2]
10⽉ Knative Build Templateに採⽤[3]
5⽉ Tektonに採⽤※[4]
4⽉ Earthlyに採⽤※ [5]
※ BuildKitプロジェクトへの報告⽇基準
12⽉ Gitpodに採⽤※ [6]
2⽉ Daggerに採⽤※ [7]
Copyright(c)2022 NTT Corp. All Rights Reserved. 7
4つの側⾯から⾒るBuildKit
dockerd
BuildKit
docker build
Docker API
buildkitd
buildctlなど
任意のツール Cluster
buildkitd
buildkitd
buildkitd
buildkitd
buildctl
buildkitd
Dockerのビルド機能
(`DOCKER_BUILDKIT=1`)
汎⽤Dockerfileビルダ
Dockerfile
任意の
ビルド記
述⾔語
Kubernetes向け
分散ビルダ
汎⽤の
ビルダ/ランタイム
フレームワーク
Dockerfile
Copyright(c)2022 NTT Corp. All Rights Reserved. 8
側⾯1︓Dockerの⼀部(docker build)
l `docker build`の実装(since 18.09)
l 環境変数`DOCKER_BUILDKIT=1`を指定することでBuildKitを有効化できる
l dockerd にBuildKitが直接統合されている
dockerd
BuildKit
docker build
Docker API
Copyright(c)2022 NTT Corp. All Rights Reserved. 9
側⾯2︓汎⽤Dockerfileビルダ
l `buildkitd`というデーモンを使ってDockerfileのビルドが可能(gRPC APIを提供)。 buildkitd
のクライアントとして動作するビルダがある
• Docker Buildx(後述) https://github.com/docker/buildx
• nerdctl: Docker互換のcontainerd CLI https://github.com/containerd/nerdctl
l buildkitが提供するライブラリを使ってbuildkitdをアプリケーションに埋め込むことも可能
• e.g. img https://github.com/genuinetools/img
• Jess Frazelle (Oxide Computer)が開発。daemonless, rootlessなイメージビルダ
img
buildkitd
docker buildx
gRPC API
nerdctl build
buildctl
gRPC API
BuildKit
CLI
Copyright(c)2022 NTT Corp. All Rights Reserved. 10
側⾯3︓Kubernetes向け分散ビルダ
l buildkitdをKubernetes上で分散稼働させることが可能
l さまざまなデプロイパターンがある
Deployment+Service StatefulSet Job
ランダムロードバランシング。
レジストリを介したキャッ
シュ共有により⾼速なビルド
が可能。
クライアント側でのロードバ
ランシング。consistent hash
を使えば効率的にローカル
キャッシュを活⽤可能。
ワンショットなビルド実⾏。
BuildKitデーモンの⻑期稼動が
不要。ローカルキャッシュは
ビルドのたびに削除。
Cluster
BuildKit
buildctl
BuildKit
BuildKit
BuildKit
Service
BuildKit
buildctl
BuildKit
BuildKit BuildKit
buildctl
+
BuildKit
kubectl
Cluster Cluster
https://github.com/moby/buildkit/tree/master/examples/kubernetes
Copyright(c)2022 NTT Corp. All Rights Reserved. 11
側⾯4︓汎⽤のビルダ/ランタイムフレームワーク
l BuildKitはLLBというビルドの中間表現をサポート
l Dockerfileのみならず様々なビルド⽤の⾔語を定義可能
l ビルドだけでなくテストなども実⾏可能なCI/CDフレームワークを提供するプロジェク
トもある(e.g. Earthly, Dagger)
BuildKit
Mockerfile Gockerfile HLB
Earthly
bldr
Nix
Cargo
Wharf
mopy envd
Dockerfile Buildpacks
…
Dagger
(cue)
https://github.com/moby/buildkit#exploring-llb
Copyright(c)2022 NTT Corp. All Rights Reserved. 12
BuildKitの概要
1.
⽬次
3. BuildKitの中⾝の概要
4. BuildKit v0.10からの機能と
これからのBuildKit
2. BuildKitのさまざまな機能
Copyright(c)2022 NTT Corp. All Rights Reserved. 13
並列マルチステージビルド
l 各ステージが並列に実⾏されることで旧`docker build`より⾼速化されている
l 旧`docker build`ではシーケンシャルな実⾏だった
stage C
FROM image AS stage-a
RUN build a
FROM image AS stage-b
RUN build b
FROM scratch
COPY --from=stage-a a /
COPY --from=stage-b b /
stage A stage B
Copyright(c)2022 NTT Corp. All Rights Reserved. 14
Dockerfileの便利構⽂
l type=bind: context中のディレクトリや他のステージなどからマウント可能
RUN --mount
l type=cache: コンパイラなどで使うキャッシュをビルド間で共有できる
l type=secret: 秘密鍵などsecretをイメージに書き込むことなく使⽤可能
l type=ssh: SSH agent経由でSSH keyにアクセスできる
RUN --mount=type=cache,target=/root/.cache/go-build go build …
RUN --mount=type=secret,id=aws,target=/root/.aws/credentials aws s3 cp s3://… …
RUN --mount=type=ssh ssh –q –T git@gitlab.com
docker/dockerfile:1.2
https://github.com/moby/buildkit/blob/v0.10.3/frontend/dockerfile/docs/syntax.md
Copyright(c)2022 NTT Corp. All Rights Reserved. 15
Dockerfileの便利構⽂
l RUN、COPY命令の引数にエスケープ⽂字無しに複数⾏にわたる命令を書ける
l shebangやset命令が使える
heredoc
FROM ubuntu
RUN <<EOT
set -eu -o pipefail
mkdir -p /foo/bar
echo hello > /foo/bar/hello
EOT
FROM python
RUN <<EOT
#!/usr/bin/env python
print(“hello world”)
EOT
docker/dockerfile:1.4
FROM ubuntu
COPY <<EOT /foo
foo
bar
EOT
https://github.com/moby/buildkit/blob/v0.10.3/frontend/dockerfile/docs/syntax.md
Copyright(c)2022 NTT Corp. All Rights Reserved. 16
Dockerfileの便利構⽂
l キャッシュミスがしにくくなるよう最適化が施された
l --link=falseと異なり、COPY先のsymlinkが辿られないという違いに注意
COPY --link docker/dockerfile:1.4
https://github.com/moby/buildkit/blob/v0.10.3/frontend/dockerfile/docs/syntax.md
FROM ubuntu:22.04 AS dev
RUN echo foo > /foo
FROM busybox:1.34
COPY --link --from=dev /foo /
FROM ubuntu:22.04 AS dev
RUN echo foo > /foo
FROM alpine:3.16
COPY --link --from=dev /foo /
キャッシュを使いまわせる
Copyright(c)2022 NTT Corp. All Rights Reserved. 17
マルチプラットフォームイメージ
l ⼀つのイメージに複数のプラットフォーム向けのイメージを詰め込める
l ランタイムは⾃分が稼働するホストのプラットフォームに合うものを選んでpullする
l Docker Buildxでビルド可能[1]: https://medium.com/nttlabs/buildx-multiarch-2c6c2df00ca2
• QEMU使⽤︓簡単(Dockerfileに変更不要)だがパフォーマンスペナルティあり
• Dockerfile内でクロスコンパイラ等使⽤︓早い。Dockerfileに変更が必要
• ターゲットアーキテクチャのマシンを⽤意してSSH経由でビルド︓早い。マシンを別
途⽤意する必要がある
docker buildx build –t my/image –push ¥
--platfom linux/amd64,linux/arm64 .
docker run my/image
Dockerfile
amd64⽤イメージ
arm⽤イメージ
・・・
amd64マシン
armマシン
マルチプラットフォー
ム対応イメージ
pull
pull
[1] Akihiro Suda. “Preparation toward running Docker on ARM Mac: Building multi-arch images with Docker BuildX”. https://medium.com/nttlabs/buildx-multiarch-2c6c2df00ca2
Copyright(c)2022 NTT Corp. All Rights Reserved. 18
リモートキャッシュ
l ビルド結果はBuildKitを実⾏しているホスト上だけでなく、レジストリなどリモートへの
キャッシュ保持が可能
l Kubernetesでの分散ビルドやCIジョブなど、ノード間でキャッシュを共有するのに使える
l レジストリ以外にもGitHub ActionsやS3へのキャッシュ格納もexperimentalにサポート
local registry
inline
BuildKit
cache
ローカルなディレクトリ
にキャッシュ保持
キャッシュ込みのイメー
ジをレジストリにpush
BuildKit
image
+ cache
BuildKit
image cache
イメージとキャッシュを
別々にレジストリにpush
Copyright(c)2022 NTT Corp. All Rights Reserved. 19
LLB︓ビルド定義の中間表現
LLB is to Dockerfile what LLVM IR is to C.
https://github.com/moby/buildkit#exploring-llb
l LLBにさえ変換できれば、任意の⾔語で記述したビルドをBulidKitで実⾏可能
l ビルド⼿順を定義したDAGを表現するデータ構造(protocol buffers)
FROM busybox AS foo
RUN echo foo > /foo
FROM alpine AS bar
RUN echo bar > /bar
FROM scratch
COPY --from=foo /foo /
COPY --from=bar /bar /
LLB
Dockerfile
Copyright(c)2022 NTT Corp. All Rights Reserved. 20
さまざまなBuildKit対応⾔語(⼀部)
Earthly (Earthfile): https://github.com/earthly/earthly
l Earthly TechnologiesによるCI/CDフレームワーク
l MakefileとDockerfileを合わせたような記法でCI/CDのロジックが書ける
Dagger: https://github.com/dagger/dagger
l DaggerによるCI/CDフレームワーク
l cue⾔語でCI/CDロジックが書ける
buildkit-nix: https://github.com/AkihiroSuda/buildkit-nix
l Akihiro Sudaさん(mobyメンテナ, BuildKitメンテナ)が開発
l Nix derivationをDockerfileとして⽤い、イメージをビルドする
対応⾔語のリスト︓https://github.com/moby/buildkit#exploring-llb
• 2022/8/18時点で11個リストされている
• YAMLでビルドを記述するものや、RustやPythonなど特定⾔語のアプリケーションのビル
ドに使えるものなどいろいろある
Copyright(c)2022 NTT Corp. All Rights Reserved. 21
BuildKitの概要
1.
⽬次
3. BuildKitの中⾝の概要
4. BuildKit v0.10からの機能と
これからのBuildKit
2. BuildKitのさまざまな機能
Copyright(c)2022 NTT Corp. All Rights Reserved. 22
BuildKitの構成︓クライアントサーバ
l ⼤局的に⾒ればクライアント・サーバ
• クライアントライブラリが提供されている
• サーバ側はbuildkitdというデーモンプロセス
l サーバはクライアントにgRPC API提供
• ビルド、ビルド結果の出⼒、キャッシュ操作、個
別コンテナ実⾏などが可能
l クライアントとサーバは同⼀ホスト上でなくてもいい
クライアント
サーバ
(buildkitd)
gRPC API
Copyright(c)2022 NTT Corp. All Rights Reserved.
クライアント
23
BuildKitクライアント
l クライアントライブラリを使いサーバにビルドを指⽰
• ビルド定義⾔語の設定
• ビルド結果出⼒先の指定
• キャッシュのインポート・エクスポート先
l BuildKitのAPIは双⽅向
• clientもソースファイル・ビルドコンテキスト・レ
ジストリ認証情報などを提供するgRPC APIを持つ
• buildkitdはビルド中必要に応じてクライアントにそ
れらをリクエスト
サーバ
(buildkitd)
gRPC API経由で
ビルド指⽰
gRPC
client
コンテキストや
credsを都度要求
セッショ
ンサーバ
Copyright(c)2022 NTT Corp. All Rights Reserved. 24
BuildKitクライアントツールの例
l buildctl https://github.com/moby/buildkit
• BuildKitプロジェクトで開発されるCLI
• ビルドやキャッシュ管理などBuildKit APIに⾁薄するひ
ととおりの機能が使える
l Docker Buildx https://github.com/docker/buildx
• Dockerによって開発されるBuildKit向けビルダCLI
• `docker build`にはないBuildKitの機能(リモートキャッ
シュ、multi-platform、Kubernetesでの分散ビルド, etc)
が利⽤可能
サーバ
(buildkitd)
クライアント
gRPC client・session
Copyright(c)2022 NTT Corp. All Rights Reserved. 25
BuildKitサーバ
l ビルドに関するほとんどのことが⾏われる
• ビルド定義のパース
• ビルド、キャッシュ
• ビルド結果のエクスポート, etc…
l gRPC経由で操作⽤のControl APIを公開
• ローカルのunixソケット経由
• リモートのクライアントへの公開も可能
l ビルド定義⾔語をLLBに変換するコンポーネントがプラ
ガブル
• BuildKitにパッチを当てることなく任意の⾔語のサ
ポートが可能
クライアント
サーバ
(buildkitd)
gRPC API
Copyright(c)2022 NTT Corp. All Rights Reserved. 26
BuildKitサーバを構成する主要なコンポーネント
l frontend
• ソース⾔語のパースやLLBへの変換
• プラグインとして拡張可能
l solver
• LLBを実⾏する
• 並列実⾏やキャッシュの利⽤によりビルドを⾼速化
l worker
• コンテナやキャッシュ、snapshot、レイヤコンテンツ、
ビルド結果のエクスポートなどを管理
• runcベースの実装とcontainerdベースの実装がある
• CNI pluginも利⽤可能
クライアント
gRPC API
frontend
solver
worker
サーバ(buildkitd)
Copyright(c)2022 NTT Corp. All Rights Reserved. 27
BuildKit frontendによる任意のビルド⾔語の定義
l ソース⾔語をLLBに変換するコンポーネント
l コンテナとして実装し、BuildKitにプラグイン可能
l フロントエンドコンテナにはstdioを通じてGateway APIと
よばれるgRPC APIが提供される
• このAPI経由でビルドコンテキストを取得
• LLBを作成しその実⾏をこのAPI経由でBuildKitに指⽰
クライアント
gRPC API
frontend
Gateway API提供
(stdio経由)
l Gateway APIはクライアント向けAPIとしても提供される
l クライアントから⾒ると、buildkitd操作⽤API(Control
API)とGateway APIの2つが⾒える
l クライアントにフロントエンド的機能を実装可能
補⾜
サーバ(buildkitd)
コンテナ
Copyright(c)2022 NTT Corp. All Rights Reserved. 28
2種類のフロントエンド
gateway.v0
• コンテナ化された任意のフロントエンドを実⾏
dockerfile.v0
• Dockerfileフロントエンド実装
• BuildKitにビルトインされている
• 構⽂で指定されたフロントエンドをgateway.v0経由で実⾏可能
# syntax=docker/dockerfile:1
• 任意バージョンのdockerfile⽤フロントエンドを使⽤可能。
• BuildKit本体のアップグレードなしにフロントエンドだけ更新できる
• e.g. 最新のDockerfile構⽂を試したり、バグ修正を受け取ったり
# syntax=ghcr.io/akihirosuda/buildkit-nix:v0.0.2
※ イメージ名にダイジェストまで指定することでバージョンの固定もできる
• Nix derivationをDockerfileとして使える
例
# syntax=イメージ名
Copyright(c)2022 NTT Corp. All Rights Reserved. 29
BuildKitの概要
1.
⽬次
3. BuildKitの中⾝の概要
4. BuildKit v0.10からの機能と
これからのBuildKit
2. BuildKitのさまざまな機能
Copyright(c)2022 NTT Corp. All Rights Reserved. 30
BuildKit v0.10/dockerfile v1.4の主な機能
l MergeOpとDiffOp (`COPY --link`命令のサポート)
• MergeOp: 複数の独⽴のファイルシステムをマージする
• キャッシュミスがしにくくなるよう最適化が施された`COPY --link`命令に使われる
• DiffOp: 2つのファイルシステムの差分を求める
l eStargzイメージの作成
• eStargz: イメージの⾼速pull(lazy pulling)を可能にするイメージフォーマット
• イメージのpull完了を待たずにコンテナ起動が可能
• ベースイメージやremote cacheをeStargzにフォーマット可能
• FROM命令のpull完了を待たずに後続のRUN命令などを実⾏可能
$ docker buildx build ¥
-o type=registry,name=ktokunaga/hello:esgz,oci-mediatypes=true,compression=estargz .
Copyright(c)2022 NTT Corp. All Rights Reserved. 31
BuildKit v0.10/dockerfile v1.4の主な機能
l イメージレイヤの圧縮フォーマットとしてzstdがサポート
• Zstandard/zstd: facebookが提案する⾼速な圧縮フォーマット
• https://github.com/facebook/zstd
• OCI Image Specificationでもzstdがイメージレイヤとして定義されている(未リリース)
• https://github.com/opencontainers/image-spec/pull/788
• containerd(>=1.5.0)やPodmanなどのランタイムでもzstdの実⾏がサポートされている
• Dockerにもv22.06でサポートが⼊る予定: https://github.com/moby/moby/pull/41759
Copyright(c)2022 NTT Corp. All Rights Reserved. 32
これからのBuildKitに向けた議論
l FROMのイメージやADDにおけるgit repositoryのバージョンを固定する機能(pinning)
• https://github.com/moby/buildkit/pull/2943
• https://github.com/moby/buildkit/issues/2794
l イメージのレイヤにセットされるtimestampの固定
• https://github.com/moby/buildkit/pull/2918
l Dockerfileのコメントから直接Usageドキュメントを作成する機能
• https://github.com/moby/buildkit/pull/2841
l SBoM⽣成のサポート
• https://github.com/moby/buildkit/issues/2773
Copyright(c)2022 NTT Corp. All Rights Reserved. 33
これからのBuildKitに向けた議論
l Dockerfile⽤の対話的デバッガ https://github.com/ktock/buildg
• breakpointや命令ごとに実際にコンテナを⽴ち上げて中⾝を⾒たりできる
• gdb⾵の対話的CLIや、IDE(VS Code, Neovim, Emacs, …)上のGUIも使える
• 将来的にはbuildxにも統合されるはず
• https://github.com/docker/buildx/issues/1104
Copyright(c)2022 NTT Corp. All Rights Reserved. 34
まとめ
BuildKitの4つの側⾯
機能
仕組み
最近とこれからのBuildKit
• docker build(要`DOCKER_BUILDKIT=1`)
• 汎⽤Dockerfileビルダ
• Kubernetesでのビルド
• 任意のビルド記述⾔語サポート
• 並列マルチステージビルド
• RUN –mountやCOPY –link、heredocなどDockerfile便利構⽂
• マルチプラットフォームイメージのビルド
• リモートキャッシュ
• 任意のビルド定義⾔語の利⽤
• クライアントサーバ
• 任意のfrontendをコンテナとしてプラグイン可能
• MergeOp/DiffOp, eStargz, zstdなど
• サプライチェーンやDockerfileドキュメント⽣成、デバッガなどの議論がある
• Repo: https://github.com/moby/buildkit
• Slack: #buildkit on Docker Community Slack

More Related Content

What's hot

What's hot (20)

Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
 
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
 
eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動
 
containerdの概要と最近の機能
containerdの概要と最近の機能containerdの概要と最近の機能
containerdの概要と最近の機能
 
コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
HTTP/2 入門
HTTP/2 入門HTTP/2 入門
HTTP/2 入門
 
root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす
 
20分でわかるgVisor入門
20分でわかるgVisor入門20分でわかるgVisor入門
20分でわかるgVisor入門
 
コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
 
忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?
 
PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説
 
ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門
 
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
 
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
 

Similar to BuildKitの概要と最近の機能

猫でも分かる Android WebKit
猫でも分かる Android WebKit猫でも分かる Android WebKit
猫でも分かる Android WebKit
Naruto TAKAHASHI
 

Similar to BuildKitの概要と最近の機能 (20)

BuildKitによる高速でセキュアなイメージビルド (LT)
BuildKitによる高速でセキュアなイメージビルド (LT)BuildKitによる高速でセキュアなイメージビルド (LT)
BuildKitによる高速でセキュアなイメージビルド (LT)
 
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
 
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
 
はじめてのAzure Web App for Containers! -コンテナの基礎から DevOps 環境の構築まで-
はじめてのAzure Web App for Containers! -コンテナの基礎から DevOps 環境の構築まで-はじめてのAzure Web App for Containers! -コンテナの基礎から DevOps 環境の構築まで-
はじめてのAzure Web App for Containers! -コンテナの基礎から DevOps 環境の構築まで-
 
[Docker Tokyo #35] Docker 20.10
[Docker Tokyo #35] Docker 20.10[Docker Tokyo #35] Docker 20.10
[Docker Tokyo #35] Docker 20.10
 
Japan Container Day 2018
Japan Container Day 2018Japan Container Day 2018
Japan Container Day 2018
 
Kube con + cloudnativecon 2017 社内報告会(外部公開用)
Kube con + cloudnativecon 2017 社内報告会(外部公開用)Kube con + cloudnativecon 2017 社内報告会(外部公開用)
Kube con + cloudnativecon 2017 社内報告会(外部公開用)
 
Kubernetes1.9でWindowsコンテナーをクラスタ化
Kubernetes1.9でWindowsコンテナーをクラスタ化Kubernetes1.9でWindowsコンテナーをクラスタ化
Kubernetes1.9でWindowsコンテナーをクラスタ化
 
Kubernetes Meetup Tokyo #8 Self-hosted Kubernetes を調べてみた
Kubernetes Meetup Tokyo #8 Self-hosted Kubernetes を調べてみたKubernetes Meetup Tokyo #8 Self-hosted Kubernetes を調べてみた
Kubernetes Meetup Tokyo #8 Self-hosted Kubernetes を調べてみた
 
Docker Meetup tpkyo #30 kubecon recap
Docker Meetup tpkyo #30 kubecon recapDocker Meetup tpkyo #30 kubecon recap
Docker Meetup tpkyo #30 kubecon recap
 
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~
実践 Web App for Containers! ~コンテナ開発の基礎からDevOps環境の構築まで~
 
Node.jsアプリの開発をモダン化するために取り組んできたこと
Node.jsアプリの開発をモダン化するために取り組んできたことNode.jsアプリの開発をモダン化するために取り組んできたこと
Node.jsアプリの開発をモダン化するために取り組んできたこと
 
SpringOne Platform Replay -Pivotal Cloud Foundry-
SpringOne Platform Replay -Pivotal Cloud Foundry-SpringOne Platform Replay -Pivotal Cloud Foundry-
SpringOne Platform Replay -Pivotal Cloud Foundry-
 
Go 製リアルタイムサーバーの Kubernetes での運用について
Go 製リアルタイムサーバーの  Kubernetes での運用についてGo 製リアルタイムサーバーの  Kubernetes での運用について
Go 製リアルタイムサーバーの Kubernetes での運用について
 
[CNDT] 最近のDockerの新機能
[CNDT] 最近のDockerの新機能[CNDT] 最近のDockerの新機能
[CNDT] 最近のDockerの新機能
 
猫でも分かる Android WebKit
猫でも分かる Android WebKit猫でも分かる Android WebKit
猫でも分かる Android WebKit
 
Github入門2014
Github入門2014Github入門2014
Github入門2014
 
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
 
Kubernetes Meetup Tokyo #35_GitOps Toolkit による Kubernetes マニフェスト CD
Kubernetes Meetup Tokyo #35_GitOps Toolkit による Kubernetes マニフェスト CDKubernetes Meetup Tokyo #35_GitOps Toolkit による Kubernetes マニフェスト CD
Kubernetes Meetup Tokyo #35_GitOps Toolkit による Kubernetes マニフェスト CD
 
GitHub Actions で CI/CD
GitHub Actions で CI/CDGitHub Actions で CI/CD
GitHub Actions で CI/CD
 

More from Kohei Tokunaga

More from Kohei Tokunaga (14)

P2P Container Image Distribution on IPFS With containerd and nerdctl
P2P Container Image Distribution on IPFS With containerd and nerdctlP2P Container Image Distribution on IPFS With containerd and nerdctl
P2P Container Image Distribution on IPFS With containerd and nerdctl
 
Faster Container Image Distribution on a Variety of Tools with Lazy Pulling
Faster Container Image Distribution on a Variety of Tools with Lazy PullingFaster Container Image Distribution on a Variety of Tools with Lazy Pulling
Faster Container Image Distribution on a Variety of Tools with Lazy Pulling
 
Introduction and Deep Dive Into Containerd
Introduction and Deep Dive Into ContainerdIntroduction and Deep Dive Into Containerd
Introduction and Deep Dive Into Containerd
 
DockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐるDockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐる
 
Starting up Containers Super Fast With Lazy Pulling of Images
Starting up Containers Super Fast With Lazy Pulling of ImagesStarting up Containers Super Fast With Lazy Pulling of Images
Starting up Containers Super Fast With Lazy Pulling of Images
 
Build and Run Containers With Lazy Pulling - Adoption status of containerd St...
Build and Run Containers With Lazy Pulling - Adoption status of containerd St...Build and Run Containers With Lazy Pulling - Adoption status of containerd St...
Build and Run Containers With Lazy Pulling - Adoption status of containerd St...
 
BuildKitでLazy Pullを有効にしてビルドを早くする話
BuildKitでLazy Pullを有効にしてビルドを早くする話BuildKitでLazy Pullを有効にしてビルドを早くする話
BuildKitでLazy Pullを有効にしてビルドを早くする話
 
The overview of lazypull with containerd Remote Snapshotter & Stargz Snapshotter
The overview of lazypull with containerd Remote Snapshotter & Stargz SnapshotterThe overview of lazypull with containerd Remote Snapshotter & Stargz Snapshotter
The overview of lazypull with containerd Remote Snapshotter & Stargz Snapshotter
 
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動するStargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
 
Startup Containers in Lightning Speed with Lazy Image Distribution
Startup Containers in Lightning Speed with Lazy Image DistributionStartup Containers in Lightning Speed with Lazy Image Distribution
Startup Containers in Lightning Speed with Lazy Image Distribution
 
Stargz Snapshotter: イメージのpullを省略してcontainerdでコンテナを高速に起動する
Stargz Snapshotter: イメージのpullを省略してcontainerdでコンテナを高速に起動するStargz Snapshotter: イメージのpullを省略してcontainerdでコンテナを高速に起動する
Stargz Snapshotter: イメージのpullを省略してcontainerdでコンテナを高速に起動する
 
OCIランタイムの筆頭「runc」を俯瞰する
OCIランタイムの筆頭「runc」を俯瞰するOCIランタイムの筆頭「runc」を俯瞰する
OCIランタイムの筆頭「runc」を俯瞰する
 
OCIv2?!軽量高速なイケてる次世代イメージ仕様の最新動向を抑えよう!
OCIv2?!軽量高速なイケてる次世代イメージ仕様の最新動向を抑えよう!OCIv2?!軽量高速なイケてる次世代イメージ仕様の最新動向を抑えよう!
OCIv2?!軽量高速なイケてる次世代イメージ仕様の最新動向を抑えよう!
 
5分で振り返るKubeCon EU 2019:ランタイムとイメージの話題ダイジェスト
5分で振り返るKubeCon EU 2019:ランタイムとイメージの話題ダイジェスト5分で振り返るKubeCon EU 2019:ランタイムとイメージの話題ダイジェスト
5分で振り返るKubeCon EU 2019:ランタイムとイメージの話題ダイジェスト
 

BuildKitの概要と最近の機能

  • 1. Copyright(c)2022 NTT Corp. All Rights Reserved. BuildKitの概要と最近の機能 2022/8/20 ⽇本電信電話株式会社 ソフトウェアイノベーションセンタ 徳永 航平 Container Runtime Meetup #4
  • 2. Copyright(c)2022 NTT Corp. All Rights Reserved. 2 名前 徳永 航平 GitHub:@ktock / Twitter:@TokunagaKohei 所属 ⽇本電信電話株式会社 興味 コンテナ、特にコンテナランタイム containerdレビュワ、BuildKitメンテナ Container Runtime Meetup共同運営
  • 3. Copyright(c)2022 NTT Corp. All Rights Reserved. 3 ⽬次 BuildKitの概要 1. 3. BuildKitの中⾝の概要 4. BuildKit v0.10からの機能と これからのBuildKit 2. BuildKitのさまざまな機能
  • 4. Copyright(c)2022 NTT Corp. All Rights Reserved. 4 BuildKitの概要 1. ⽬次 3. BuildKitの中⾝の概要 4. BuildKit v0.10からの機能と これからのBuildKit 2. BuildKitのさまざまな機能
  • 5. Copyright(c)2022 NTT Corp. All Rights Reserved. 5 BuildKitの概要 l Moby傘下のコンテナビルダプロジェクト l `docker build`(要`DOCKER_BUILDKIT=1`)のコアコンポーネント(since 18.09) l Dockerに限らずKubernetes上でのビルドや汎⽤のビルダフレームワークとして も使われる l Moby&Docker, img, OpenFaaS Cloud, container build interface, Tekton Pipelines, The Sanic builud tool, vab, Rio, kim, PouchContainer, Docker Buildx, Okteto Cloud, Earthly earthfiles, Gitpod, Dagger, envd l 対応⾔語︓Dockerfile, Buildipacks, Mockerfile, Gockerfile, bldr, HLB, Earthly, Cargo Wharf, Nix, mopy, envd, cue(Dagger) 採⽤例 https://github.com/moby/buildkit#used-by https://github.com/moby/buildkit#exploring-llb
  • 6. Copyright(c)2022 NTT Corp. All Rights Reserved. 6 BuildKitプロジェクトのあゆみ 2018 2019 2020 2021 2022 v0.3.0 v0.4.0 v0.5.0 v0.8.0 v0.10.0 (10⽉) (3⽉) (4⽉) (12⽉) (3⽉) 〜2017 [1] https://docs.docker.com/engine/release-notes/18.09/#new-features ; [2] https://docs.docker.com/engine/release-notes/19.03/#19030 ; [3] https://github.com/knative/build-templates/pull/70 ; [4] https://github.com/tektoncd/catalog/pull/20 ; [5] https://github.com/moby/buildkit/pull/1446 ; [6] https://github.com/moby/buildkit/pull/2522 ; [7] https://github.com/moby/buildkit/pull/2615 v0.6.0 (8⽉) v0.7.0 (3⽉) v0.9.0 (7⽉) 11⽉ Docker Engine 18.09に採⽤[1] 3⽉ Docker EngineにBuildx plugin採⽤[2] 10⽉ Knative Build Templateに採⽤[3] 5⽉ Tektonに採⽤※[4] 4⽉ Earthlyに採⽤※ [5] ※ BuildKitプロジェクトへの報告⽇基準 12⽉ Gitpodに採⽤※ [6] 2⽉ Daggerに採⽤※ [7]
  • 7. Copyright(c)2022 NTT Corp. All Rights Reserved. 7 4つの側⾯から⾒るBuildKit dockerd BuildKit docker build Docker API buildkitd buildctlなど 任意のツール Cluster buildkitd buildkitd buildkitd buildkitd buildctl buildkitd Dockerのビルド機能 (`DOCKER_BUILDKIT=1`) 汎⽤Dockerfileビルダ Dockerfile 任意の ビルド記 述⾔語 Kubernetes向け 分散ビルダ 汎⽤の ビルダ/ランタイム フレームワーク Dockerfile
  • 8. Copyright(c)2022 NTT Corp. All Rights Reserved. 8 側⾯1︓Dockerの⼀部(docker build) l `docker build`の実装(since 18.09) l 環境変数`DOCKER_BUILDKIT=1`を指定することでBuildKitを有効化できる l dockerd にBuildKitが直接統合されている dockerd BuildKit docker build Docker API
  • 9. Copyright(c)2022 NTT Corp. All Rights Reserved. 9 側⾯2︓汎⽤Dockerfileビルダ l `buildkitd`というデーモンを使ってDockerfileのビルドが可能(gRPC APIを提供)。 buildkitd のクライアントとして動作するビルダがある • Docker Buildx(後述) https://github.com/docker/buildx • nerdctl: Docker互換のcontainerd CLI https://github.com/containerd/nerdctl l buildkitが提供するライブラリを使ってbuildkitdをアプリケーションに埋め込むことも可能 • e.g. img https://github.com/genuinetools/img • Jess Frazelle (Oxide Computer)が開発。daemonless, rootlessなイメージビルダ img buildkitd docker buildx gRPC API nerdctl build buildctl gRPC API BuildKit CLI
  • 10. Copyright(c)2022 NTT Corp. All Rights Reserved. 10 側⾯3︓Kubernetes向け分散ビルダ l buildkitdをKubernetes上で分散稼働させることが可能 l さまざまなデプロイパターンがある Deployment+Service StatefulSet Job ランダムロードバランシング。 レジストリを介したキャッ シュ共有により⾼速なビルド が可能。 クライアント側でのロードバ ランシング。consistent hash を使えば効率的にローカル キャッシュを活⽤可能。 ワンショットなビルド実⾏。 BuildKitデーモンの⻑期稼動が 不要。ローカルキャッシュは ビルドのたびに削除。 Cluster BuildKit buildctl BuildKit BuildKit BuildKit Service BuildKit buildctl BuildKit BuildKit BuildKit buildctl + BuildKit kubectl Cluster Cluster https://github.com/moby/buildkit/tree/master/examples/kubernetes
  • 11. Copyright(c)2022 NTT Corp. All Rights Reserved. 11 側⾯4︓汎⽤のビルダ/ランタイムフレームワーク l BuildKitはLLBというビルドの中間表現をサポート l Dockerfileのみならず様々なビルド⽤の⾔語を定義可能 l ビルドだけでなくテストなども実⾏可能なCI/CDフレームワークを提供するプロジェク トもある(e.g. Earthly, Dagger) BuildKit Mockerfile Gockerfile HLB Earthly bldr Nix Cargo Wharf mopy envd Dockerfile Buildpacks … Dagger (cue) https://github.com/moby/buildkit#exploring-llb
  • 12. Copyright(c)2022 NTT Corp. All Rights Reserved. 12 BuildKitの概要 1. ⽬次 3. BuildKitの中⾝の概要 4. BuildKit v0.10からの機能と これからのBuildKit 2. BuildKitのさまざまな機能
  • 13. Copyright(c)2022 NTT Corp. All Rights Reserved. 13 並列マルチステージビルド l 各ステージが並列に実⾏されることで旧`docker build`より⾼速化されている l 旧`docker build`ではシーケンシャルな実⾏だった stage C FROM image AS stage-a RUN build a FROM image AS stage-b RUN build b FROM scratch COPY --from=stage-a a / COPY --from=stage-b b / stage A stage B
  • 14. Copyright(c)2022 NTT Corp. All Rights Reserved. 14 Dockerfileの便利構⽂ l type=bind: context中のディレクトリや他のステージなどからマウント可能 RUN --mount l type=cache: コンパイラなどで使うキャッシュをビルド間で共有できる l type=secret: 秘密鍵などsecretをイメージに書き込むことなく使⽤可能 l type=ssh: SSH agent経由でSSH keyにアクセスできる RUN --mount=type=cache,target=/root/.cache/go-build go build … RUN --mount=type=secret,id=aws,target=/root/.aws/credentials aws s3 cp s3://… … RUN --mount=type=ssh ssh –q –T git@gitlab.com docker/dockerfile:1.2 https://github.com/moby/buildkit/blob/v0.10.3/frontend/dockerfile/docs/syntax.md
  • 15. Copyright(c)2022 NTT Corp. All Rights Reserved. 15 Dockerfileの便利構⽂ l RUN、COPY命令の引数にエスケープ⽂字無しに複数⾏にわたる命令を書ける l shebangやset命令が使える heredoc FROM ubuntu RUN <<EOT set -eu -o pipefail mkdir -p /foo/bar echo hello > /foo/bar/hello EOT FROM python RUN <<EOT #!/usr/bin/env python print(“hello world”) EOT docker/dockerfile:1.4 FROM ubuntu COPY <<EOT /foo foo bar EOT https://github.com/moby/buildkit/blob/v0.10.3/frontend/dockerfile/docs/syntax.md
  • 16. Copyright(c)2022 NTT Corp. All Rights Reserved. 16 Dockerfileの便利構⽂ l キャッシュミスがしにくくなるよう最適化が施された l --link=falseと異なり、COPY先のsymlinkが辿られないという違いに注意 COPY --link docker/dockerfile:1.4 https://github.com/moby/buildkit/blob/v0.10.3/frontend/dockerfile/docs/syntax.md FROM ubuntu:22.04 AS dev RUN echo foo > /foo FROM busybox:1.34 COPY --link --from=dev /foo / FROM ubuntu:22.04 AS dev RUN echo foo > /foo FROM alpine:3.16 COPY --link --from=dev /foo / キャッシュを使いまわせる
  • 17. Copyright(c)2022 NTT Corp. All Rights Reserved. 17 マルチプラットフォームイメージ l ⼀つのイメージに複数のプラットフォーム向けのイメージを詰め込める l ランタイムは⾃分が稼働するホストのプラットフォームに合うものを選んでpullする l Docker Buildxでビルド可能[1]: https://medium.com/nttlabs/buildx-multiarch-2c6c2df00ca2 • QEMU使⽤︓簡単(Dockerfileに変更不要)だがパフォーマンスペナルティあり • Dockerfile内でクロスコンパイラ等使⽤︓早い。Dockerfileに変更が必要 • ターゲットアーキテクチャのマシンを⽤意してSSH経由でビルド︓早い。マシンを別 途⽤意する必要がある docker buildx build –t my/image –push ¥ --platfom linux/amd64,linux/arm64 . docker run my/image Dockerfile amd64⽤イメージ arm⽤イメージ ・・・ amd64マシン armマシン マルチプラットフォー ム対応イメージ pull pull [1] Akihiro Suda. “Preparation toward running Docker on ARM Mac: Building multi-arch images with Docker BuildX”. https://medium.com/nttlabs/buildx-multiarch-2c6c2df00ca2
  • 18. Copyright(c)2022 NTT Corp. All Rights Reserved. 18 リモートキャッシュ l ビルド結果はBuildKitを実⾏しているホスト上だけでなく、レジストリなどリモートへの キャッシュ保持が可能 l Kubernetesでの分散ビルドやCIジョブなど、ノード間でキャッシュを共有するのに使える l レジストリ以外にもGitHub ActionsやS3へのキャッシュ格納もexperimentalにサポート local registry inline BuildKit cache ローカルなディレクトリ にキャッシュ保持 キャッシュ込みのイメー ジをレジストリにpush BuildKit image + cache BuildKit image cache イメージとキャッシュを 別々にレジストリにpush
  • 19. Copyright(c)2022 NTT Corp. All Rights Reserved. 19 LLB︓ビルド定義の中間表現 LLB is to Dockerfile what LLVM IR is to C. https://github.com/moby/buildkit#exploring-llb l LLBにさえ変換できれば、任意の⾔語で記述したビルドをBulidKitで実⾏可能 l ビルド⼿順を定義したDAGを表現するデータ構造(protocol buffers) FROM busybox AS foo RUN echo foo > /foo FROM alpine AS bar RUN echo bar > /bar FROM scratch COPY --from=foo /foo / COPY --from=bar /bar / LLB Dockerfile
  • 20. Copyright(c)2022 NTT Corp. All Rights Reserved. 20 さまざまなBuildKit対応⾔語(⼀部) Earthly (Earthfile): https://github.com/earthly/earthly l Earthly TechnologiesによるCI/CDフレームワーク l MakefileとDockerfileを合わせたような記法でCI/CDのロジックが書ける Dagger: https://github.com/dagger/dagger l DaggerによるCI/CDフレームワーク l cue⾔語でCI/CDロジックが書ける buildkit-nix: https://github.com/AkihiroSuda/buildkit-nix l Akihiro Sudaさん(mobyメンテナ, BuildKitメンテナ)が開発 l Nix derivationをDockerfileとして⽤い、イメージをビルドする 対応⾔語のリスト︓https://github.com/moby/buildkit#exploring-llb • 2022/8/18時点で11個リストされている • YAMLでビルドを記述するものや、RustやPythonなど特定⾔語のアプリケーションのビル ドに使えるものなどいろいろある
  • 21. Copyright(c)2022 NTT Corp. All Rights Reserved. 21 BuildKitの概要 1. ⽬次 3. BuildKitの中⾝の概要 4. BuildKit v0.10からの機能と これからのBuildKit 2. BuildKitのさまざまな機能
  • 22. Copyright(c)2022 NTT Corp. All Rights Reserved. 22 BuildKitの構成︓クライアントサーバ l ⼤局的に⾒ればクライアント・サーバ • クライアントライブラリが提供されている • サーバ側はbuildkitdというデーモンプロセス l サーバはクライアントにgRPC API提供 • ビルド、ビルド結果の出⼒、キャッシュ操作、個 別コンテナ実⾏などが可能 l クライアントとサーバは同⼀ホスト上でなくてもいい クライアント サーバ (buildkitd) gRPC API
  • 23. Copyright(c)2022 NTT Corp. All Rights Reserved. クライアント 23 BuildKitクライアント l クライアントライブラリを使いサーバにビルドを指⽰ • ビルド定義⾔語の設定 • ビルド結果出⼒先の指定 • キャッシュのインポート・エクスポート先 l BuildKitのAPIは双⽅向 • clientもソースファイル・ビルドコンテキスト・レ ジストリ認証情報などを提供するgRPC APIを持つ • buildkitdはビルド中必要に応じてクライアントにそ れらをリクエスト サーバ (buildkitd) gRPC API経由で ビルド指⽰ gRPC client コンテキストや credsを都度要求 セッショ ンサーバ
  • 24. Copyright(c)2022 NTT Corp. All Rights Reserved. 24 BuildKitクライアントツールの例 l buildctl https://github.com/moby/buildkit • BuildKitプロジェクトで開発されるCLI • ビルドやキャッシュ管理などBuildKit APIに⾁薄するひ ととおりの機能が使える l Docker Buildx https://github.com/docker/buildx • Dockerによって開発されるBuildKit向けビルダCLI • `docker build`にはないBuildKitの機能(リモートキャッ シュ、multi-platform、Kubernetesでの分散ビルド, etc) が利⽤可能 サーバ (buildkitd) クライアント gRPC client・session
  • 25. Copyright(c)2022 NTT Corp. All Rights Reserved. 25 BuildKitサーバ l ビルドに関するほとんどのことが⾏われる • ビルド定義のパース • ビルド、キャッシュ • ビルド結果のエクスポート, etc… l gRPC経由で操作⽤のControl APIを公開 • ローカルのunixソケット経由 • リモートのクライアントへの公開も可能 l ビルド定義⾔語をLLBに変換するコンポーネントがプラ ガブル • BuildKitにパッチを当てることなく任意の⾔語のサ ポートが可能 クライアント サーバ (buildkitd) gRPC API
  • 26. Copyright(c)2022 NTT Corp. All Rights Reserved. 26 BuildKitサーバを構成する主要なコンポーネント l frontend • ソース⾔語のパースやLLBへの変換 • プラグインとして拡張可能 l solver • LLBを実⾏する • 並列実⾏やキャッシュの利⽤によりビルドを⾼速化 l worker • コンテナやキャッシュ、snapshot、レイヤコンテンツ、 ビルド結果のエクスポートなどを管理 • runcベースの実装とcontainerdベースの実装がある • CNI pluginも利⽤可能 クライアント gRPC API frontend solver worker サーバ(buildkitd)
  • 27. Copyright(c)2022 NTT Corp. All Rights Reserved. 27 BuildKit frontendによる任意のビルド⾔語の定義 l ソース⾔語をLLBに変換するコンポーネント l コンテナとして実装し、BuildKitにプラグイン可能 l フロントエンドコンテナにはstdioを通じてGateway APIと よばれるgRPC APIが提供される • このAPI経由でビルドコンテキストを取得 • LLBを作成しその実⾏をこのAPI経由でBuildKitに指⽰ クライアント gRPC API frontend Gateway API提供 (stdio経由) l Gateway APIはクライアント向けAPIとしても提供される l クライアントから⾒ると、buildkitd操作⽤API(Control API)とGateway APIの2つが⾒える l クライアントにフロントエンド的機能を実装可能 補⾜ サーバ(buildkitd) コンテナ
  • 28. Copyright(c)2022 NTT Corp. All Rights Reserved. 28 2種類のフロントエンド gateway.v0 • コンテナ化された任意のフロントエンドを実⾏ dockerfile.v0 • Dockerfileフロントエンド実装 • BuildKitにビルトインされている • 構⽂で指定されたフロントエンドをgateway.v0経由で実⾏可能 # syntax=docker/dockerfile:1 • 任意バージョンのdockerfile⽤フロントエンドを使⽤可能。 • BuildKit本体のアップグレードなしにフロントエンドだけ更新できる • e.g. 最新のDockerfile構⽂を試したり、バグ修正を受け取ったり # syntax=ghcr.io/akihirosuda/buildkit-nix:v0.0.2 ※ イメージ名にダイジェストまで指定することでバージョンの固定もできる • Nix derivationをDockerfileとして使える 例 # syntax=イメージ名
  • 29. Copyright(c)2022 NTT Corp. All Rights Reserved. 29 BuildKitの概要 1. ⽬次 3. BuildKitの中⾝の概要 4. BuildKit v0.10からの機能と これからのBuildKit 2. BuildKitのさまざまな機能
  • 30. Copyright(c)2022 NTT Corp. All Rights Reserved. 30 BuildKit v0.10/dockerfile v1.4の主な機能 l MergeOpとDiffOp (`COPY --link`命令のサポート) • MergeOp: 複数の独⽴のファイルシステムをマージする • キャッシュミスがしにくくなるよう最適化が施された`COPY --link`命令に使われる • DiffOp: 2つのファイルシステムの差分を求める l eStargzイメージの作成 • eStargz: イメージの⾼速pull(lazy pulling)を可能にするイメージフォーマット • イメージのpull完了を待たずにコンテナ起動が可能 • ベースイメージやremote cacheをeStargzにフォーマット可能 • FROM命令のpull完了を待たずに後続のRUN命令などを実⾏可能 $ docker buildx build ¥ -o type=registry,name=ktokunaga/hello:esgz,oci-mediatypes=true,compression=estargz .
  • 31. Copyright(c)2022 NTT Corp. All Rights Reserved. 31 BuildKit v0.10/dockerfile v1.4の主な機能 l イメージレイヤの圧縮フォーマットとしてzstdがサポート • Zstandard/zstd: facebookが提案する⾼速な圧縮フォーマット • https://github.com/facebook/zstd • OCI Image Specificationでもzstdがイメージレイヤとして定義されている(未リリース) • https://github.com/opencontainers/image-spec/pull/788 • containerd(>=1.5.0)やPodmanなどのランタイムでもzstdの実⾏がサポートされている • Dockerにもv22.06でサポートが⼊る予定: https://github.com/moby/moby/pull/41759
  • 32. Copyright(c)2022 NTT Corp. All Rights Reserved. 32 これからのBuildKitに向けた議論 l FROMのイメージやADDにおけるgit repositoryのバージョンを固定する機能(pinning) • https://github.com/moby/buildkit/pull/2943 • https://github.com/moby/buildkit/issues/2794 l イメージのレイヤにセットされるtimestampの固定 • https://github.com/moby/buildkit/pull/2918 l Dockerfileのコメントから直接Usageドキュメントを作成する機能 • https://github.com/moby/buildkit/pull/2841 l SBoM⽣成のサポート • https://github.com/moby/buildkit/issues/2773
  • 33. Copyright(c)2022 NTT Corp. All Rights Reserved. 33 これからのBuildKitに向けた議論 l Dockerfile⽤の対話的デバッガ https://github.com/ktock/buildg • breakpointや命令ごとに実際にコンテナを⽴ち上げて中⾝を⾒たりできる • gdb⾵の対話的CLIや、IDE(VS Code, Neovim, Emacs, …)上のGUIも使える • 将来的にはbuildxにも統合されるはず • https://github.com/docker/buildx/issues/1104
  • 34. Copyright(c)2022 NTT Corp. All Rights Reserved. 34 まとめ BuildKitの4つの側⾯ 機能 仕組み 最近とこれからのBuildKit • docker build(要`DOCKER_BUILDKIT=1`) • 汎⽤Dockerfileビルダ • Kubernetesでのビルド • 任意のビルド記述⾔語サポート • 並列マルチステージビルド • RUN –mountやCOPY –link、heredocなどDockerfile便利構⽂ • マルチプラットフォームイメージのビルド • リモートキャッシュ • 任意のビルド定義⾔語の利⽤ • クライアントサーバ • 任意のfrontendをコンテナとしてプラグイン可能 • MergeOp/DiffOp, eStargz, zstdなど • サプライチェーンやDockerfileドキュメント⽣成、デバッガなどの議論がある • Repo: https://github.com/moby/buildkit • Slack: #buildkit on Docker Community Slack