Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

17,381 views

Published on

Docker Meetup Tokyo #24 https://dockerjp.connpass.com/event/93140/

Published in: Software
  • Be the first to comment

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

  1. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 12 Copyright©2018 NTT Corp. All Rights Reserved. https://t.co/aUKqQCVmXa より引用
  13. 13. 13 Copyright©2018 NTT Corp. All Rights Reserved. https://t.co/aUKqQCVmXa より引用
  14. 14. 14 Copyright©2018 NTT Corp. All Rights Reserved. https://t.co/aUKqQCVmXa より引用
  15. 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. 16 Copyright©2018 NTT Corp. All Rights Reserved. https://t.co/aUKqQCVmXa より引用
  17. 17. 17 Copyright©2018 NTT Corp. All Rights Reserved. • `RUN –-mount`は今のところキャッシュ用途にのみ利用可能 • キャッシュ以外の用途のサポートも計画中 • クライアント上のSSH agentに繋がるソケットを,コンテナ内にマウント • コンテナ内から安全にscpできる • S3のシークレットキーなどを安全にマウント BuildKitの新しいDockerfile構文
  18. 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. 19 Copyright©2018 NTT Corp. All Rights Reserved. https://t.co/aUKqQCVmXa より引用
  20. 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. 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
  22. 22. 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

×