Arm の使用が拡大し続ける中、Arm でイメージを構築することは、すべてのアーキテクチャでイメージを利用可能にし、パフォーマンスを向上させるために不可欠であるため、Arm およびマルチアーキテクチャ イメージを非常に簡単に構築できるようにするために投資してきました。 以前の ブログ では、Docker Desktop にあらかじめパッケージ化されている QEMU エミュレーターを使用して、マルチアーキテクチャイメージをローカルでビルドする方法を概説しました。 このブログでは、同じ目標を達成するためにリモートビルダーの使用を開始する方法を概説しますが、ここではAmazon EC2インスタンスを使用します。 2019年12月、Amazonは、第1世代のAWSグラビトンプロセッサよりもパフォーマンスを大幅に向上させる、 AWS Graviton2プロセッサ を搭載した新しいAmazon EC2インスタンス を発表しました 。 Graviton2 インスタンスを使用して Arm イメージをリモートでビルドすると、プロセスが高速化され、Arm サーバーやデバイス上でのコンテナーの開発がさらに簡単になります。
以下について説明します。
- Graviton2 EC2 インスタンスをリモートホストとして使用する
- Graviton2 EC2 インスタンスをリモートビルダーとして登録する
- グラビトン2 EC2 インスタンスでのドッカーイメージのビルド
buildXとリモートビルダーの詳細については、 ドキュメントをご覧ください。
リモートビルダーの使用を開始する
前提 条件
まず、ローカルマシンの代わりにリモートホストを使用していることを確認する必要があります。 リモート 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でできることのほんの一部です。 それがどのように進んだか、そしてあなたが私たちが次に何をしてほしいかについてのあなたのフィードバックを歓迎します、あなたはそれにフィードバックを私たちの 公開ロードマップに提出することができます。