Docker BuildX と Graviton2 EC2 でビルドをスピードアップ

Arm の使用が拡大し続ける中、Arm でイメージを構築することは、すべてのアーキテクチャでイメージを利用可能にし、パフォーマンスを向上させるために不可欠であるため、Arm およびマルチアーキテクチャ イメージを非常に簡単に構築できるようにするために投資してきました。 以前の ブログ では、Docker Desktop にあらかじめパッケージ化されている QEMU エミュレーターを使用して、マルチアーキテクチャイメージをローカルでビルドする方法を概説しました。 このブログでは、同じ目標を達成するためにリモートビルダーの使用を開始する方法を概説しますが、ここではAmazon EC2インスタンスを使用します。 2019年12月、Amazonは、第1世代のAWSグラビトンプロセッサよりもパフォーマンスを大幅に向上させる、 AWS Graviton2プロセッサ を搭載した新しいAmazon EC2インスタンス を発表しました 。 Graviton2 インスタンスを使用して Arm イメージをリモートでビルドすると、プロセスが高速化され、Arm サーバーやデバイス上でのコンテナーの開発がさらに簡単になります。 

以下について説明します。

  1. Graviton2 EC2 インスタンスをリモートホストとして使用する
  2. Graviton2 EC2 インスタンスをリモートビルダーとして登録する
  3. グラビトン2 EC2 インスタンスでのドッカーイメージのビルド

buildXとリモートビルダーの詳細については、 ドキュメントをご覧ください。

Docker buildx リモートダイアグラム 102021 v3

リモートビルダーの使用を開始する

前提 条件

まず、ローカルマシンの代わりにリモートホストを使用していることを確認する必要があります。 リモート Docker インスタンスにアクセスする一般的な方法は、mTLS または SSH を使用することです。 ここでは、わかりやすくするためにSSHを使用します。 Graviton2 で Buildx と BuildKit でリモート ビルダーの使用を開始するには、次のように URL を使用して ssh://<USERNAME>@<HOST> 、Docker CLI からホストにアクセスできる必要があります。

$ docker -H ssh://me@graviton2-instance info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Build with BuildKit (Docker Inc., v0.6.1-65-gad9dddc3)
  compose: Docker Compose (Docker Inc., v2.0.0-rc.3)
  scan: Docker Scan (Docker Inc., v0.8.0)

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 20.10.9
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 5b46e404f6b9f661a205e28d59c982d3634148f8
 runc version: v1.0.2-0-g52b36a2
 init version: de40ad0
 Security Options:
  apparmor
  seccomp
   Profile: default
 Kernel Version: 5.4.0-1045-aws
 Operating System: Ubuntu 20.04.2 LTS
 OSType: linux
 Architecture: aarch64
 CPUs: 2
 Total Memory: 1.837GiB

Buildx でリモート ビルダーを作成する

これで、 create コマンドを使用して、このリモート Graviton2 インスタンスを Docker Buildx に登録できます。

$ docker buildx create --name graviton2 \
  --driver docker-container \
  --platform linux/arm64 \
  ssh://me@graviton2-instance
graviton2

--platform は、このビルドクラスターに他のノードを追加するときに、このノードが arm64 ビルドで優先されるように指定されています。

ビルダーをブートストラップ して、リモートホスト上のBuildKitコンテナを確認して作成します。

$ docker buildx inspect --bootstrap --builder graviton2
#1 [internal] booting buildkit
#1 pulling image moby/buildkit:buildx-stable-1
#1 pulling image moby/buildkit:buildx-stable-1 2.2s done
#1 creating container buildx_buildkit_node1
#1 creating container buildx_buildkit_node1 1.4s done
#1 DONE 3.7s
Name:   graviton2
Driver: docker-container

Nodes:
Name:      node1
Endpoint:  ssh://me@graviton2-instance
Status:    running
Platforms: linux/arm64*, linux/arm/v7, linux/arm/v6

イメージをビルドする

次に、単純な Dockerfile を作成します。

ビルドとしてのビジーボックスから
ARG ターゲットプラットフォーム
ARG ビルドプラットフォーム
RUN エコー "\$BUILDPLATFORM で実行しています。\$TARGETPLATFORM 用にビルドしています" > /log
ビジーボックスから
コピー --from=ビルド /ログ /ログ
実行猫/ログ
RUN uname -a

そして、ビルダーに対して イメージを構築し ましょう。

docker buildx build --builder graviton2 \
  --push -t example.com/hello:latest \
  --platform linux/arm64 .
#2 [internal] load .dockerignore
#2 transferring context:
#2 transferring context: 2B 0.2s done
#2 DONE 0.2s

#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 246B 0.3s done
#1 DONE 0.4s

#3 [internal] load metadata for docker.io/library/busybox:latest
#3 ...

#4 [auth] library/busybox:pull token for registry-1.docker.io
#4 DONE 0.0s

#3 [internal] load metadata for docker.io/library/busybox:latest
#3 DONE 1.5s

#5 [build 1/2] FROM docker.io/library/busybox@sha256:f7ca5a32c10d51aeda3b4d01c61c6061f497893d7f6628b92f822f7117182a57
#5 resolve docker.io/library/busybox@sha256:f7ca5a32c10d51aeda3b4d01c61c6061f497893d7f6628b92f822f7117182a57 0.0s done
#5 DONE 0.0s

#5 [build 1/2] FROM docker.io/library/busybox@sha256:f7ca5a32c10d51aeda3b4d01c61c6061f497893d7f6628b92f822f7117182a57
#5 sha256:7560ee4921c3fab4f1d34c83600f6f65841ec863e072374f4e8044ff01df156f 821.72kB / 821.72kB 0.1s done
#5 extracting sha256:7560ee4921c3fab4f1d34c83600f6f65841ec863e072374f4e8044ff01df156f 0.0s done
#5 DONE 0.2s

#6 [build 2/2] RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" > /log
#6 DONE 0.1s

#7 [stage-1 2/4] COPY --from=build /log /log
#7 DONE 0.0s

#8 [stage-1 3/4] RUN cat /log
#8 0.078 I am running on $BUILDPLATFORM, building for $TARGETPLATFORM
#8 DONE 0.1s

#9 [stage-1 4/4] RUN uname -a
#9 0.081 Linux buildkitsandbox 5.4.0-1045-aws #47-Ubuntu SMP Tue Apr 13 07:04:23 UTC 2021 aarch64 GNU/Linux
#9 DONE 0.1s

#10 exporting to image
#10 exporting layers
#10 exporting layers 0.3s done
#10 exporting manifest sha256:7097ec1c09675617e2c44b5924b76f7863c4ff685c640b32dfaa1b1e8f2bc641 0.0s done
#10 exporting config sha256:d18ca92a45b563373606f0a06d0a1d2280d0c11976b1ca64dba0e567d540a3e2 0.0s done
#10 pushing layers
#10 pushing layers 0.7s done

これで、Graviton2 インスタンスを使用してリモートでイメージを構築できました。 これらは、buildxでできることのほんの一部です。 それがどのように進んだか、そしてあなたが私たちが次に何をしてほしいかについてのあなたのフィードバックを歓迎します、あなたはそれにフィードバックを私たちの 公開ロードマップに提出することができます。