SlideShare a Scribd company logo
Copyright©2018 NTT Corp. All Rights Reserved.
NTT ソフトウェアイノベーションセンタ
須田 瑛大
DockerCon参加報告
(`docker build`が30倍以上速くなる話など)
Docker Meetup Tokyo #24 (2018/07/19)
https://slideshare.net/AkihiroSuda
2
Copyright©2018 NTT Corp. All Rights Reserved.
• コンテナ関連OSSのメンテナ(いわゆるコミッタ)を務めている
• Docker Moby メンテナ (2016年11月~)
• 2017年4月,OSSプロジェクトとしてのDockerはMobyに名前が変わった
• 商用製品としてのDockerはMobyをベースとして開発されている
• Moby BuildKitメンテナ (2017年夏 プロジェクト発足時~)
• 次世代 `docker build`
• CNCF containerdメンテナ (2017年9月~)
• Kubernetesなどで利用できる次世代コンテナランタイム
: ≒ :
RHEL Fedora
自己紹介
3
Copyright©2018 NTT Corp. All Rights Reserved.
• 参加者数: 約5,000名
• 日本からは20名程度?
• 参考:
• DockerCon 17 US: 5,000名
• 同 EU: 2,500名
• 開催期間: 6/12-6/15
• 開催地: Moscone Center, San
Francisco
• DockerCon 2019 USも同じ会場の予定
(2019年4月末-5月初)
• Docker本社から徒歩圏内
• 次回: 12/3-12/5 @ Barcelona
会議概要
4
Copyright©2018 NTT Corp. All Rights Reserved.
• BuildKit: https://github.com/moby/buildkit
• 次世代`docker build`
• https://t.co/aUKqQCVmXa
• Docker Application Packages: https://github.com/docker/app
• `docker-compose.yaml`をDocker Hubで共有できるようにするツール
• https://dockercon2018.hubs.vidyard.com/watch/8Ux4S7ZeeWTcByUghGXmnr
(54分ころ)
• 何故か軽くしか触れられていない..
紹介する発表
5
Copyright©2018 NTT Corp. All Rights Reserved.
• Dockerfileのキャッシュが効きにくい
• DockerfileのN行目を書き換えると,N+1行目以降のキャッシュは破棄される
• ユーザはDockerfileの命令の順序に気をつける必要がある
• コンパイラやパッケージマネージャのキャッシュが保存されない
• ~/.m2 (Maven), ~/.cache/go-build (Go), /var/cache/apt (apt) など
従来の`docker build`に対する不満
FROM debian
EXPOSE 80
RUN apt update && apt install –y HEAVY-PACKAGES
EXPOSEを書き換えるだけでRUNのキャッシュが効かなくなる
6
Copyright©2018 NTT Corp. All Rights Reserved.
• 並列実行できるはずの命令を,並列実行してくれない
従来の`docker build`に対する不満
FROM golang AS stage0
...
RUN go build –o /foo ...
FROM clang AS stage1
...
RUN clang –o /bar ...
FROM debian AS stage2
COPY --from=stage0 /foo /usr/local/bin/foo
COPY --from=stage1 /bar /usr/local/bin/bar
0
2
1
各ステージの依存性は
DAGとして表現できる
7
Copyright©2018 NTT Corp. All Rights Reserved.
• 並列実行できるはずの命令を,並列実行してくれない
従来の`docker build`に対する不満
FROM golang AS stage0
...
RUN go build –o /foo ...
FROM clang AS stage1
...
RUN clang –o /bar ...
FROM debian AS stage2
COPY --from=stage0 /foo /usr/local/bin/foo
COPY --from=stage1 /bar /usr/local/bin/bar
0
2
1
0
1
2
シーケンシャルにしか
実行してくれない
8
Copyright©2018 NTT Corp. All Rights Reserved.
• プライベートなGitやS3などへのアクセスが困難
• `COPY`命令で鍵を置くのは危ない
• ステージを分けるか `--squash` しないと鍵が漏れる
• 環境変数を使うのも危ない
従来の`docker build`に対する不満
FROM ...
COPY id_rsa ~/.ssh
RUN git clone ssh://...
RUN rm –f ~/.ssh/id_rsa
rmしてもレイヤの
tarからは消えない
9
Copyright©2018 NTT Corp. All Rights Reserved.
• DAG構造を備える中間言語であるLLBを用いる
• 依存性を正確に表現できるので,キャッシュがよく効く
• 命令を並列実行できる
• LLBは主にDockerfileからコンパイルされる
• Dockerfile以外の言語からのコンパイルも可能
BuildKit: 次世代 `docker build`
コンパイル
Dockerfile
LLB DAG
サードパーティ言語
docker-image://alpine
Image
git://foo/bar
docker-image://gcc
Run("apk add ..")Run("make")
3命令を同時に実行できる
2
10
Copyright©2018 NTT Corp. All Rights Reserved.
• DAGはマルチステージDockerfileを用いて記述できる
BuildKit: 次世代 `docker build`
FROM golang AS stage0
...
RUN go build –o /foo ...
FROM clang AS stage1
...
RUN clang –o /bar ...
FROM debian AS stage2
COPY --from=stage0 /foo /usr/local/bin/foo
COPY --from=stage1 /bar /usr/local/bin/bar
0
2
1
11
Copyright©2018 NTT Corp. All Rights Reserved.
• DAGはマルチステージDockerfileを用いて記述できる
BuildKit: 次世代 `docker build`
FROM golang AS stage0
...
RUN go build –o /foo ...
FROM clang AS stage1
...
RUN clang –o /bar ...
FROM debian AS stage2
COPY --from=stage0 /foo /usr/local/bin/foo
COPY --from=stage1 /bar /usr/local/bin/bar
0
2
1
https://t.co/aUKqQCVmXa より引用
12
Copyright©2018 NTT Corp. All Rights Reserved.
https://t.co/aUKqQCVmXa より引用
13
Copyright©2018 NTT Corp. All Rights Reserved.
https://t.co/aUKqQCVmXa より引用
14
Copyright©2018 NTT Corp. All Rights Reserved.
https://t.co/aUKqQCVmXa より引用
15
Copyright©2018 NTT Corp. All Rights Reserved.
• Dockerfileの最初の行に `# syntax = ...` を指定すると,非標準の命令
を利用できる
• 例: `RUN --mount`
• 独自の構文追加も可能 (APIをしゃべるコンテナイメージとして実装)
BuildKitの新しいDockerfile構文
# syntax = tonistiigi/dockerfile:runmount20180610
...
RUN --mount=target=/root/.cache,type=cache go build
コンパイラやパッケージマネージャのキャッシュディ
レクトリを保持できる
16
Copyright©2018 NTT Corp. All Rights Reserved.
https://t.co/aUKqQCVmXa より引用
17
Copyright©2018 NTT Corp. All Rights Reserved.
• `RUN –-mount`は今のところキャッシュ用途にのみ利用可能
• キャッシュ以外の用途のサポートも計画中
• クライアント上のSSH agentに繋がるソケットを,コンテナ内にマウント
• コンテナ内から安全にscpできる
• S3のシークレットキーなどを安全にマウント
BuildKitの新しいDockerfile構文
18
Copyright©2018 NTT Corp. All Rights Reserved.
• root権限なしで実行可能
• user namespaceを使うので,予め/etc/subuidを設定しておく必要がある
• overlayfsは基本的には使えない
• Ubuntuではカーネルにパッチを当てているので使える
• 複数のアーキテクチャに対応したイメージをビルドできる
(例:amd64+arm)
• amd64上でarmの`RUN`命令を実行する場合は,QEMUのusermode emulationが使
われる
• full system emulation (いわゆるVM) は不要
• https://asciinema.org/a/GYOx4B88r272HWrLTyFwo156s
• 将来的には分散実行もサポート
その他
19
Copyright©2018 NTT Corp. All Rights Reserved.
https://t.co/aUKqQCVmXa より引用
20
Copyright©2018 NTT Corp. All Rights Reserved.
• Docker v18.06に実験的に統合された
• 本日7/19(日本時間)リリース
• 備考: 従来は毎月リリースされていたが,次はv18.09,その次はv19.03で,以降は6ヶ
月毎のリリース予定.各リリースは7ヶ月間サポートされる.
• コマンドラインは従来の `docker build` と同じ
• クライアント側で `export DOCKER_BUILDKIT=1` すると有効になる
BuildKitの使い方
21
Copyright©2018 NTT Corp. All Rights Reserved.
• `docker-compose.yaml`をDocker Hubで共有できるようにするツール
• 環境に依存する部分はパラメータとして切り離されている
• Helm パッケージの出力も可能
• ただしDocker EEやDocker for Mac/Winに含まれる,プロプラなモジュールに依存
• 2016年ころから示されていた"Distributed Application Bundle"構想
の後継と思われる
Docker Application Packages
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
DockerCon参加報告 (`docker build`が30倍以上速くなる話など)
25
Copyright©2018 NTT Corp. All Rights Reserved.
• `docker-app render`: 変数を`docker-compose.yaml`に反映
• `docker-app push`: Appをレジストリにpush
• rootfsの内容がyamlだけのイメージがpushされる
• `docker-app deploy`: レジストリ上のAppをSwarmまたは
Kubernetesにデプロイ
• `docker-app helm`: Chartを出力
• 将来的には`docker` CLIに統合されると思われる
Docker Application Packages

More Related Content

DockerCon参加報告 (`docker build`が30倍以上速くなる話など)

  • 1. Copyright©2018 NTT Corp. All Rights Reserved. NTT ソフトウェアイノベーションセンタ 須田 瑛大 DockerCon参加報告 (`docker build`が30倍以上速くなる話など) Docker Meetup Tokyo #24 (2018/07/19) https://slideshare.net/AkihiroSuda
  • 2. 2 Copyright©2018 NTT Corp. All Rights Reserved. • コンテナ関連OSSのメンテナ(いわゆるコミッタ)を務めている • Docker Moby メンテナ (2016年11月~) • 2017年4月,OSSプロジェクトとしてのDockerはMobyに名前が変わった • 商用製品としてのDockerはMobyをベースとして開発されている • Moby BuildKitメンテナ (2017年夏 プロジェクト発足時~) • 次世代 `docker build` • CNCF containerdメンテナ (2017年9月~) • Kubernetesなどで利用できる次世代コンテナランタイム : ≒ : RHEL Fedora 自己紹介
  • 3. 3 Copyright©2018 NTT Corp. All Rights Reserved. • 参加者数: 約5,000名 • 日本からは20名程度? • 参考: • DockerCon 17 US: 5,000名 • 同 EU: 2,500名 • 開催期間: 6/12-6/15 • 開催地: Moscone Center, San Francisco • DockerCon 2019 USも同じ会場の予定 (2019年4月末-5月初) • Docker本社から徒歩圏内 • 次回: 12/3-12/5 @ Barcelona 会議概要
  • 4. 4 Copyright©2018 NTT Corp. All Rights Reserved. • BuildKit: https://github.com/moby/buildkit • 次世代`docker build` • https://t.co/aUKqQCVmXa • Docker Application Packages: https://github.com/docker/app • `docker-compose.yaml`をDocker Hubで共有できるようにするツール • https://dockercon2018.hubs.vidyard.com/watch/8Ux4S7ZeeWTcByUghGXmnr (54分ころ) • 何故か軽くしか触れられていない.. 紹介する発表
  • 5. 5 Copyright©2018 NTT Corp. All Rights Reserved. • Dockerfileのキャッシュが効きにくい • DockerfileのN行目を書き換えると,N+1行目以降のキャッシュは破棄される • ユーザはDockerfileの命令の順序に気をつける必要がある • コンパイラやパッケージマネージャのキャッシュが保存されない • ~/.m2 (Maven), ~/.cache/go-build (Go), /var/cache/apt (apt) など 従来の`docker build`に対する不満 FROM debian EXPOSE 80 RUN apt update && apt install –y HEAVY-PACKAGES EXPOSEを書き換えるだけでRUNのキャッシュが効かなくなる
  • 6. 6 Copyright©2018 NTT Corp. All Rights Reserved. • 並列実行できるはずの命令を,並列実行してくれない 従来の`docker build`に対する不満 FROM golang AS stage0 ... RUN go build –o /foo ... FROM clang AS stage1 ... RUN clang –o /bar ... FROM debian AS stage2 COPY --from=stage0 /foo /usr/local/bin/foo COPY --from=stage1 /bar /usr/local/bin/bar 0 2 1 各ステージの依存性は DAGとして表現できる
  • 7. 7 Copyright©2018 NTT Corp. All Rights Reserved. • 並列実行できるはずの命令を,並列実行してくれない 従来の`docker build`に対する不満 FROM golang AS stage0 ... RUN go build –o /foo ... FROM clang AS stage1 ... RUN clang –o /bar ... FROM debian AS stage2 COPY --from=stage0 /foo /usr/local/bin/foo COPY --from=stage1 /bar /usr/local/bin/bar 0 2 1 0 1 2 シーケンシャルにしか 実行してくれない
  • 8. 8 Copyright©2018 NTT Corp. All Rights Reserved. • プライベートなGitやS3などへのアクセスが困難 • `COPY`命令で鍵を置くのは危ない • ステージを分けるか `--squash` しないと鍵が漏れる • 環境変数を使うのも危ない 従来の`docker build`に対する不満 FROM ... COPY id_rsa ~/.ssh RUN git clone ssh://... RUN rm –f ~/.ssh/id_rsa rmしてもレイヤの tarからは消えない
  • 9. 9 Copyright©2018 NTT Corp. All Rights Reserved. • DAG構造を備える中間言語であるLLBを用いる • 依存性を正確に表現できるので,キャッシュがよく効く • 命令を並列実行できる • LLBは主にDockerfileからコンパイルされる • Dockerfile以外の言語からのコンパイルも可能 BuildKit: 次世代 `docker build` コンパイル Dockerfile LLB DAG サードパーティ言語 docker-image://alpine Image git://foo/bar docker-image://gcc Run("apk add ..")Run("make") 3命令を同時に実行できる 2
  • 10. 10 Copyright©2018 NTT Corp. All Rights Reserved. • DAGはマルチステージDockerfileを用いて記述できる BuildKit: 次世代 `docker build` FROM golang AS stage0 ... RUN go build –o /foo ... FROM clang AS stage1 ... RUN clang –o /bar ... FROM debian AS stage2 COPY --from=stage0 /foo /usr/local/bin/foo COPY --from=stage1 /bar /usr/local/bin/bar 0 2 1
  • 11. 11 Copyright©2018 NTT Corp. All Rights Reserved. • DAGはマルチステージDockerfileを用いて記述できる BuildKit: 次世代 `docker build` FROM golang AS stage0 ... RUN go build –o /foo ... FROM clang AS stage1 ... RUN clang –o /bar ... FROM debian AS stage2 COPY --from=stage0 /foo /usr/local/bin/foo COPY --from=stage1 /bar /usr/local/bin/bar 0 2 1 https://t.co/aUKqQCVmXa より引用
  • 12. 12 Copyright©2018 NTT Corp. All Rights Reserved. https://t.co/aUKqQCVmXa より引用
  • 13. 13 Copyright©2018 NTT Corp. All Rights Reserved. https://t.co/aUKqQCVmXa より引用
  • 14. 14 Copyright©2018 NTT Corp. All Rights Reserved. https://t.co/aUKqQCVmXa より引用
  • 15. 15 Copyright©2018 NTT Corp. All Rights Reserved. • Dockerfileの最初の行に `# syntax = ...` を指定すると,非標準の命令 を利用できる • 例: `RUN --mount` • 独自の構文追加も可能 (APIをしゃべるコンテナイメージとして実装) BuildKitの新しいDockerfile構文 # syntax = tonistiigi/dockerfile:runmount20180610 ... RUN --mount=target=/root/.cache,type=cache go build コンパイラやパッケージマネージャのキャッシュディ レクトリを保持できる
  • 16. 16 Copyright©2018 NTT Corp. All Rights Reserved. https://t.co/aUKqQCVmXa より引用
  • 17. 17 Copyright©2018 NTT Corp. All Rights Reserved. • `RUN –-mount`は今のところキャッシュ用途にのみ利用可能 • キャッシュ以外の用途のサポートも計画中 • クライアント上のSSH agentに繋がるソケットを,コンテナ内にマウント • コンテナ内から安全にscpできる • S3のシークレットキーなどを安全にマウント BuildKitの新しいDockerfile構文
  • 18. 18 Copyright©2018 NTT Corp. All Rights Reserved. • root権限なしで実行可能 • user namespaceを使うので,予め/etc/subuidを設定しておく必要がある • overlayfsは基本的には使えない • Ubuntuではカーネルにパッチを当てているので使える • 複数のアーキテクチャに対応したイメージをビルドできる (例:amd64+arm) • amd64上でarmの`RUN`命令を実行する場合は,QEMUのusermode emulationが使 われる • full system emulation (いわゆるVM) は不要 • https://asciinema.org/a/GYOx4B88r272HWrLTyFwo156s • 将来的には分散実行もサポート その他
  • 19. 19 Copyright©2018 NTT Corp. All Rights Reserved. https://t.co/aUKqQCVmXa より引用
  • 20. 20 Copyright©2018 NTT Corp. All Rights Reserved. • Docker v18.06に実験的に統合された • 本日7/19(日本時間)リリース • 備考: 従来は毎月リリースされていたが,次はv18.09,その次はv19.03で,以降は6ヶ 月毎のリリース予定.各リリースは7ヶ月間サポートされる. • コマンドラインは従来の `docker build` と同じ • クライアント側で `export DOCKER_BUILDKIT=1` すると有効になる BuildKitの使い方
  • 21. 21 Copyright©2018 NTT Corp. All Rights Reserved. • `docker-compose.yaml`をDocker Hubで共有できるようにするツール • 環境に依存する部分はパラメータとして切り離されている • Helm パッケージの出力も可能 • ただしDocker EEやDocker for Mac/Winに含まれる,プロプラなモジュールに依存 • 2016年ころから示されていた"Distributed Application Bundle"構想 の後継と思われる Docker Application Packages
  • 25. 25 Copyright©2018 NTT Corp. All Rights Reserved. • `docker-app render`: 変数を`docker-compose.yaml`に反映 • `docker-app push`: Appをレジストリにpush • rootfsの内容がyamlだけのイメージがpushされる • `docker-app deploy`: レジストリ上のAppをSwarmまたは Kubernetesにデプロイ • `docker-app helm`: Chartを出力 • 将来的には`docker` CLIに統合されると思われる Docker Application Packages