CloudNative Days Spring 2021 ONLINE キーノートでの発表資料です。
https://event.cloudnativedays.jp/cndo2021/talks/1071
本セッションでは、DockerとKubernetesのもつ基本的な機能の概要を、コンテナの仕組みをふまえつつイラストを用いて紹介していきます。一般にあまり焦点をあてて取り上げられることは多くありませんが、コンテナの作成や管理を担う低レベルなソフトウェア「コンテナランタイム」も本セッションの中心的なトピックのひとつです。
本セッションは、拙著「イラストで分かるDockerとKubernetes」(技術評論社)の内容を参考にしています。
https://www.amazon.co.jp/dp/4297118378
CloudNative Days Spring 2021 ONLINE キーノートでの発表資料です。
https://event.cloudnativedays.jp/cndo2021/talks/1071
本セッションでは、DockerとKubernetesのもつ基本的な機能の概要を、コンテナの仕組みをふまえつつイラストを用いて紹介していきます。一般にあまり焦点をあてて取り上げられることは多くありませんが、コンテナの作成や管理を担う低レベルなソフトウェア「コンテナランタイム」も本セッションの中心的なトピックのひとつです。
本セッションは、拙著「イラストで分かるDockerとKubernetes」(技術評論社)の内容を参考にしています。
https://www.amazon.co.jp/dp/4297118378
This presentation was used for Japan Container Days 2018.
I explained the important point to use the k8s on Production environment for Japanese Audience.
P2P Container Image Distribution on IPFS With containerd and nerdctlKohei Tokunaga
Talked at FOSDEM 2022 about IPFS-based P2P image distribution with containerd and nerdctl (Feburary 6, 2022).
https://fosdem.org/2022/schedule/event/container_ipfs_image/
nerdctl is a Docker-compatible CLI of containerd, developed as a subproject of containerd. nerdctl recently added support of P2P image distribution on IPFS. This enables to share container images among hosts without hosting or relying on the registry.
In this session, Kohei, one of the maintainers of nerdctl, will introduce IPFS-based P2P image distribution with containerd and nerdctl. This session will also show the combination of IPFS-based distribution with the existing image distribution techniques, focusing on lazy pulling (eStargz) and image encryption (OCIcrypt). The status of integration work with other tools including Kubernetes will also be shared.
Related blog post: "P2P Container Image Distribution on IPFS With Containerd" . https://medium.com/nttlabs/nerdctl-ipfs-975569520e3d
Faster Container Image Distribution on a Variety of Tools with Lazy PullingKohei Tokunaga
Talked at KubeCon + CloudNativeCon North America 2021 Virtual about lazy pulling of container images with eStargz and nydus (October 14, 2021).
https://kccncna2021.sched.com/event/lV2a
Starting up Containers Super Fast With Lazy Pulling of ImagesKohei Tokunaga
Talked at Container Plumbing Days about speeding up container startup by lazy pulling images on Kubernetes, containerd, BuildKit, Podman and CRI-O with eStargz and zstd:chunked.
eStargz and Stargz Snapshotter: https://github.com/containerd/stargz-snapshotter
zstd:chunked proposal: https://github.com/containers/storage/pull/775
Patch set to enable lazy pulling on Podman and CRI-O (a.k.a. Additional Layer Store): https://github.com/containers/storage/pull/795
https://github.com/containerd/stargz-snapshotter/pull/281
Build and Run Containers With Lazy Pulling - Adoption status of containerd St...Kohei Tokunaga
Talked about lazy pulling of container images with eStargz and Stargz Snapshotter at FOSDEM 2021.
Details: https://fosdem.org/2021/schedule/event/containers_lazy_pull/
Stargz Snapshotter: https://github.com/containerd/stargz-snapshotter
CloudNative Days Tokyo 2020での、lazypullに関する発表資料です。https://event.cloudnativedays.jp/cndt2020/talks/16
Stargz Snapshotterのリポジトリ:
https://github.com/containerd/stargz-snapshotter
Startup Containers in Lightning Speed with Lazy Image DistributionKohei Tokunaga
Talked about lazy container image distribution technologies including containerd + Stargz Snapshotter ( https://github.com/containerd/stargz-snapshotter ) at KubeCon+CloudNativeCon Europe 2020 Virtual.
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)
コンテナ
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