Docker: 並列buildオプションの速度比較

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での移行が上手くいったのか楽しみですね。


  1. 効果は構成によります