SlideShare a Scribd company logo
1 of 44
Download to read offline
Copyright©2017 NTT Corp. All Rights Reserved.
⽇本電信電話(株)
ソフトウェアイノベーションセンタ
須⽥ 瑛⼤
<suda.akihiro@lab.ntt.co.jp>
⾼速にコンテナを起動できる
イメージフォーマット
BDI研究会 (2017/8/1)
スライド: https://www.slideshare.net/AkihiroSuda
2
Copyright©2017 NTT Corp. All Rights Reserved.
• GitHub: @AkihiroSuda / Twitter: @_AkihiroSuda_
• コンテナ関連OSSのメンテナ(所謂コミッタ)
• Docker Moby Core メンテナ
• BuildKit イニシャルメンテナ (github.com/moby/buildkit)
• 次世代 `docker build` (DockerfileをDAG化し並⾏実⾏)
• またの機会にこちらについても詳しく..
⾃⼰紹介
2017年4⽉,DockerプロジェクトはMobyプロジェクトに移⾏した.
Mobyプロジェクトの成果物を元として,Docker製品が開発されている.
: ≒ :
RHEL Fedora
3
Copyright©2017 NTT Corp. All Rights Reserved.
• `docker pull` し終わる前に`docker run`可能になるような
イメージフォーマットを提案
• 例えば Docker公式のOpenJDKイメージは全体で672MBある
が7MB pullした時点でsh起動可能になる
• 88MBでJRE,137MBでJDK
• その他,重複除去などの利点もあり
• OCI標準仕様との互換性を重視
お話しする内容
4
Copyright©2017 NTT Corp. All Rights Reserved.
• Dockerとは
• Docker・OCIイメージの構成・問題
• 提案するイメージフォーマット
• 今後の技術的・コミュニティ的な取り組み⽅針
• デモ (時間があれば)
アウトライン
5
Copyright©2017 NTT Corp. All Rights Reserved.
Dockerとは
• いわゆるコンテナ型仮想化基盤
• 仮想マシンより軽い
• イメージの作成・共有が簡単
• 昔のjailなどとの⼤きな違い
• 分散実⾏にも対応
• 標準: Swarm-mode / 3rd party: Kubernetes など
FROM ubuntu:17.04
RUN apt-get install foobar
COPY foobar.conf /etc
Dockerfileをコミットする
イメージがビルドされる
クラスタにデプロイできる
6
Copyright©2017 NTT Corp. All Rights Reserved.
• Linuxカーネルが備えるcgroups・namespaceと,Copy-on-Write
(CoW)ファイルシステムとを組み合わせて実装されている
• AUFS, OverlayFS, BtrFS, ZFSに対応.DeviceMapperでのCoWにも対応.
• 対応しているディストリビューションや,安定性などの特性が違う
• Dockerfileの1⾏毎にCoWレイヤーが⽣成される
• イメージサイズは⼩さく抑えるのが鉄則 (VMとは使い勝⼿が違う)
• ⼩さいイメージを多数組み合わせて,マイクロサービス化する
• とは⾔っても,現実にはなかなか⼩さくしにくいものである
• ⼩さくしやすくする試みとしては,OracleのMicrocontainer (Smith)などが最近出てきている
Dockerとは
FROM ubuntu:17.04
RUN apt-get install foobar
COPY foobar.conf /etc
mount –t overlay –o lowerdir=0,upperdir=1 ..
mount –t overlay –o lowerdir=1,upperdir=2 ..
7
Copyright©2017 NTT Corp. All Rights Reserved.
• DockerのCoWレイヤは,AUFSレイヤを固めたtarファイルとしてイメー
ジ化される
• 実際のCoWファイルシステムがOverlayFSでもDeviceMapperでも,AUFSレイヤー
のtarとして表現される
• QCOW2など,ハイパーバイザ⽤のブロックレベルのCoW技術とは対照的
Docker・OCIイメージの構成
後で説明します
TAR
TAR
FROM ubuntu:17.04
RUN apt-get install foobar
COPY foobar.conf /etc
mount –t overlay –o lowerdir=0,upperdir=1 ..
mount –t overlay –o lowerdir=1,upperdir=2 ..
ベースレイヤは普通のtar
• 追加・変更されたファイル
• 削除されたファイルの情報
(whiteoutファイル)
TAR
/bin/bash
/bin/ls ...
/usr/bin/foobar
/usr/lib/libfoobar.so ...
/etc/foobar.conf
8
Copyright©2017 NTT Corp. All Rights Reserved.
• TARファイルや,環境変数のJSONなどが,merkle tree構造を持つblob
ストアに格納される
• ⼀般にDocker Registryを⽤いて配信する.(バックエンドはS3やSwiftなど)
Docker・OCIイメージの構成
{
"schemaVersion": 2,
"manifests": [
{
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"size": 7143,
"digest":
"sha256:e692418e4cbaf90ca69d05a66403747baa33ee08806650b51fab815ad7fc331f"
}
}
/index.json
/blobs/sha256/e692418e...
... (次スライド)
JSON
JSON
9
Copyright©2017 NTT Corp. All Rights Reserved.
/blobs/sha256/e692418e...
{
"schemaVersion": 2,
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"size": 7023,
"digest": "sha256:b5b2b2c507a0944348e0303114d8d93aaaa081732b86451d9bce1f432a537bc7"
},
"layers": [
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"size": 33554432,
"digest": "sha256:61be55a8e2f6b4e172338bddf184d6dbee29c98853e0a0485ecee7f27b9af0b4"
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"size": 1073741824,
"digest": "sha256:3c3a4604a545cdc127456d94e421cd355bca5b528f4a9c1905b15da2eb4a4c6b"
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"size": 73109,
"digest": "sha256:ec4b8955958665577945c89419d1af06b5f7636b4ac3da7f12184802ad867736"
}
]
}
/blobs/sha256/b5b2b2c5...
(環境変数などのJSON)
/blobs/sha256/61be55a8...
(ベースレイヤのtar)
/blobs/sha256/3c3a4604...
(差分レイヤのtar)
/blobs/sha256/ec4b8955...
(更なる差分レイヤのtar)
TAR
TAR
TAR
JSON
JSON
10
Copyright©2017 NTT Corp. All Rights Reserved.
• merkle tree構造を持っているので,manifestのSHA256値を指定すれば,
確実に環境を再現できる
(`docker pull foobar@sha256:e692418e..`)
Docker・OCIイメージの構成
/index.json
/blobs/sha256/e692418e...
/blobs/sha256/b5b2b2c5...
/blobs/sha256/61be55a8...
/blobs/sha256/3c3a4604...
/blobs/sha256/ec4b8955...
Index
Manifest
環境変数などのconfig
AUFSレイヤのtar群
merkle tree
11
Copyright©2017 NTT Corp. All Rights Reserved.
• 2017年7⽉,Linux Foundation傘下のOpen Containers Initiative
によりOCIイメージ仕様の策定完了
• CoreOS陣営が提案していたappc・ACIもOCIに合流した
• データ構造はDockerイメージと類似しており,⾼い互換性を持つが,
Docker Registry HTTP APIに依存しなくなった.
HTTP, NFS, IPFSなど,ディレクトリ的なセマンティックを持つ任意のプ
ロトコルで配信可能.
• 個⼈的にはIPFSなどP2Pを⽤いたイメージ配信に期待
• Dockerでも,近々正式に実装予定.
• ※混同に注意: Dockerfileの構⽂・命令が標準化されたわけではない
OCIイメージ≒Dockerイメージ
12
Copyright©2017 NTT Corp. All Rights Reserved.
• tar = Tape ARchiverが現れたのは1979年 (UNIX 7th Edition)
• 磁気テープ前提のフォーマットのため,本来はDocker・OCIのユースケース
に合っていない
Docker・OCIイメージの問題
1970年代のUNIXがターゲットとしていた
PDP-11 ミニコンピュータ &
磁気テープドライブ
https://en.wikipedia.org/wiki/PDP-11
13
Copyright©2017 NTT Corp. All Rights Reserved.
• tar内のファイルの⼀覧がわからない
⇒テープ全体を読み終わるまでmountできない
• ファイルがどのオフセットにあるかわからない
(tarとは別に索引を作成したとしても,
tarがgzipなどで圧縮されていると,
どのみちseekできない)
問題1: 「テープ」全体を⾛査しないとメタデータを取得できない
メタデータ0
ファイル0
メタデータ1
ファイル2
メタデータ{n-1}
ファイル{n-1}
終端 zero (1024B)
...
ファイル名や
パーミッションなど
ファイル内容
14
Copyright©2017 NTT Corp. All Rights Reserved.
問題1: 「テープ」全体を⾛査しないとメタデータを取得できない
この問題が解決できれば,メタデータだけpullした時点でmount(2)しておき,
ファイル本体はread(2)が発⽣した時点でlazyにpullできるようになる!
• 巨⼤なコンテナイメージを多数のノードに配信する場合,起動時間短縮・ネッ
トワーク負荷軽減できて嬉しい
ユースケース
• ⼤量のHTMLや画像ファイルを含むWebアプリケーション
• 様々なビッグデータとコードとをひとまとめにしたイメージ
• 論⽂を`docker run foo@sha256:deadbeef..` 1発で確実に再現できる世界
になると嬉しい
• 巨⼤なOS (GNOME・KDE⼊りの仮想デスクトップ環境や,Windowsなど)
• 巨⼤な⾔語ランタイム (Java,.NETなど)
• 複数のソフトウェアを結合試験する環境 など
15
Copyright©2017 NTT Corp. All Rights Reserved.
• 1つのレジストリで,複数の似たようなイメージを配信することを考える
• バージョン違い
• アーキテクチャ違い
• 設定違い など
• 同じファイルを多数含むtarであっても,別々のblobになるため,ストレ
ージが無駄になる
問題2: blobの重複を除去できない
FROM ubuntu:17.04
RUN apt-get install foo
FROM ubuntu:17.04
RUN apt-get install foo bar
FROM debian:9
RUN apt-get install foo
FROM ubuntu:17.04
RUN echo … > /etc/apt/source.list
RUN apt-get install foo
同じファイルを多数含んでいるが別物
16
Copyright©2017 NTT Corp. All Rights Reserved.
• 巨⼤なtarレイヤのblobは,複数のrangeに分けて,複数のコネクション
を使って並列にpullしたい
• 複数のサーバを利⽤できる場合,短時間でのpull完了が⾒込まれる
• しかし任意のプロトコルで可能なわけではない
• HTTP/1.1 Range Requestsは RFC7233 にてOPTIONALとされている
問題3: ⼀般に,単⼀レイヤを分割して並列にpullできない
Range 0-1023 Range 1024-2047
17
Copyright©2017 NTT Corp. All Rights Reserved.
1. 「テープ」全体を⾛査しないとメタデータを取得できない
2. 重複除去できない
3. ⼀般に,単⼀レイヤを分割して並列にpullできない
Docker・OCIイメージの問題 まとめ
18
Copyright©2017 NTT Corp. All Rights Reserved.
提案するイメージフォーマット
FILEgrain(仮称) https://github.com/AkihiroSuda/filegrain
19
Copyright©2017 NTT Corp. All Rights Reserved.
• 単⼀のtar blobを,ファイル毎に別個のblobに崩す
• 各ファイルのSHA256ダイジェストをメタデータに記載しcontent-addressableにする
• メタデータのblobさえpullすれば,getdents(2)やstat(2)できるので,
イメージ全体をpullせず,mount(2)・コンテナ起動可能
• read(2)が発⽣した段階で初めて,lazyにpullすればよい
提案するイメージフォーマットの概略
メタデータ0
ファイル0
メタデータ1
ファイル2
メタデータ{n-1}
ファイル{n-1}
終端 zero (1024B)
...
メタデータ0 ファイル0
メタデータ1
ファイル2
メタデータ{n-1} ファイル{n-1}
...
TAR
continuity ファイル名,パーミッション,
SHA256ダイジェストなど
content-addressable
20
Copyright©2017 NTT Corp. All Rights Reserved.
• メタデータはcontinuityで表現する
• continuity.. containerdコミュニティで提案されている,ファイルシステ
ムメタデータ記述フォーマット
(https://github.com/containerd/continuity)
• ファイル名,パーミッション,xattr(7),ダイジェスト値などをProtocolBuffers形式で
シリアライズする
• 次世代containerd(下位ランタイム)のテストで使われているほか,
Docker・Mobyでもイメージ検証に使う案がある (moby-core#32153)
• 類似フォーマットにBSDのmtree(8)がある
• 将来的にcontainerdに統合したいので,containerdコミュニティ系のcontinuityにした
• containerdコミュニティについては最後の⽅のスライドで説明
(Docker・Kubernetes共通の次世代ランタイム)
メタデータのフォーマット
21
Copyright©2017 NTT Corp. All Rights Reserved.
• 単⼀のOCIイメージ中に,普通のOCIマニフェストと,提案フォーマットのマ
ニフェストの両⽅を格納できる
• ⇒提案フォーマットに対応・未対応のソフトウェアを容易に共存させることができる
OCIイメージとの互換性を重視
/index.json
/blobs/sha256/e692...
/blobs/sha256/b5b2... /blobs/sha256/61be...
/blobs/sha256/3c3a...
/blobs/sha256/ec4b...
Index
OCI Manifest
環境変数などのconfig (共通)
AUFSレイヤのtar群
/blobs/sha256/a8e3...
提案フォーマットのManifest
/blobs/sha256/de81...
continuity
/blobs/sha256/583f...
/blobs/sha256/3af1...
/blobs/sha256/5c2a...
/blobs/sha256/39c1...
/blobs/sha256/12ea... ばらされたファイル群(⼤量)
`docker pull foo:v1-filegrain` `docker pull foo:v1`
{"v1-filegrain": "sha256:a8e3..", "v1":"sha256:e692.."}
22
Copyright©2017 NTT Corp. All Rights Reserved.
• 普通のOCIのtarレイヤに,提案フォーマットのレイヤを重ね合わせること
ができるので,⽋点を補い合うことができる
• 細かい⼤量のファイルは普通のtarにまとめるほうが,I/Oが1回で済むし,圧縮率向上
も期待できるので,速い場合もある
OCIイメージとの互換性を重視
{
...
"layers": [
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"size": 33554432,
"digest": "sha256:e692..."
},
{
"mediaType": "application/vnd.continuity.layer.v0+pb",
"size": 16724,
"digest": "sha256:a18b..."
}
]
}
TAR
continuity
頻繁に使うファイルや,
細かいファイルは
普通のOCIのレイヤ
(pullし終わるまでコンテナ
を起動できない)
かさばるファイルは提案フォーマットのレイヤ
(lazyにpullできるが細かいファイルに不向き)
23
Copyright©2017 NTT Corp. All Rights Reserved.
問題1.「テープ」全体を⾛査しないとメタデータを取得できない
⇒ continuityのblobだけpullすればメタデータを取得できる.
ファイル本体をpullする前にmount・コンテナ起動可能.
問題2. 重複除去できない
⇒ ファイルを細かいblobにばらしたので,同じファイルを含むレイヤは⾃
ずと重複除去される
問題3. ⼀般に,単⼀レイヤを分割して並列にpullできない
⇒ ファイルを細かいblobにばらしたので,並列にpullできる
Docker・OCIイメージの問題を解決できる
24
Copyright©2017 NTT Corp. All Rights Reserved.
1. blob数の肥⼤化
• イメージをファイルシステム上に配置する場合,/blobs/sha256 ディレクトリに⼤
量のファイルが出来るため,readdir(3) が遅くなりがち
• /blobs/sha256/deadbeef..を/blobs/sha256/de/deadbeef..のように"sharding"する
テクニックは不可 (OCIとの互換性のため)
2. RPCオーバヘッド増⼤
• 細かいファイルは単⼀のtarにまとめてpullするほうがRPCが少なくて済む
3. イメージによっては圧縮率低下
• 似たようなファイルを多数含むレイヤは,従来通り,単⼀のtarにまとめると⾼い圧
縮率が期待される
ただし,前述の通り,従来のOCIレイヤとの重ね合わせでカバー可能
提案フォーマットの⽋点
25
Copyright©2017 NTT Corp. All Rights Reserved.
没案: 外部ストアを併⽤する
⇒特定のプロトコルに依存するし,OCIのmerkle treeを使えなくなること
があり,環境再現性・セキュリティ⾯での懸念があるため,没
なぜ他の⽅法にしないか
類似研究:
Harter, Tyler, et al. "Slacker: Fast Distribution with Lazy Docker Containers." FAST. 2016.
• NFS上のext4イメージをループバックマウントし,ブロック粒度でのlazy-pull,重複除去を実現
Lestaris, George. "Alternatives to layer-based image distribution: using CERN filesystem for
images." Container Camp UK. 2016.
Blomer, Jakob, et al. "A Novel Approach for Distributing and Managing Container Images:
Integrating CernVM File System and Mesos." MesosCon NA. 2016.
• CernVM-FSを⽤いて,ファイル粒度でのlazy-pull,重複除去を実現
• CernVM-FSもmerkle treeを持っているが,OCIのmerkle treeに接ぎ⽊するには⼀⼿間要りそう
IPFS(P2Pでcontent-addressableなファイルシステム)の使⽤も考えたが,特定プロトコルに依存したく
なかったので没
※提案フォーマットはHTTPでもNFSでもCernVM-FSでもIPFSでも,任意のプロトコルで配信可能
26
Copyright©2017 NTT Corp. All Rights Reserved.
没案2: tarを先頭からseekしていけばよいのではないか?
⇒没
• 圧縮されたtarではseek不可能
• ⾮圧縮tarでもプロトコルによってはseekできない
• メタデータ全体をとるためのリクエストが多発
なぜ他の⽅法にしないか
メタデータ0
ファイル0
メタデータ1
ファイル2
メタデータ{n-1}
ファイル{n-1}
終端 zero (1024B)
...
ファイル本体を読み⾶ばしてseekし
メタデータだけ先に集める?
TAR
27
Copyright©2017 NTT Corp. All Rights Reserved.
没案3: tarの代わりにzip(など)にすればよいのではないか?
⇒プロトコルによってはseekできないし,zipはメタデータのサポートが弱
いので没
なぜ他の⽅法にしないか
ZIP
予備メタデータ0
圧縮済ファイル0
予備メタデータ1
圧縮済ファイル2
予備メタデータ{n-1}
圧縮済ファイル{n-1}
...
フッタ
メタデータ0
メタデータ1
...
メタデータ{n-1}
メタデータだけまとめて先にpullできる?
28
Copyright©2017 NTT Corp. All Rights Reserved.
評価
29
Copyright©2017 NTT Corp. All Rights Reserved.
• read-onlyなFUSEファイルシステムとして実装
• 将来的にもread-onlyのままのつもり
• コンテナはVMとは違い,immutableにするのが鉄則./tmp, /runとパーシステントボ
リューム以外への書き込みは⾏うべきではない.
• /tmpや/runは⼀般にtmpfsを別途マウントする
• パーシステントボリュームは,ホスト側のext4やXFSをbind-mountする
• 実際,OverlayFSやAUFSも書き込み操作のサポートは限定的
(https://github.com/AkihiroSuda/docker-issues)
• 1つのファイルに対してROなfdとRWなfdを両⽅openし,書き込むと,ROな⽅が意図しない
結果を返す.(yumなど実際のアプリケーションに影響するが,バグではなくoverlayの仕様)
• 今のところ,Dockerは任意にmountされたrootfsを使えないので,
Dockerそのものには統合できていない.runc (Docker, containerdの下
位ランタイム)を⽤いて評価した.
実装
30
Copyright©2017 NTT Corp. All Rights Reserved.
評価に⽤いたイメージ
イメージ 説明 rootfs
(tar+gzip展開後)
openjdk:8
sha256:5da842d59f76009fa27ffde06888ebd
560c7ad17607d7cd1e52fc0757c9a45fb
Debian 9.1, OpenJDK 8u141 671.7MB
kdeneon/all
sha256:e3e7f216a5f8f1fdcff4eab8807d7af
cd291c050099ab3e8a8355b7b28a19247
Ubuntu 16.04, KDE Plasma 5.10,
Firefox 54など
4.8GB
kaggle/python
sha256:335103c998aea22a5608c2eeca7dcf1
09e0828ed233b75f5098182c5b058fe98
Debian 8.5, 様々な機械学習フレー
ムワーク, NLTKデータセット(⾃然
⾔語関連)など
8.3GB
※詳細な再現⼿順は https://github.com/AkihiroSuda/filegrain/issues/17 に掲載.
31
Copyright©2017 NTT Corp. All Rights Reserved.
• openjdk:8 (総blob容量 = 671.7MB + メタ 5.4MB)
• マウント: 5.4MB ( 2 blobs)
• イメージ本体のblobではなく,メタデータ(manifestとcontinuity)の読み込み
• `sh`: 累計 7.3MB ( 8 blobs)
• `java –version`: 累計 88.2MB ( 30 blobs)
• `javac HelloWorld.java`: 累計137.3MB ( 50 blobs)
• kdeneon/all (4.8GB + 34.5MB)
• マウント: 34.5MB ( 2 blobs)
• `sh`: 累計36.7MB ( 8 blobs)
• `startkde`: 累計742.7MB (4,267 blobs)
• `firefox`: 累計866.6MB (4,506 blobs)
※各コマンドは続けて起動
評価: コンテナ起動に必要なblob量 (無圧縮)
1/5
1/5 以下
32
Copyright©2017 NTT Corp. All Rights Reserved.
• kaggle/python (8.3GB + 38.2MB)
• マウント: 38.2MB ( 2 blobs)
• `sh`: 累計 40.1MB ( 8 blobs)
• `ipython –c ʻecho(“hello”)ʼ`: 累計 75.4MB (1033 blobs)
• `ipython –c ʻimport nltkʼ`: 累計352.0MiB (2799 blobs)
評価: コンテナ起動に必要なblob量 (無圧縮)
1/24 以下
33
Copyright©2017 NTT Corp. All Rights Reserved.
評価: 圧縮率
イメージ rootfs 従来のtarをまと
めてgzip -9
提案フォーマット
+各blobを個別
にgzip -9
openjdk:8 671.7MB 261.3MB 260.7MB
(-645,604B)
kdeneon/all 4.8GB 2.1GB 2.1GB
(-489,361B)
kaggle/python 8.3GB 3.6GB 3.6GB
(+4,345,701B)
今回試験したイメージでは圧縮率の違いは誤差の範囲
(似たようなblobが多いイメージでは圧縮率は悪くなりそう)
34
Copyright©2017 NTT Corp. All Rights Reserved.
評価: 重複除去
kdeneon/all
(4.8GB)
kaggle/python
(8.3GB)
75.4MB の重複を除去できる
(互いに全然関係なさそうなイメージだが,
Debian系に共通のファイルがあるため重複blobがある)
35
Copyright©2017 NTT Corp. All Rights Reserved.
評価: FUSEのオーバヘッド
0.1
1
10
100
1回⽬ 2回⽬ 3回⽬ 4回⽬ 5回⽬ 6回⽬ 7回⽬ 8回⽬ 9回⽬ 10回⽬
openjdkの/usr以下をtarで固めるのに要する秒数
従来のDocker (overlay2) 提案フォーマットのFUSE(read-only)
Docker 17.06 / Fedora 26 / 2 vCPUs, 2GB RAM, 2GB swap (VMware Fusion, MacBook Pro 2016)
36
Copyright©2017 NTT Corp. All Rights Reserved.
評価: FUSEのオーバヘッド
0.1
1
10
100
1回⽬ 2回⽬ 3回⽬ 4回⽬ 5回⽬ 6回⽬ 7回⽬ 8回⽬ 9回⽬ 10回⽬
openjdkの/usr以下をtarで固めるのに要する秒数
従来のDocker (overlay2) 提案フォーマットのFUSE(read-only)
提案⼿法ではコンテナ起動後,readが発⽣して初めてblobをpullする.
そのため初回データにはpullの時間を含む.
(今回はlocalhostがリモートなのでネットワークのオーバヘッドは含まない).
※従来Dockerの⽅は,イメージをpullしてからコンテナ起動するので
pullの時間は含んでいない.
37
Copyright©2017 NTT Corp. All Rights Reserved.
評価: FUSEのオーバヘッド
0.1
1
10
100
1回⽬ 2回⽬ 3回⽬ 4回⽬ 5回⽬ 6回⽬ 7回⽬ 8回⽬ 9回⽬ 10回⽬
openjdkの/usr以下をtarで固めるのに要する秒数
従来のDocker (overlay2) 提案フォーマットのFUSE(read-only)
カーネルのキャッシュが効いて速くなる
実装上の何らかの理由で
カーネルのキャッシュが効いていない?
(read-onlyなので原理的には簡単なはず.楽観的.)
38
Copyright©2017 NTT Corp. All Rights Reserved.
• PullのためのRPCの数が増えることのオーバヘッド
• プロトコルに依存する
• TODO: Docker Registry APIのクライアントを実装し評価する.
• 現在のPOCはローカルディレクトリをレジストリ代わりにしている.
評価: その他
39
Copyright©2017 NTT Corp. All Rights Reserved.
今後の⽅針
40
Copyright©2017 NTT Corp. All Rights Reserved.
• ファイルより細かい粒度への対応
• ⼤きいファイルはchunk毎にSHA256ダイジェストを計算し,continuityとはまた別
のフォーマットとして保存しておけばよい (continuity#85)
• コンテナ起動時にすぐ必要となりそうなファイルを検出し,予め1つのtar
にまとめておく
• pushする前に1回コンテナを起動し,FUSEの呼び出しをトレースしておけばよい
今後の技術的な⽅針
41
Copyright©2017 NTT Corp. All Rights Reserved.
• 現在,Dockerは多数の”LEGOブロック”へ分解・再編成されつつある最中
• ガバナンスの明確化
• 拡張モジュール開発の容易化
コミュニティ的な取り組み⽅針
Docker CLI
Moby Core (dockerd)
containerd
runc
BuildKit (buildd) SwarmKit (swarmd)
CLI (これだけはDocker社がコミット権独占)
各モジュールのAPIを統合
分散実⾏Dockerfile的なDAGを実⾏
cgroups, namespace
OCIイメージ・CoW FSなど
⾚枠内はKubernetesとも共通する (今後,Dockerの代わりのランタイムとして選択可能になる)
提案フォーマットをcontainerd周辺に導⼊することを⽬指す
(DockerやKubernetesの拡張機能として簡単に使えるようにする)
42
Copyright©2017 NTT Corp. All Rights Reserved.
まとめ
43
Copyright©2017 NTT Corp. All Rights Reserved.
• `docker pull` し終わる前に`docker run`可能になるような
イメージフォーマットを提案
• https://github.com/AkihiroSuda/filegrain
• 例えば Docker公式のOpenJDKイメージは全体で672MBある
が7MB pullした時点でsh起動可能になる
• 88MBでJRE,137MBでJDK
• その他,重複除去などの利点もあり
• OCI標準仕様との互換性を重視
まとめ
44
Copyright©2017 NTT Corp. All Rights Reserved.
デモ (時間があれば)

More Related Content

What's hot

PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)NTT DATA Technology & Innovation
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーToru Makabe
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかShogo Wakayama
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)NTT DATA Technology & Innovation
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話Kumazaki Hiroki
 
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Masahito Zembutsu
 
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)NTT DATA Technology & Innovation
 
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)NTT DATA Technology & Innovation
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知るShuhei Fujita
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話Daichi Koike
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法Tetsutaro Watanabe
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)Kuniyasu Suzaki
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルMasahito Zembutsu
 

What's hot (20)

PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
 
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
 
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
 
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
 
Vacuum徹底解説
Vacuum徹底解説Vacuum徹底解説
Vacuum徹底解説
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクル
 
Keycloakの最近のトピック
Keycloakの最近のトピックKeycloakの最近のトピック
Keycloakの最近のトピック
 

Similar to 高速にコンテナを起動できるイメージフォーマット

高速にコンテナを起動できるイメージフォーマット (NTT Tech Conference #2)
高速にコンテナを起動できるイメージフォーマット (NTT Tech Conference #2)高速にコンテナを起動できるイメージフォーマット (NTT Tech Conference #2)
高速にコンテナを起動できるイメージフォーマット (NTT Tech Conference #2)Akihiro Suda
 
Moby Project (May 25, 2017, Tokyo)
Moby Project (May 25, 2017, Tokyo)Moby Project (May 25, 2017, Tokyo)
Moby Project (May 25, 2017, Tokyo)Akihiro Suda
 
Rootlessコンテナ
RootlessコンテナRootlessコンテナ
RootlessコンテナAkihiro Suda
 
root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす Akihiro Suda
 
次世代の高速メモリストレージ利用に向けたソフトウェアのモダナイゼーション
次世代の高速メモリストレージ利用に向けたソフトウェアのモダナイゼーション次世代の高速メモリストレージ利用に向けたソフトウェアのモダナイゼーション
次世代の高速メモリストレージ利用に向けたソフトウェアのモダナイゼーションNTT Software Innovation Center
 
BuildKitによる高速でセキュアなイメージビルド (LT)
BuildKitによる高速でセキュアなイメージビルド (LT)BuildKitによる高速でセキュアなイメージビルド (LT)
BuildKitによる高速でセキュアなイメージビルド (LT)Akihiro Suda
 
日本と世界のDockerコミュニティ
日本と世界のDockerコミュニティ日本と世界のDockerコミュニティ
日本と世界のDockerコミュニティAkihiro Suda
 
Dockerコミュニティ近況
Dockerコミュニティ近況Dockerコミュニティ近況
Dockerコミュニティ近況Akihiro Suda
 
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)NTT DATA Technology & Innovation
 
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望Tetsuo Yamabe
 
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)Akihiro Suda
 
GitLabを骨までしゃぶりつくす@ゆるUniStudy#7
GitLabを骨までしゃぶりつくす@ゆるUniStudy#7GitLabを骨までしゃぶりつくす@ゆるUniStudy#7
GitLabを骨までしゃぶりつくす@ゆるUniStudy#7Wataru NOGUCHI
 
2012 0623-x-road-tokyo-xoops-x(ten)
2012 0623-x-road-tokyo-xoops-x(ten)2012 0623-x-road-tokyo-xoops-x(ten)
2012 0623-x-road-tokyo-xoops-x(ten)Naoki Okino
 
OpenStack Summit 2017 Boston 報告会 サミット全体概要
OpenStack Summit 2017 Boston 報告会 サミット全体概要OpenStack Summit 2017 Boston 報告会 サミット全体概要
OpenStack Summit 2017 Boston 報告会 サミット全体概要Yukinori Sagara
 
.NET Coreとツール類の今
.NET Coreとツール類の今.NET Coreとツール類の今
.NET Coreとツール類の今Yuki Igarashi
 
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜Takashi Uemura
 

Similar to 高速にコンテナを起動できるイメージフォーマット (20)

高速にコンテナを起動できるイメージフォーマット (NTT Tech Conference #2)
高速にコンテナを起動できるイメージフォーマット (NTT Tech Conference #2)高速にコンテナを起動できるイメージフォーマット (NTT Tech Conference #2)
高速にコンテナを起動できるイメージフォーマット (NTT Tech Conference #2)
 
Moby Project (May 25, 2017, Tokyo)
Moby Project (May 25, 2017, Tokyo)Moby Project (May 25, 2017, Tokyo)
Moby Project (May 25, 2017, Tokyo)
 
Rootlessコンテナ
RootlessコンテナRootlessコンテナ
Rootlessコンテナ
 
root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす
 
WiredTigerを詳しく説明
WiredTigerを詳しく説明WiredTigerを詳しく説明
WiredTigerを詳しく説明
 
次世代の高速メモリストレージ利用に向けたソフトウェアのモダナイゼーション
次世代の高速メモリストレージ利用に向けたソフトウェアのモダナイゼーション次世代の高速メモリストレージ利用に向けたソフトウェアのモダナイゼーション
次世代の高速メモリストレージ利用に向けたソフトウェアのモダナイゼーション
 
BuildKitによる高速でセキュアなイメージビルド (LT)
BuildKitによる高速でセキュアなイメージビルド (LT)BuildKitによる高速でセキュアなイメージビルド (LT)
BuildKitによる高速でセキュアなイメージビルド (LT)
 
Moby Project
Moby ProjectMoby Project
Moby Project
 
日本と世界のDockerコミュニティ
日本と世界のDockerコミュニティ日本と世界のDockerコミュニティ
日本と世界のDockerコミュニティ
 
Dockerコミュニティ近況
Dockerコミュニティ近況Dockerコミュニティ近況
Dockerコミュニティ近況
 
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
 
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
 
第六回Jenkins勉強会
第六回Jenkins勉強会第六回Jenkins勉強会
第六回Jenkins勉強会
 
私とOSSの25年
私とOSSの25年私とOSSの25年
私とOSSの25年
 
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
 
GitLabを骨までしゃぶりつくす@ゆるUniStudy#7
GitLabを骨までしゃぶりつくす@ゆるUniStudy#7GitLabを骨までしゃぶりつくす@ゆるUniStudy#7
GitLabを骨までしゃぶりつくす@ゆるUniStudy#7
 
2012 0623-x-road-tokyo-xoops-x(ten)
2012 0623-x-road-tokyo-xoops-x(ten)2012 0623-x-road-tokyo-xoops-x(ten)
2012 0623-x-road-tokyo-xoops-x(ten)
 
OpenStack Summit 2017 Boston 報告会 サミット全体概要
OpenStack Summit 2017 Boston 報告会 サミット全体概要OpenStack Summit 2017 Boston 報告会 サミット全体概要
OpenStack Summit 2017 Boston 報告会 サミット全体概要
 
.NET Coreとツール類の今
.NET Coreとツール類の今.NET Coreとツール類の今
.NET Coreとツール類の今
 
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
 

More from Akihiro Suda

20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...Akihiro Suda
 
20240321 [KubeCon EU Pavilion] Lima.pdf_
20240321 [KubeCon EU Pavilion] Lima.pdf_20240321 [KubeCon EU Pavilion] Lima.pdf_
20240321 [KubeCon EU Pavilion] Lima.pdf_Akihiro Suda
 
20240320 [KubeCon EU Pavilion] containerd.pdf
20240320 [KubeCon EU Pavilion] containerd.pdf20240320 [KubeCon EU Pavilion] containerd.pdf
20240320 [KubeCon EU Pavilion] containerd.pdfAkihiro Suda
 
20240201 [HPC Containers] Rootless Containers.pdf
20240201 [HPC Containers] Rootless Containers.pdf20240201 [HPC Containers] Rootless Containers.pdf
20240201 [HPC Containers] Rootless Containers.pdfAkihiro Suda
 
[Podman Special Event] Kubernetes in Rootless Podman
[Podman Special Event] Kubernetes in Rootless Podman[Podman Special Event] Kubernetes in Rootless Podman
[Podman Special Event] Kubernetes in Rootless PodmanAkihiro Suda
 
[KubeConNA2023] Lima pavilion
[KubeConNA2023] Lima pavilion[KubeConNA2023] Lima pavilion
[KubeConNA2023] Lima pavilionAkihiro Suda
 
[KubeConNA2023] containerd pavilion
[KubeConNA2023] containerd pavilion[KubeConNA2023] containerd pavilion
[KubeConNA2023] containerd pavilionAkihiro Suda
 
[DockerConハイライト] OpenPubKeyによるイメージの署名と検証.pdf
[DockerConハイライト] OpenPubKeyによるイメージの署名と検証.pdf[DockerConハイライト] OpenPubKeyによるイメージの署名と検証.pdf
[DockerConハイライト] OpenPubKeyによるイメージの署名と検証.pdfAkihiro Suda
 
[CNCF TAG-Runtime] Usernetes Gen2
[CNCF TAG-Runtime] Usernetes Gen2[CNCF TAG-Runtime] Usernetes Gen2
[CNCF TAG-Runtime] Usernetes Gen2Akihiro Suda
 
[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...
[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...
[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...Akihiro Suda
 
The internals and the latest trends of container runtimes
The internals and the latest trends of container runtimesThe internals and the latest trends of container runtimes
The internals and the latest trends of container runtimesAkihiro Suda
 
[KubeConEU2023] Lima pavilion
[KubeConEU2023] Lima pavilion[KubeConEU2023] Lima pavilion
[KubeConEU2023] Lima pavilionAkihiro Suda
 
[KubeConEU2023] containerd pavilion
[KubeConEU2023] containerd pavilion[KubeConEU2023] containerd pavilion
[KubeConEU2023] containerd pavilionAkihiro Suda
 
[Container Plumbing Days 2023] Why was nerdctl made?
[Container Plumbing Days 2023] Why was nerdctl made?[Container Plumbing Days 2023] Why was nerdctl made?
[Container Plumbing Days 2023] Why was nerdctl made?Akihiro Suda
 
[FOSDEM2023] Bit-for-bit reproducible builds with Dockerfile
[FOSDEM2023] Bit-for-bit reproducible builds with Dockerfile[FOSDEM2023] Bit-for-bit reproducible builds with Dockerfile
[FOSDEM2023] Bit-for-bit reproducible builds with DockerfileAkihiro Suda
 
[CNCF TAG-Runtime 2022-10-06] Lima
[CNCF TAG-Runtime 2022-10-06] Lima[CNCF TAG-Runtime 2022-10-06] Lima
[CNCF TAG-Runtime 2022-10-06] LimaAkihiro Suda
 
[KubeCon EU 2022] Running containerd and k3s on macOS
[KubeCon EU 2022] Running containerd and k3s on macOS[KubeCon EU 2022] Running containerd and k3s on macOS
[KubeCon EU 2022] Running containerd and k3s on macOSAkihiro Suda
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...
[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...
[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...Akihiro Suda
 
[Docker Tokyo #35] Docker 20.10
[Docker Tokyo #35] Docker 20.10[Docker Tokyo #35] Docker 20.10
[Docker Tokyo #35] Docker 20.10Akihiro Suda
 

More from Akihiro Suda (20)

20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
 
20240321 [KubeCon EU Pavilion] Lima.pdf_
20240321 [KubeCon EU Pavilion] Lima.pdf_20240321 [KubeCon EU Pavilion] Lima.pdf_
20240321 [KubeCon EU Pavilion] Lima.pdf_
 
20240320 [KubeCon EU Pavilion] containerd.pdf
20240320 [KubeCon EU Pavilion] containerd.pdf20240320 [KubeCon EU Pavilion] containerd.pdf
20240320 [KubeCon EU Pavilion] containerd.pdf
 
20240201 [HPC Containers] Rootless Containers.pdf
20240201 [HPC Containers] Rootless Containers.pdf20240201 [HPC Containers] Rootless Containers.pdf
20240201 [HPC Containers] Rootless Containers.pdf
 
[Podman Special Event] Kubernetes in Rootless Podman
[Podman Special Event] Kubernetes in Rootless Podman[Podman Special Event] Kubernetes in Rootless Podman
[Podman Special Event] Kubernetes in Rootless Podman
 
[KubeConNA2023] Lima pavilion
[KubeConNA2023] Lima pavilion[KubeConNA2023] Lima pavilion
[KubeConNA2023] Lima pavilion
 
[KubeConNA2023] containerd pavilion
[KubeConNA2023] containerd pavilion[KubeConNA2023] containerd pavilion
[KubeConNA2023] containerd pavilion
 
[DockerConハイライト] OpenPubKeyによるイメージの署名と検証.pdf
[DockerConハイライト] OpenPubKeyによるイメージの署名と検証.pdf[DockerConハイライト] OpenPubKeyによるイメージの署名と検証.pdf
[DockerConハイライト] OpenPubKeyによるイメージの署名と検証.pdf
 
[CNCF TAG-Runtime] Usernetes Gen2
[CNCF TAG-Runtime] Usernetes Gen2[CNCF TAG-Runtime] Usernetes Gen2
[CNCF TAG-Runtime] Usernetes Gen2
 
[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...
[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...
[DockerCon 2023] Reproducible builds with BuildKit for software supply chain ...
 
The internals and the latest trends of container runtimes
The internals and the latest trends of container runtimesThe internals and the latest trends of container runtimes
The internals and the latest trends of container runtimes
 
[KubeConEU2023] Lima pavilion
[KubeConEU2023] Lima pavilion[KubeConEU2023] Lima pavilion
[KubeConEU2023] Lima pavilion
 
[KubeConEU2023] containerd pavilion
[KubeConEU2023] containerd pavilion[KubeConEU2023] containerd pavilion
[KubeConEU2023] containerd pavilion
 
[Container Plumbing Days 2023] Why was nerdctl made?
[Container Plumbing Days 2023] Why was nerdctl made?[Container Plumbing Days 2023] Why was nerdctl made?
[Container Plumbing Days 2023] Why was nerdctl made?
 
[FOSDEM2023] Bit-for-bit reproducible builds with Dockerfile
[FOSDEM2023] Bit-for-bit reproducible builds with Dockerfile[FOSDEM2023] Bit-for-bit reproducible builds with Dockerfile
[FOSDEM2023] Bit-for-bit reproducible builds with Dockerfile
 
[CNCF TAG-Runtime 2022-10-06] Lima
[CNCF TAG-Runtime 2022-10-06] Lima[CNCF TAG-Runtime 2022-10-06] Lima
[CNCF TAG-Runtime 2022-10-06] Lima
 
[KubeCon EU 2022] Running containerd and k3s on macOS
[KubeCon EU 2022] Running containerd and k3s on macOS[KubeCon EU 2022] Running containerd and k3s on macOS
[KubeCon EU 2022] Running containerd and k3s on macOS
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...
[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...
[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...
 
[Docker Tokyo #35] Docker 20.10
[Docker Tokyo #35] Docker 20.10[Docker Tokyo #35] Docker 20.10
[Docker Tokyo #35] Docker 20.10
 

高速にコンテナを起動できるイメージフォーマット

  • 1. Copyright©2017 NTT Corp. All Rights Reserved. ⽇本電信電話(株) ソフトウェアイノベーションセンタ 須⽥ 瑛⼤ <suda.akihiro@lab.ntt.co.jp> ⾼速にコンテナを起動できる イメージフォーマット BDI研究会 (2017/8/1) スライド: https://www.slideshare.net/AkihiroSuda
  • 2. 2 Copyright©2017 NTT Corp. All Rights Reserved. • GitHub: @AkihiroSuda / Twitter: @_AkihiroSuda_ • コンテナ関連OSSのメンテナ(所謂コミッタ) • Docker Moby Core メンテナ • BuildKit イニシャルメンテナ (github.com/moby/buildkit) • 次世代 `docker build` (DockerfileをDAG化し並⾏実⾏) • またの機会にこちらについても詳しく.. ⾃⼰紹介 2017年4⽉,DockerプロジェクトはMobyプロジェクトに移⾏した. Mobyプロジェクトの成果物を元として,Docker製品が開発されている. : ≒ : RHEL Fedora
  • 3. 3 Copyright©2017 NTT Corp. All Rights Reserved. • `docker pull` し終わる前に`docker run`可能になるような イメージフォーマットを提案 • 例えば Docker公式のOpenJDKイメージは全体で672MBある が7MB pullした時点でsh起動可能になる • 88MBでJRE,137MBでJDK • その他,重複除去などの利点もあり • OCI標準仕様との互換性を重視 お話しする内容
  • 4. 4 Copyright©2017 NTT Corp. All Rights Reserved. • Dockerとは • Docker・OCIイメージの構成・問題 • 提案するイメージフォーマット • 今後の技術的・コミュニティ的な取り組み⽅針 • デモ (時間があれば) アウトライン
  • 5. 5 Copyright©2017 NTT Corp. All Rights Reserved. Dockerとは • いわゆるコンテナ型仮想化基盤 • 仮想マシンより軽い • イメージの作成・共有が簡単 • 昔のjailなどとの⼤きな違い • 分散実⾏にも対応 • 標準: Swarm-mode / 3rd party: Kubernetes など FROM ubuntu:17.04 RUN apt-get install foobar COPY foobar.conf /etc Dockerfileをコミットする イメージがビルドされる クラスタにデプロイできる
  • 6. 6 Copyright©2017 NTT Corp. All Rights Reserved. • Linuxカーネルが備えるcgroups・namespaceと,Copy-on-Write (CoW)ファイルシステムとを組み合わせて実装されている • AUFS, OverlayFS, BtrFS, ZFSに対応.DeviceMapperでのCoWにも対応. • 対応しているディストリビューションや,安定性などの特性が違う • Dockerfileの1⾏毎にCoWレイヤーが⽣成される • イメージサイズは⼩さく抑えるのが鉄則 (VMとは使い勝⼿が違う) • ⼩さいイメージを多数組み合わせて,マイクロサービス化する • とは⾔っても,現実にはなかなか⼩さくしにくいものである • ⼩さくしやすくする試みとしては,OracleのMicrocontainer (Smith)などが最近出てきている Dockerとは FROM ubuntu:17.04 RUN apt-get install foobar COPY foobar.conf /etc mount –t overlay –o lowerdir=0,upperdir=1 .. mount –t overlay –o lowerdir=1,upperdir=2 ..
  • 7. 7 Copyright©2017 NTT Corp. All Rights Reserved. • DockerのCoWレイヤは,AUFSレイヤを固めたtarファイルとしてイメー ジ化される • 実際のCoWファイルシステムがOverlayFSでもDeviceMapperでも,AUFSレイヤー のtarとして表現される • QCOW2など,ハイパーバイザ⽤のブロックレベルのCoW技術とは対照的 Docker・OCIイメージの構成 後で説明します TAR TAR FROM ubuntu:17.04 RUN apt-get install foobar COPY foobar.conf /etc mount –t overlay –o lowerdir=0,upperdir=1 .. mount –t overlay –o lowerdir=1,upperdir=2 .. ベースレイヤは普通のtar • 追加・変更されたファイル • 削除されたファイルの情報 (whiteoutファイル) TAR /bin/bash /bin/ls ... /usr/bin/foobar /usr/lib/libfoobar.so ... /etc/foobar.conf
  • 8. 8 Copyright©2017 NTT Corp. All Rights Reserved. • TARファイルや,環境変数のJSONなどが,merkle tree構造を持つblob ストアに格納される • ⼀般にDocker Registryを⽤いて配信する.(バックエンドはS3やSwiftなど) Docker・OCIイメージの構成 { "schemaVersion": 2, "manifests": [ { "mediaType": "application/vnd.oci.image.manifest.v1+json", "size": 7143, "digest": "sha256:e692418e4cbaf90ca69d05a66403747baa33ee08806650b51fab815ad7fc331f" } } /index.json /blobs/sha256/e692418e... ... (次スライド) JSON JSON
  • 9. 9 Copyright©2017 NTT Corp. All Rights Reserved. /blobs/sha256/e692418e... { "schemaVersion": 2, "config": { "mediaType": "application/vnd.oci.image.config.v1+json", "size": 7023, "digest": "sha256:b5b2b2c507a0944348e0303114d8d93aaaa081732b86451d9bce1f432a537bc7" }, "layers": [ { "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip", "size": 33554432, "digest": "sha256:61be55a8e2f6b4e172338bddf184d6dbee29c98853e0a0485ecee7f27b9af0b4" }, { "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip", "size": 1073741824, "digest": "sha256:3c3a4604a545cdc127456d94e421cd355bca5b528f4a9c1905b15da2eb4a4c6b" }, { "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip", "size": 73109, "digest": "sha256:ec4b8955958665577945c89419d1af06b5f7636b4ac3da7f12184802ad867736" } ] } /blobs/sha256/b5b2b2c5... (環境変数などのJSON) /blobs/sha256/61be55a8... (ベースレイヤのtar) /blobs/sha256/3c3a4604... (差分レイヤのtar) /blobs/sha256/ec4b8955... (更なる差分レイヤのtar) TAR TAR TAR JSON JSON
  • 10. 10 Copyright©2017 NTT Corp. All Rights Reserved. • merkle tree構造を持っているので,manifestのSHA256値を指定すれば, 確実に環境を再現できる (`docker pull foobar@sha256:e692418e..`) Docker・OCIイメージの構成 /index.json /blobs/sha256/e692418e... /blobs/sha256/b5b2b2c5... /blobs/sha256/61be55a8... /blobs/sha256/3c3a4604... /blobs/sha256/ec4b8955... Index Manifest 環境変数などのconfig AUFSレイヤのtar群 merkle tree
  • 11. 11 Copyright©2017 NTT Corp. All Rights Reserved. • 2017年7⽉,Linux Foundation傘下のOpen Containers Initiative によりOCIイメージ仕様の策定完了 • CoreOS陣営が提案していたappc・ACIもOCIに合流した • データ構造はDockerイメージと類似しており,⾼い互換性を持つが, Docker Registry HTTP APIに依存しなくなった. HTTP, NFS, IPFSなど,ディレクトリ的なセマンティックを持つ任意のプ ロトコルで配信可能. • 個⼈的にはIPFSなどP2Pを⽤いたイメージ配信に期待 • Dockerでも,近々正式に実装予定. • ※混同に注意: Dockerfileの構⽂・命令が標準化されたわけではない OCIイメージ≒Dockerイメージ
  • 12. 12 Copyright©2017 NTT Corp. All Rights Reserved. • tar = Tape ARchiverが現れたのは1979年 (UNIX 7th Edition) • 磁気テープ前提のフォーマットのため,本来はDocker・OCIのユースケース に合っていない Docker・OCIイメージの問題 1970年代のUNIXがターゲットとしていた PDP-11 ミニコンピュータ & 磁気テープドライブ https://en.wikipedia.org/wiki/PDP-11
  • 13. 13 Copyright©2017 NTT Corp. All Rights Reserved. • tar内のファイルの⼀覧がわからない ⇒テープ全体を読み終わるまでmountできない • ファイルがどのオフセットにあるかわからない (tarとは別に索引を作成したとしても, tarがgzipなどで圧縮されていると, どのみちseekできない) 問題1: 「テープ」全体を⾛査しないとメタデータを取得できない メタデータ0 ファイル0 メタデータ1 ファイル2 メタデータ{n-1} ファイル{n-1} 終端 zero (1024B) ... ファイル名や パーミッションなど ファイル内容
  • 14. 14 Copyright©2017 NTT Corp. All Rights Reserved. 問題1: 「テープ」全体を⾛査しないとメタデータを取得できない この問題が解決できれば,メタデータだけpullした時点でmount(2)しておき, ファイル本体はread(2)が発⽣した時点でlazyにpullできるようになる! • 巨⼤なコンテナイメージを多数のノードに配信する場合,起動時間短縮・ネッ トワーク負荷軽減できて嬉しい ユースケース • ⼤量のHTMLや画像ファイルを含むWebアプリケーション • 様々なビッグデータとコードとをひとまとめにしたイメージ • 論⽂を`docker run foo@sha256:deadbeef..` 1発で確実に再現できる世界 になると嬉しい • 巨⼤なOS (GNOME・KDE⼊りの仮想デスクトップ環境や,Windowsなど) • 巨⼤な⾔語ランタイム (Java,.NETなど) • 複数のソフトウェアを結合試験する環境 など
  • 15. 15 Copyright©2017 NTT Corp. All Rights Reserved. • 1つのレジストリで,複数の似たようなイメージを配信することを考える • バージョン違い • アーキテクチャ違い • 設定違い など • 同じファイルを多数含むtarであっても,別々のblobになるため,ストレ ージが無駄になる 問題2: blobの重複を除去できない FROM ubuntu:17.04 RUN apt-get install foo FROM ubuntu:17.04 RUN apt-get install foo bar FROM debian:9 RUN apt-get install foo FROM ubuntu:17.04 RUN echo … > /etc/apt/source.list RUN apt-get install foo 同じファイルを多数含んでいるが別物
  • 16. 16 Copyright©2017 NTT Corp. All Rights Reserved. • 巨⼤なtarレイヤのblobは,複数のrangeに分けて,複数のコネクション を使って並列にpullしたい • 複数のサーバを利⽤できる場合,短時間でのpull完了が⾒込まれる • しかし任意のプロトコルで可能なわけではない • HTTP/1.1 Range Requestsは RFC7233 にてOPTIONALとされている 問題3: ⼀般に,単⼀レイヤを分割して並列にpullできない Range 0-1023 Range 1024-2047
  • 17. 17 Copyright©2017 NTT Corp. All Rights Reserved. 1. 「テープ」全体を⾛査しないとメタデータを取得できない 2. 重複除去できない 3. ⼀般に,単⼀レイヤを分割して並列にpullできない Docker・OCIイメージの問題 まとめ
  • 18. 18 Copyright©2017 NTT Corp. All Rights Reserved. 提案するイメージフォーマット FILEgrain(仮称) https://github.com/AkihiroSuda/filegrain
  • 19. 19 Copyright©2017 NTT Corp. All Rights Reserved. • 単⼀のtar blobを,ファイル毎に別個のblobに崩す • 各ファイルのSHA256ダイジェストをメタデータに記載しcontent-addressableにする • メタデータのblobさえpullすれば,getdents(2)やstat(2)できるので, イメージ全体をpullせず,mount(2)・コンテナ起動可能 • read(2)が発⽣した段階で初めて,lazyにpullすればよい 提案するイメージフォーマットの概略 メタデータ0 ファイル0 メタデータ1 ファイル2 メタデータ{n-1} ファイル{n-1} 終端 zero (1024B) ... メタデータ0 ファイル0 メタデータ1 ファイル2 メタデータ{n-1} ファイル{n-1} ... TAR continuity ファイル名,パーミッション, SHA256ダイジェストなど content-addressable
  • 20. 20 Copyright©2017 NTT Corp. All Rights Reserved. • メタデータはcontinuityで表現する • continuity.. containerdコミュニティで提案されている,ファイルシステ ムメタデータ記述フォーマット (https://github.com/containerd/continuity) • ファイル名,パーミッション,xattr(7),ダイジェスト値などをProtocolBuffers形式で シリアライズする • 次世代containerd(下位ランタイム)のテストで使われているほか, Docker・Mobyでもイメージ検証に使う案がある (moby-core#32153) • 類似フォーマットにBSDのmtree(8)がある • 将来的にcontainerdに統合したいので,containerdコミュニティ系のcontinuityにした • containerdコミュニティについては最後の⽅のスライドで説明 (Docker・Kubernetes共通の次世代ランタイム) メタデータのフォーマット
  • 21. 21 Copyright©2017 NTT Corp. All Rights Reserved. • 単⼀のOCIイメージ中に,普通のOCIマニフェストと,提案フォーマットのマ ニフェストの両⽅を格納できる • ⇒提案フォーマットに対応・未対応のソフトウェアを容易に共存させることができる OCIイメージとの互換性を重視 /index.json /blobs/sha256/e692... /blobs/sha256/b5b2... /blobs/sha256/61be... /blobs/sha256/3c3a... /blobs/sha256/ec4b... Index OCI Manifest 環境変数などのconfig (共通) AUFSレイヤのtar群 /blobs/sha256/a8e3... 提案フォーマットのManifest /blobs/sha256/de81... continuity /blobs/sha256/583f... /blobs/sha256/3af1... /blobs/sha256/5c2a... /blobs/sha256/39c1... /blobs/sha256/12ea... ばらされたファイル群(⼤量) `docker pull foo:v1-filegrain` `docker pull foo:v1` {"v1-filegrain": "sha256:a8e3..", "v1":"sha256:e692.."}
  • 22. 22 Copyright©2017 NTT Corp. All Rights Reserved. • 普通のOCIのtarレイヤに,提案フォーマットのレイヤを重ね合わせること ができるので,⽋点を補い合うことができる • 細かい⼤量のファイルは普通のtarにまとめるほうが,I/Oが1回で済むし,圧縮率向上 も期待できるので,速い場合もある OCIイメージとの互換性を重視 { ... "layers": [ { "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip", "size": 33554432, "digest": "sha256:e692..." }, { "mediaType": "application/vnd.continuity.layer.v0+pb", "size": 16724, "digest": "sha256:a18b..." } ] } TAR continuity 頻繁に使うファイルや, 細かいファイルは 普通のOCIのレイヤ (pullし終わるまでコンテナ を起動できない) かさばるファイルは提案フォーマットのレイヤ (lazyにpullできるが細かいファイルに不向き)
  • 23. 23 Copyright©2017 NTT Corp. All Rights Reserved. 問題1.「テープ」全体を⾛査しないとメタデータを取得できない ⇒ continuityのblobだけpullすればメタデータを取得できる. ファイル本体をpullする前にmount・コンテナ起動可能. 問題2. 重複除去できない ⇒ ファイルを細かいblobにばらしたので,同じファイルを含むレイヤは⾃ ずと重複除去される 問題3. ⼀般に,単⼀レイヤを分割して並列にpullできない ⇒ ファイルを細かいblobにばらしたので,並列にpullできる Docker・OCIイメージの問題を解決できる
  • 24. 24 Copyright©2017 NTT Corp. All Rights Reserved. 1. blob数の肥⼤化 • イメージをファイルシステム上に配置する場合,/blobs/sha256 ディレクトリに⼤ 量のファイルが出来るため,readdir(3) が遅くなりがち • /blobs/sha256/deadbeef..を/blobs/sha256/de/deadbeef..のように"sharding"する テクニックは不可 (OCIとの互換性のため) 2. RPCオーバヘッド増⼤ • 細かいファイルは単⼀のtarにまとめてpullするほうがRPCが少なくて済む 3. イメージによっては圧縮率低下 • 似たようなファイルを多数含むレイヤは,従来通り,単⼀のtarにまとめると⾼い圧 縮率が期待される ただし,前述の通り,従来のOCIレイヤとの重ね合わせでカバー可能 提案フォーマットの⽋点
  • 25. 25 Copyright©2017 NTT Corp. All Rights Reserved. 没案: 外部ストアを併⽤する ⇒特定のプロトコルに依存するし,OCIのmerkle treeを使えなくなること があり,環境再現性・セキュリティ⾯での懸念があるため,没 なぜ他の⽅法にしないか 類似研究: Harter, Tyler, et al. "Slacker: Fast Distribution with Lazy Docker Containers." FAST. 2016. • NFS上のext4イメージをループバックマウントし,ブロック粒度でのlazy-pull,重複除去を実現 Lestaris, George. "Alternatives to layer-based image distribution: using CERN filesystem for images." Container Camp UK. 2016. Blomer, Jakob, et al. "A Novel Approach for Distributing and Managing Container Images: Integrating CernVM File System and Mesos." MesosCon NA. 2016. • CernVM-FSを⽤いて,ファイル粒度でのlazy-pull,重複除去を実現 • CernVM-FSもmerkle treeを持っているが,OCIのmerkle treeに接ぎ⽊するには⼀⼿間要りそう IPFS(P2Pでcontent-addressableなファイルシステム)の使⽤も考えたが,特定プロトコルに依存したく なかったので没 ※提案フォーマットはHTTPでもNFSでもCernVM-FSでもIPFSでも,任意のプロトコルで配信可能
  • 26. 26 Copyright©2017 NTT Corp. All Rights Reserved. 没案2: tarを先頭からseekしていけばよいのではないか? ⇒没 • 圧縮されたtarではseek不可能 • ⾮圧縮tarでもプロトコルによってはseekできない • メタデータ全体をとるためのリクエストが多発 なぜ他の⽅法にしないか メタデータ0 ファイル0 メタデータ1 ファイル2 メタデータ{n-1} ファイル{n-1} 終端 zero (1024B) ... ファイル本体を読み⾶ばしてseekし メタデータだけ先に集める? TAR
  • 27. 27 Copyright©2017 NTT Corp. All Rights Reserved. 没案3: tarの代わりにzip(など)にすればよいのではないか? ⇒プロトコルによってはseekできないし,zipはメタデータのサポートが弱 いので没 なぜ他の⽅法にしないか ZIP 予備メタデータ0 圧縮済ファイル0 予備メタデータ1 圧縮済ファイル2 予備メタデータ{n-1} 圧縮済ファイル{n-1} ... フッタ メタデータ0 メタデータ1 ... メタデータ{n-1} メタデータだけまとめて先にpullできる?
  • 28. 28 Copyright©2017 NTT Corp. All Rights Reserved. 評価
  • 29. 29 Copyright©2017 NTT Corp. All Rights Reserved. • read-onlyなFUSEファイルシステムとして実装 • 将来的にもread-onlyのままのつもり • コンテナはVMとは違い,immutableにするのが鉄則./tmp, /runとパーシステントボ リューム以外への書き込みは⾏うべきではない. • /tmpや/runは⼀般にtmpfsを別途マウントする • パーシステントボリュームは,ホスト側のext4やXFSをbind-mountする • 実際,OverlayFSやAUFSも書き込み操作のサポートは限定的 (https://github.com/AkihiroSuda/docker-issues) • 1つのファイルに対してROなfdとRWなfdを両⽅openし,書き込むと,ROな⽅が意図しない 結果を返す.(yumなど実際のアプリケーションに影響するが,バグではなくoverlayの仕様) • 今のところ,Dockerは任意にmountされたrootfsを使えないので, Dockerそのものには統合できていない.runc (Docker, containerdの下 位ランタイム)を⽤いて評価した. 実装
  • 30. 30 Copyright©2017 NTT Corp. All Rights Reserved. 評価に⽤いたイメージ イメージ 説明 rootfs (tar+gzip展開後) openjdk:8 sha256:5da842d59f76009fa27ffde06888ebd 560c7ad17607d7cd1e52fc0757c9a45fb Debian 9.1, OpenJDK 8u141 671.7MB kdeneon/all sha256:e3e7f216a5f8f1fdcff4eab8807d7af cd291c050099ab3e8a8355b7b28a19247 Ubuntu 16.04, KDE Plasma 5.10, Firefox 54など 4.8GB kaggle/python sha256:335103c998aea22a5608c2eeca7dcf1 09e0828ed233b75f5098182c5b058fe98 Debian 8.5, 様々な機械学習フレー ムワーク, NLTKデータセット(⾃然 ⾔語関連)など 8.3GB ※詳細な再現⼿順は https://github.com/AkihiroSuda/filegrain/issues/17 に掲載.
  • 31. 31 Copyright©2017 NTT Corp. All Rights Reserved. • openjdk:8 (総blob容量 = 671.7MB + メタ 5.4MB) • マウント: 5.4MB ( 2 blobs) • イメージ本体のblobではなく,メタデータ(manifestとcontinuity)の読み込み • `sh`: 累計 7.3MB ( 8 blobs) • `java –version`: 累計 88.2MB ( 30 blobs) • `javac HelloWorld.java`: 累計137.3MB ( 50 blobs) • kdeneon/all (4.8GB + 34.5MB) • マウント: 34.5MB ( 2 blobs) • `sh`: 累計36.7MB ( 8 blobs) • `startkde`: 累計742.7MB (4,267 blobs) • `firefox`: 累計866.6MB (4,506 blobs) ※各コマンドは続けて起動 評価: コンテナ起動に必要なblob量 (無圧縮) 1/5 1/5 以下
  • 32. 32 Copyright©2017 NTT Corp. All Rights Reserved. • kaggle/python (8.3GB + 38.2MB) • マウント: 38.2MB ( 2 blobs) • `sh`: 累計 40.1MB ( 8 blobs) • `ipython –c ʻecho(“hello”)ʼ`: 累計 75.4MB (1033 blobs) • `ipython –c ʻimport nltkʼ`: 累計352.0MiB (2799 blobs) 評価: コンテナ起動に必要なblob量 (無圧縮) 1/24 以下
  • 33. 33 Copyright©2017 NTT Corp. All Rights Reserved. 評価: 圧縮率 イメージ rootfs 従来のtarをまと めてgzip -9 提案フォーマット +各blobを個別 にgzip -9 openjdk:8 671.7MB 261.3MB 260.7MB (-645,604B) kdeneon/all 4.8GB 2.1GB 2.1GB (-489,361B) kaggle/python 8.3GB 3.6GB 3.6GB (+4,345,701B) 今回試験したイメージでは圧縮率の違いは誤差の範囲 (似たようなblobが多いイメージでは圧縮率は悪くなりそう)
  • 34. 34 Copyright©2017 NTT Corp. All Rights Reserved. 評価: 重複除去 kdeneon/all (4.8GB) kaggle/python (8.3GB) 75.4MB の重複を除去できる (互いに全然関係なさそうなイメージだが, Debian系に共通のファイルがあるため重複blobがある)
  • 35. 35 Copyright©2017 NTT Corp. All Rights Reserved. 評価: FUSEのオーバヘッド 0.1 1 10 100 1回⽬ 2回⽬ 3回⽬ 4回⽬ 5回⽬ 6回⽬ 7回⽬ 8回⽬ 9回⽬ 10回⽬ openjdkの/usr以下をtarで固めるのに要する秒数 従来のDocker (overlay2) 提案フォーマットのFUSE(read-only) Docker 17.06 / Fedora 26 / 2 vCPUs, 2GB RAM, 2GB swap (VMware Fusion, MacBook Pro 2016)
  • 36. 36 Copyright©2017 NTT Corp. All Rights Reserved. 評価: FUSEのオーバヘッド 0.1 1 10 100 1回⽬ 2回⽬ 3回⽬ 4回⽬ 5回⽬ 6回⽬ 7回⽬ 8回⽬ 9回⽬ 10回⽬ openjdkの/usr以下をtarで固めるのに要する秒数 従来のDocker (overlay2) 提案フォーマットのFUSE(read-only) 提案⼿法ではコンテナ起動後,readが発⽣して初めてblobをpullする. そのため初回データにはpullの時間を含む. (今回はlocalhostがリモートなのでネットワークのオーバヘッドは含まない). ※従来Dockerの⽅は,イメージをpullしてからコンテナ起動するので pullの時間は含んでいない.
  • 37. 37 Copyright©2017 NTT Corp. All Rights Reserved. 評価: FUSEのオーバヘッド 0.1 1 10 100 1回⽬ 2回⽬ 3回⽬ 4回⽬ 5回⽬ 6回⽬ 7回⽬ 8回⽬ 9回⽬ 10回⽬ openjdkの/usr以下をtarで固めるのに要する秒数 従来のDocker (overlay2) 提案フォーマットのFUSE(read-only) カーネルのキャッシュが効いて速くなる 実装上の何らかの理由で カーネルのキャッシュが効いていない? (read-onlyなので原理的には簡単なはず.楽観的.)
  • 38. 38 Copyright©2017 NTT Corp. All Rights Reserved. • PullのためのRPCの数が増えることのオーバヘッド • プロトコルに依存する • TODO: Docker Registry APIのクライアントを実装し評価する. • 現在のPOCはローカルディレクトリをレジストリ代わりにしている. 評価: その他
  • 39. 39 Copyright©2017 NTT Corp. All Rights Reserved. 今後の⽅針
  • 40. 40 Copyright©2017 NTT Corp. All Rights Reserved. • ファイルより細かい粒度への対応 • ⼤きいファイルはchunk毎にSHA256ダイジェストを計算し,continuityとはまた別 のフォーマットとして保存しておけばよい (continuity#85) • コンテナ起動時にすぐ必要となりそうなファイルを検出し,予め1つのtar にまとめておく • pushする前に1回コンテナを起動し,FUSEの呼び出しをトレースしておけばよい 今後の技術的な⽅針
  • 41. 41 Copyright©2017 NTT Corp. All Rights Reserved. • 現在,Dockerは多数の”LEGOブロック”へ分解・再編成されつつある最中 • ガバナンスの明確化 • 拡張モジュール開発の容易化 コミュニティ的な取り組み⽅針 Docker CLI Moby Core (dockerd) containerd runc BuildKit (buildd) SwarmKit (swarmd) CLI (これだけはDocker社がコミット権独占) 各モジュールのAPIを統合 分散実⾏Dockerfile的なDAGを実⾏ cgroups, namespace OCIイメージ・CoW FSなど ⾚枠内はKubernetesとも共通する (今後,Dockerの代わりのランタイムとして選択可能になる) 提案フォーマットをcontainerd周辺に導⼊することを⽬指す (DockerやKubernetesの拡張機能として簡単に使えるようにする)
  • 42. 42 Copyright©2017 NTT Corp. All Rights Reserved. まとめ
  • 43. 43 Copyright©2017 NTT Corp. All Rights Reserved. • `docker pull` し終わる前に`docker run`可能になるような イメージフォーマットを提案 • https://github.com/AkihiroSuda/filegrain • 例えば Docker公式のOpenJDKイメージは全体で672MBある が7MB pullした時点でsh起動可能になる • 88MBでJRE,137MBでJDK • その他,重複除去などの利点もあり • OCI標準仕様との互換性を重視 まとめ
  • 44. 44 Copyright©2017 NTT Corp. All Rights Reserved. デモ (時間があれば)