Help us understand the problem. What is going on with this article?

DockerのBuildKit使ってみた

image.png

はじめに

皆さん、どうもです。k.s.ロジャースのやすもんです。
dockerのBuildKitがおすすめですよ!と、メンバーのインフラエンジニアさんから教えてもらったので、試しに動かしてみます!
ひとまず、BuildKitを調査するところからやっていきます!

docker BuildKit

docker buildの新しいバックエンド機能とのことです。
Docker18.06バージョンから実験的に採用され、Docker18.09バージョンから正式な採用されたみたいです。
主な機能としては、以下のようです。

  • 並列実行
  • キャッシュの最適化
  • セキュリティ強化

並列実行とキャッシュ最適化によるビルド時間の削減はこの後、実際に試してみるとして、セキュリティ強化は一体どのようなものか?というのを軽く調べてみました。

どうやら、BuildKitを用いて鍵ファイルやSSH秘密鍵をマウントしてイメージに認証情報の履歴を残さずビルドできるようです。
弊社ではDockerfileに秘密鍵などを保持する運用を行っていないので、セキュリティ部分は今回のスコープから外します。

BuildKitでどれだけビルド時間が早くなるか検証

弊社で用いているPHPのDocker開発環境をビルドしてみます。
Dockerfile自体は社外秘ですが、何をやっているかざっくり説明すると以下となります。

  • yumで基本的なパッケージをインストール
  • phalconPHPのインストール
  • nginxやphalconの設定

実行環境

  • MAC 10.13.4(17E199)
  • Docker fo MAC 2.1.0.3

普通にビルド

以下のコマンドでいつもどおりビルドします。
キャッシュはきかないようにします

$ time docker build -t test -f ./Dockerfile.base --no-cache

...割愛...

Successfully built 56ffc2a573df
Successfully tagged test:latest
docker build -t test -f ./Dockerfile.base --no-cache ./  
0.63s user 0.57s system 0% cpu 7:38.49 total

結果は7分38秒でした

BuildKitを設定してビルド

BuildKitの設定

Docker for MACのpreferencesからDamonへ行き、Advancedのjsonを変更します

image.png

変更したら、Apply & Restartするだけ
コレだけで、BuildKitが有効になるみたいです。楽ちん!

BuildKitでビルド

Dockerfileは特にかえず通常のときと同じようにビルドします。
キャッシュはきかないようにします。

$ time docker build -t test -f ./Dockerfile.base --no-cache

...割愛...

 => exporting to image                                                                            10.9s
 => => exporting layers                                                                           10.9s
 => => writing image sha256:7ac0b275433567126fe2a897748bdb300cb127cd64527bcd67ad549d78c007a5       0.0s
 => => naming to docker.io/library/test                                                            0.0s
docker build -t test -f ./Dockerfile.base --no-cache ./  
2.45s user 1.67s system 0% cpu 10:41.55 total

結果は10分41秒でした

あれ!?遅くなってる!
その後、あれこれ試してみましたが、BuildKitを有効にしたほうがbuild時間が遅くなってしまうという結果になりました。
どうやら、必ずしも最適化されて早くなるわけではないみたいです。。。

主に時間がかかっているところはyum install部分とphalconのビルドみたいだ

GolangのDockerfileで再度検証

PHPの方ではBuildKitのほうが時間がかかったという結果になったので、Golangの方で再度検証してみます

通常ビルド

Successfully built c54280579e20
Successfully tagged test:latest
docker build -t test --no-cache ./  
0.30s user 0.33s system 0% cpu 1:53.76 total

結果は1分53秒でした

BuildKitを設定してビルド

$ time docker build -t test --no-cache ./                  

...割愛...

 => => writing image sha256:ba852ab70b48e158f18a61e1a764a0c9017acdf80040c13ae09abb469ef3e2c1       0.0s 
 => => naming to docker.io/library/test                                                            0.0s 
docker build -t test --no-cache ./  
0.74s user 0.57s system 0% cpu 3:20.50 total   

結果は3分20秒でした

またまた、BuildKitのほうがbuild時間が遅いという結果に。。。
設定を見直したりなどしてみましたが、間違っていなさそうでした。
DockerfileをBuildKit用に最適化する必要があるかもしれないので、引き続き調査を継続します。
今回はここらへんで一区切りとさせてくださいmm

さいごに

BuildKitを使うことでbuild時間が速くなるという噂を聞いて試してみましたが、弊社のDockerfileでは単純に導入しただけでは速くなりませんでした。
BuildKitのパラメータなどもあるみたいなので、引き続き調査して最適化していきたいと思います。
また、本記事読んで「ここをこうしたら速くなるよ!」みたいな助言あればコメントお願いします!

Wantedlyでもブログ投稿してます

Techブログに加えて会社ブログなどもやっているので、気になった方はぜひ覗いてみてください。
https://www.wantedly.com/companies/ks-rogers

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away