Weitere ähnliche Inhalte
Ähnlich wie DockerCon参加報告 (`docker build`が30倍以上速くなる話など) (20)
Mehr von Akihiro Suda (20)
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 より引用
- 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
コンパイラやパッケージマネージャのキャッシュディ
レクトリを保持できる
- 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
• 将来的には分散実行もサポート
その他
- 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