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のコマンドには以下のようなものがあります。
- buildx bake: 高レベルでのビルドコマンド(今回は深堀りしませんが別途ブログを書くかもです)
- buildx build: ビルドコマンド。Buildkitを用いてビルドを行なう
- buildx create: Docker ContextやDockerエンドポイントをさす新しいビルダーインスタンスを作成する。
- buildx du: ディスクの使用率を取得する
- buildx imagetools
- buildx imagetools create: レジストリー内のDokcer Manifest(イメージに関するレイヤー、サイズ、ダイジェスト値等の情報を持つ)のリストから新しいマニフェストを作成する。ソースは複数のマニフェストを選択可能。
- buildx imagetools inspect: レジストリー内のイメージの詳細情報を表示
- buildx inspect: 現在利用しているビルダーインスタンスの詳細情報を表示。名前をビルダーインスタンスの名前を明示的に指定して他のインスタンスの情報を表示することも可能
- buildx install: dockerコマンドへのエイリアスを作成する
- buildx uninstall: dockerコマンドへのエイリアスを削除する
- buildx ls: ビルダーインスタンスをリスト表示
- buildx prune: ビルドキャッシュの削除
- buildx rm: 指定された(もしくは現在の)ビルダーインスタンスの削除する。デフォルトのビルダーインスタンスは削除不可
- buildx stop: 指定された(もしくは現在の)ビルダーインスタンスを停止する。
- buildx use: ビルダーインスタンスをスイッチする
この中からいくつかのコマンドは利用してみたいと思います。
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