DockerのBuildKit使ってみた

<img width="933" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/8e0789dc-df22-fbf7-8d0e-bb14945f5579.png">


# はじめに
皆さん、どうもです。[ｋ．ｓ．ロジャース](https://www.wantedly.com/companies/ks-rogers)のやすもんです。
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261265/862ff504-5b69-9b83-2349-fa92038f965c.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