Retty Advent Calendar 2019 22日目の記事です。 昨日は神@pikatenorくんの記事で、「マイクロサービス時代のセッション管理」でした。
自己紹介
こんにちは。Retty広告コンテンツ部門でサーバーサイドの開発を担当している堤です。 最近はインフラ管理の仕事も多くなり、AWSと格闘したりDockerと格闘したりしています。
今回は、Dockerのbuildを手軽に高速化1してくれる2つのオプションについて、速度比較を行いました。
概要説明
Dockerには、並列buildを実現するためのオプションが2種類存在します。
片方は、docker-composeの--parallel
オプションで、もう一つはBuildKitの並列buildです。
今回は、こちらの2つのオプションについて速度比較を行いました。
結果としては、オプションなしと比較して、parallelオプションで24%減、BuildKitで30%減の実行時間短縮となりました。 また、両方のオプションを使った場合は39%減の時間短縮となりました。
対象プロジェクトの構成
今回対象とするDockerfileは5つで、並列build可能となっています。 また各Dockerfileの詳細は割愛いたしますが、multi-stage buildsを複数利用しているため、BuildKitの並列buildの恩恵を受けられるようになっています。
各オプションの概要説明
docker-compose --parallel
参考: https://medium.com/schkn/parallelize-your-docker-compose-build-8ac653e3e596
2018/10にdocker-compose version 1.23.0で追加されたオプションで、docker imageを最大5つまで並列でbuildしてくれます。
Docker BuildKit
参考: https://www.slideshare.net/AkihiroSuda/buildkit
2018/07/19にDockerCE18.06(正式版としては18.09)で追加されたオプションで、 - (multi-stage buildされている)Dockerfileのbuildをstageごと並列で行える - 鍵を安全に扱える - パッケージインストールやコンパイル等においてローカルのcacheを使える
など複数の有用な機能があります。 今回の検証は、Dockerfileの並列buildのみを対象としています。
実験環境
- Server: AWS EC2 i3en.xlarge
- vCPU: 4
- mem: 32GB
- OS: Amazon Linux AMI 2.0.20191031
- Docker Client/Server: 19.03
- docker-compose: 1.25.0dev
コマンド・その他オプション
オプションなし
docker-compose build --no-cache
--parallel
docker-compose build --no-cache --parallel
BuildKit
COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker-compose build --no-cache
--parallel + BuildKit
COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker-compose build --no-cache --parallel
結果
オプション | 速度 | オプションなしとの比較 |
---|---|---|
なし | 1h39m15s | 1 |
--parallel |
1h16m37 | 0.76 |
BuildKit | 1h10m18 | 0.70 |
BuildKit + --parallel |
1h00m53 | 0.61 |
BuildKitと--parallel
の比較では、若干BuildKitの方が速くなっています。
BuildKitと--parallel
の組み合わせは有効なようで、build時間を2/3まで落とすことができました。
今回の結果は、あくまで弊チームにおけるDockerのbuild構成に基づく結果となります。 imageの依存関係やDockerfileの書き方、スペックやその他処理内容により、上記の比較結果は異なります。
明日は西村さんの記事で、「Amazon Aurora 移行大全 #2」です。 #1での移行が上手くいったのか楽しみですね。
-
効果は構成によります↩