Docker Buildxを使う

はじめに

DokcerにはBuildxというCLIプラグインが存在します。
いままでなんとなく使ってただけなのでちょっと調べてまとめてみようかと思います。

Docker Buildxとは

前述していますがDocker のCLIプラグインです。
これはBuildxの機能を拡張したもので以下のような機能や特徴を持ちます。 (Buildxに関しては以前ブログにまとめてます)

  • docker buildと似たUIで提供される
  • Docker BuildKitの機能をすべて備えている
  • マルチノードビルドやクロスプラットフォームイメージの作成できる
  • Compose Buildサポートをしている
  • ハイレベルなビルド構成(bake)

BuildxはDokcer 19.03以降のバージョンを必要とします。
しかし、古いバージョンでもバイナリを直接実行することで、機能を限定した利用は可能なようです。
インストールに関しては最新のバージョンのDocker CEのパッケージをインストールしていれば一緒にダウンロードされているようです。
(もしバイナリをインストールしたい場合はこちらをご確認ください)

使ってみる

環境

今回の動作環境は以下の通り。

$ uname -srvmpio
Linux 5.4.0-88-generic #99-Ubuntu SMP Thu Sep 23 17:29:00 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

$ lsb_release -a
LSB Version:    core-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:   focal

$ docker version
Client: Docker Engine - Community
 Version:           20.10.8
 API version:       1.41
 Go version:        go1.16.6
 Git commit:        3967b7d
 Built:             Fri Jul 30 19:54:27 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.8
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.6
  Git commit:       75249d8
  Built:            Fri Jul 30 19:52:33 2021
  OS/Arch:          linux/amd64
  Experimental:     true
 containerd:
  Version:          1.4.10
  GitCommit:        8848fdb7c4ae3815afcc990a8a99d663dda1b590
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

Buildxのコマンド

Buildxのコマンドには以下のようなものがあります。

この中からいくつかのコマンドは利用してみたいと思います。

dokcerコマンドにエイリアスを作成する

buildx installコマンドを使うと通常のdokcerコマンドに対するエイリアスを貼ることができます。
buildx は通常 docker buildx buildなどのようにdokcer buildx [SUBCOMMAND]の構成を取りますが、buildx installコマンドを実行すると

$ docker buildx install

// docker buildコマンドが docker buildx buildへのエイリアスになっているのでBuildxでのビルドが実行される
$ docker build .
[+] Building 46.2s (11/11) FINISHED                                                                                                                                                                        
 => [internal] load build definition from Dockerfile                                                                                                                                                  0.0s
 => => transferring dockerfile: 155B                                                                                                                                                                  0.0s
 => [internal] load .dockerignore                                                                                                                                                                     0.0s
 => => transferring context: 2B                                                                                                                                                                       0.0s
 => resolve image config for docker.io/docker/dockerfile:experimental                                                                                                                                 8.8s
 => [auth] docker/dockerfile:pull token for registry-1.docker.io                                                                                                                                      0.0s
 => docker-image://docker.io/docker/dockerfile:experimental@sha256:600e5c62eedff338b3f7a0850beb7c05866e0ef27b2d2e8c02aa468e78496ff5                                                                  33.4s
 => => resolve docker.io/docker/dockerfile:experimental@sha256:600e5c62eedff338b3f7a0850beb7c05866e0ef27b2d2e8c02aa468e78496ff5                                                                       0.0s
 => => sha256:600e5c62eedff338b3f7a0850beb7c05866e0ef27b2d2e8c02aa468e78496ff5 1.69kB / 1.69kB                                                                                                        0.0s
 => => sha256:3c244c0c6fc9d6aa3ddb73af4264b3a23597523ac553294218c13735a2c6cf79 528B / 528B                                                                                                            0.0s
 => => sha256:b587adb6abfd8d6c87b1f649c2e924d53f148ae1c7f0ceaaded70b27b44dccb5 1.21kB / 1.21kB                                                                                                        0.0s
 => => sha256:d7f0373ffb1d5ac3477b10ab7f91cba7c5df586c72e7e4a12649024efdc0d531 9.64MB / 9.64MB                                                                                                       33.2s
 => => extracting sha256:d7f0373ffb1d5ac3477b10ab7f91cba7c5df586c72e7e4a12649024efdc0d531                                                                                                             0.1s
 => [internal] load metadata for docker.io/library/busybox:latest                                                                                                                                     2.9s
 => [auth] library/busybox:pull token for registry-1.docker.io                                                                                                                                        0.0s
 => [internal] load build context                                                                                                                                                                     0.0s
 => => transferring context: 155B                                                                                                                                                                     0.0s
 => [1/2] FROM docker.io/library/busybox@sha256:f7ca5a32c10d51aeda3b4d01c61c6061f497893d7f6628b92f822f7117182a57                                                                                      0.7s
 => => resolve docker.io/library/busybox@sha256:f7ca5a32c10d51aeda3b4d01c61c6061f497893d7f6628b92f822f7117182a57                                                                                      0.0s
 => => sha256:f7ca5a32c10d51aeda3b4d01c61c6061f497893d7f6628b92f822f7117182a57 2.29kB / 2.29kB                                                                                                        0.0s
 => => sha256:febcf61cd6e1ac9628f6ac14fa40836d16f3c6ddef3b303ff0321606e55ddd0b 527B / 527B                                                                                                            0.0s
 => => sha256:16ea53ea7c652456803632d67517b78a4f9075a10bfdc4fc6b7b4cbf2bc98497 1.46kB / 1.46kB                                                                                                        0.0s
 => => sha256:24fb2886d6f6c5d16481dd7608b47e78a8e92a13d6e64d87d57cb16d5f766d63 767.32kB / 767.32kB                                                                                                    0.6s
 => => extracting sha256:24fb2886d6f6c5d16481dd7608b47e78a8e92a13d6e64d87d57cb16d5f766d63                                                                                                             0.1s
 => [2/2] RUN --mount=type=bind,target=tmp cat tmp/Dockerfile > text.txt                                                                                                                              0.3s
 => exporting to image                                                                                                                                                                                0.0s
 => => exporting layers                                                                                                                                                                               0.0s
 => => writing image sha256:00d095571d6c88a17fc804422a29bf628377bbd2d6616f0e11252e5959955b8f   

エイリアスを削除したい場合はbuildx uninstallコマンドを用います。

ビルダーインスタンスを作成する

buildxコマンドを使えば、複数のビルダーインスタンスを作成したり削除したりすることができます。
このビルダーインスタンスはスコープを持っており、例えば、共有のデーモンのステートを変更すること無い独立したビルダーを作成することができます。
また、このビルダーインスタンスにはリモートのノードを複数追加することが可能です。

ビルダーインスタンスの作成は以下のコマンドを用います。

$ docker buildx create default --name henoheno_builder
henoheno_builder

$ docker buildx use henoheno_builder

$ docker buildx ls
NAME/NODE           DRIVER/ENDPOINT             STATUS   PLATFORMS
henoheno_builder *  docker-container                     
  henoheno_builder0 unix:///var/run/docker.sock inactive 
default             docker                               
  default           default                     running  linux/amd64, linux/386

新しいビルダーインスタンスを作成する場合は引数にdocker contextを指定するかDOCKER_HOST環境変数を指定します。
新しく作成したビルダーのステータスがinactiveになってしますがbuildxコマンドを利用時に自動的に起動してくれるようです。
明示的に起動したい場合は以下のコマンドを実行します。

$ docker buildx inspect --bootstrap
[+] Building 19.5s (1/1) FINISHED                                                                                                                                                                          
 => [internal] booting buildkit                                                                                                                                                                      19.5s
 => => pulling image moby/buildkit:buildx-stable-1                                                                                                                                                   18.8s
 => => creating container buildx_buildkit_henoheno_builder0                                                                                                                                           0.6s
Name:   henoheno_builder
Driver: docker-container

Nodes:
Name:      henoheno_builder0
Endpoint:  unix:///var/run/docker.sock
Status:    running
Platforms: linux/amd64, linux/386

最後に作ったビルダーインスタンスを削除する場合は以下のコマンドを実行します。

$ docker buildx rm henoheno_builder

$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS  PLATFORMS
default * docker                  
  default default         running linux/amd64, linux/386