はじめに
皆さん、どうもです。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を変更します
変更したら、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