Docker デスクトップを使用した Arm および x86 用のマルチアーキテクチャイメージの構築

ミディアムにクロス投稿

4月24日(水)、 DockerはArmとのパートナーシップを発表しました 大規模なArmエコシステムへのコンテナの採用を加速するのに役立ちます。本日の DockerCon San Francisco 2019 で、Docker は Docker Desktop 内で改善されたマルチアーキテクチャ ビルドのテクニカル プレビューをリリースします。

Docker Desktopは、コンテナ化されたアプリケーションの開発に関しては事実上の標準です。このテクニカルプレビューは、Docker Desktopですでに使用および開発している何百万人もの開発者に豊富なArmエコシステムを開きます。 これにより、クラウド内のAmazon EC2 A1 Armベースのインスタンスにデプロイするためのコンテナイメージの開発が簡素化されるだけでなく、世界中の1兆台のArmベースのエッジ&IoTデバイスへの道が開かれます。 なぜこれを行うのか、すべてがどのように機能するのか、そしてどのように始めることができるのかを掘り下げてみましょう。

Dockerデスクトップの簡単なインストール

なぜDockerはこれをしているのですか?

2018年11月、Amazonは、AWSが設計した64ビットArm Neoverseコアとカスタムシリコンを搭載したAWS Gravitonプロセッサを搭載したEC2 A1インスタンスを発表しました。 A1 EC2 インスタンスは、スケールアウトワークロード向けにコストとパフォーマンスが最適化されており、他の EC2 インスタンスと比較して最大 45% のコスト削減を実現します。 この Docker Desktop テクニカル プレビューにより、Docker は、Arm サーバーおよびデバイス上でのコンテナーの開発をこれまで以上に簡単にします。 使い慣れた標準の Docker ツールとプロセスを使用して、さまざまなコンピューティング アーキテクチャでシームレスにイメージの構築、プッシュ、プル、実行を開始できます。Arm のビルドを開始するために、Dockerfile やソース コードを変更する必要はありません。 本日リリースされる新機能を使用してイメージを再構築するだけです。最後に、DockerはエッジとIoTに急速に拡大しており、これはそのプロセスの重要なステップであると考えています。Dockerは常に開発者に関するものであり、物事を簡単にします。それが私たちがこれをした理由の核心です。

それはどのように機能しますか?

スクリーンショット 2019 04 26 at 7.25. 34午後

Docker Desktop は macOS と Windows で利用できます。コンテナの開発を非常に簡単にするユーザー向けの多くのものをバンドルして構成します。Docker Desktop には、ホスト OS 用のハイパーバイザーが付属しています。ハイパーバイザーは、Docker Desktop の一部として含まれている軽量の Linux カーネル (LinuxKit) を実行する役割を担います。この高速で軽量なコンテナOSは、QEMUエミュレータにパッケージ化されており、事前設定されています binfmt_misc サポートされているアーキテクチャのバイナリを実行します。Armはサポートに全力で取り組んでいます Docker の QEMU フォーク そして、このプロジェクトを維持するのに役立ちます。すべてのパッチはアップストリームされますが、Docker Desktopには最新のエミュレーションサポートが含まれます。上の図では、arm/v6、arm/v7、arm64 Docker イメージの QEMU エミュレーションを確認できます。

Docker Desktop Edge リリースには、と呼ばれる新しい CLI コマンドが付属しています。 ビルドX. Buildxを使用すると、ローカルで(そしてすぐにリモートで)マルチアーキテクチャイメージをビルドし、マニフェストファイルと一緒にリンクして、1つのコマンドですべてをレジストリにプッシュできます。付属のエミュレーションを使用すると、ネイティブイメージ以上のものを透過的に構築できます。Buildxは、以下に基づいて新しいビルダーインスタンスを追加することでこれを実現します BuildKit、および Docker デスクトップ テクノロジ スタックを活用して非ネイティブ バイナリを実行します。

では、なぜビルドxなのでしょうか?まず名前から始めましょう。x は実験的を表します。将来、これらの新しいビルド機能が安定して一般公開されたら、x を削除し、これらの機能を既存の docker build コマンドに直接統合します。buildx は実験的なものであるため、機能とフラグは変更される可能性があることに注意してください。

はじめ

Docker デスクトップをまだお持ちでない場合は 、まずダウンロードしてください. インストール手順に従ってインストールします。インストール後、またはすでにDocker Desktopを使用している場合は、タスクトレイにDockerアイコンが表示され、[設定]をクリックして、エッジリリースに切り替えるだけです。

スクリーンショット 2019 04 27 at 10.23. 49午前

ドロップダウンで [Docker デスクトップについて] を開いて、バージョン 2.0.4.0 (33772)+ を使用していることを確認します。

デスクトップについて

例!

今では、これらの優れた新機能の使用方法に興味があると確信しています。いくつかの例を簡単に見てみましょう。まず、ビルダーをリストアップします。

~ ❯❯❯ docker buildx ls
名前/ノード ドライバー/エンドポイントの状態プラットフォーム
デフォルト * ドッカー
  Linux/amd64, linux/arm64, linux/arm/v7, linux/arm/v6 を実行しているデフォルトのデフォルト

現在、基本的に古いビルダーであるデフォルトのビルダーを使用しています。いくつかの新しいマルチアーキテクチャ機能にアクセスできる新しいビルダーを作成しましょう。

~ ❯❯❯ docker buildx create --name myBuilder
マイビルダー
~ ❯❯❯ docker buildx use myBuilder
~ ❯❯❯ docker buildx inspect --bootstrap
[+]建物 2.5秒 (1/1) 完成しました
 => [内部] ビルドキット 2.5s の起動
 => => イメージのモビー/ビルドキットを引っ張る:マスター1.3秒
 => => 1.2秒buildx_buildkit_mybuilder0コンテナの作成
名前: マイビルダー
ドライバ:ドッカーコンテナ

ノード:
名前: マイビルダー0
エンドポイント: unix:///var/run/docker.sock
ステータス: 実行中

プラットフォーム: linux/amd64, linux/arm64, linux/arm/v7, linux/arm/v6

ここでは、mybuilderという名前の新しいビルダーインスタンスを作成し、それに切り替えて検査しました。--bootstrap これは必要ではなく、ビルドコンテナをすぐに起動するだけです。次に、ワークフローをテストし、マルチアーキテクチャイメージを構築、プッシュ、実行できることを確認します。簡単なサンプル Dockerfile を作成し、いくつかのイメージ バリアントをビルドして、Hub にプッシュしてみましょう。

~ ❯❯❯ mkdir test & cd test && cat <<EOF > Dockerfile
ウブンツから
RUN apt-get update & apt-get install -y curl
WORKDIR /src
写し。.
EOF
~/test ❯❯❯ docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t adamparco/demo:latest --push .
[+]建物 6.9s (19/19) 終了しました
...
 => =>レイヤー2.7秒を押す
 => =docker.io/adamparco/demo:latest のマニフェストをプッシュ>2.2

それはうまくいきました!このフラグは --platform 、Intel 64ビット、Arm 32ビット、およびArm 64ビットアーキテクチャ用のLinuxイメージを生成するように指示 buildx されています。 このフラグは --push 、マルチアーキテクチャ マニフェストを生成し、すべてのイメージを Docker Hub にプッシュします。私たちがしたことに inspect 使用 imagetools しましょう。 

~/test ❯❯❯ docker buildx imagetools inspect adamparco/demo:latest
名前: docker.io/adamparco/demo:latestMediaType: application/vnd.docker.distribution.manifest.list.v2+jsonダイジェスト:sha256:2a2769e4a50db6ac4fa39cf7fb300fa26680aba6ae30f241bb3b6225858eab76

マニフェスト:
  名前: docker.io/adamparco/demo:latest@sha256:8f77afbf7c1268aab1ee7f6ce169bb0d96b86f585587d259583a10d5cd56edca  MediaType: application/vnd.docker.distribution.manifest.v2+json  プラットフォーム: linux/amd64

名前: docker.io/adamparco/demo:latest@sha256:2b77acdfea5dc5baa489ffab2a0b4a387666d1d526490e31845eb64e3e73ed20  MediaType: application/vnd.docker.distribution.manifest.v2+json  プラットフォーム: linux/arm64

名前: docker.io/adamparco/demo:latest@sha256:723c22f366ae44e419d12706453a544ae92711ae52f510e226f6467d8228d191  MediaType: application/vnd.docker.distribution.manifest.v2+json  プラットフォーム: linux/arm/v7

このイメージは、adamparco/demo:latest というタグを付けて Docker Hub で利用できるようになりました。そのイメージからコンテナを Intel ラップトップ、Amazon EC2 A1 インスタンス、Raspberry Pis などで実行できます。Docker は現在のアーキテクチャに適したイメージをプルするため、Raspberry Pis は 32 ビット Arm バージョンを実行し、EC2 A1 インスタンスは 64 ビット Arm を実行します。

SHA タグは完全修飾イメージ バリアントを識別し、Docker Desktop で別のアーキテクチャをターゲットとするイメージを実行することもできます。SHAタグを使用してそれらのいくつかを実行し、それらが実際に期待するアーキテクチャであることを確認できます。

~/test ❯❯❯ docker run --rm docker.io/adamparco/demo:latest@sha256:2b77acdfea5dc5baa489ffab2a0b4a387666d1d526490e31845eb64e3e73ed20 ウナメ -m
aarch64
~/test ❯❯❯ docker run --rm docker.io/adamparco/demo:latest@sha256:723c22f366ae44e419d12706453a544ae92711ae52f510e226f6467d8228d191 ウナメ -m
アームV7L

上記では、期待どおりにaarch64とarmv7lが返されたことがわかります uname -m が、このすべてのビルドと実行は、私のネイティブmacOS開発者マシンで実行されています。これらすべてを可能にするために必要なテクノロジ スタックと構成については上記で説明しましたが、エクスペリエンスが実際にどれほど強力でシームレスであるかを振り返ってみましょう。Docker Desktopとbuildxがなければ、これを行うのははるかに難しく、間違いなくもっと面倒だったでしょう。

最後のもう少し複雑な例、ホストアーキテクチャを表示するPythonフラスコWebアプリケーションを実行します。

~❯❯❯ docker buildx build -t adamparco/helloworld:latest --platform linux/arm64 --push github.com/adamparco/helloworld
[+]建物 69.1s (11/11) 完成しました
 =>キャッシュされた[内部]ロードgitソース github.com/adamparco/helloworld0.0秒
 => [内部]docker.io/library/python:3.7-alpine 0.5秒のメタデータをロードする
 => [ベース1/1] docker.io/library/python:3.7-alpine@sha256:b3957604aaf12d969 から 3.6秒
...
 => => プッシュレイヤー 7.3秒
 => =>docker.io/adamparco/helloworld:latest のマニフェストをプッシュする0.3秒

ここでは単一のプラットフォームを指定したので、このイメージは64ビットArm専用にビルドされています。今私はそれを実行し、いくつかのポートを公開します。

~❯❯❯ docker run -p5000:5000 adamparco/helloworld:latest
...
 *フラスコアプリ「こんにちは」の提供(遅延読み込み)
 * 環境: 生産
 *デバッグモード:オフ
 * http://0.0.0.0:5000/ で実行 (終了するには Ctrl + C キーを押します)

私のブラウザをロードしてそれをポイントすると localhost:5000 、次のようになります。

スクリーンショット 2019 04 24 at 6.04. 12午後

これで、Dockerコマンドを使用してマルチアーキテクチャイメージを構築および実行するのが簡単です。これらは、buildxでできることのほんの一部です。 近い将来、さらに多くの新しいエキサイティングな機能を追加する予定です。

アマゾン EC2 A1 クレジット

期間限定で、でサインアップしてください beta.docker.com Amazon EC2 A1 インスタンスの 無料 クレジットを受け取り、Arm イメージのテストとデプロイを今すぐ開始できます。

 

参考

Github リポジトリ

https://github.com/docker/buildx

https://github.com/moby/buildkit

https://github.com/linuxkit/linuxkit

https://github.com/docker/for-mac

https://github.com/docker/for-win

https://github.com/moby/qemu

フォーラム

https://forums.docker.com/c/docker-desktop-for-mac/

https://forums.docker.com/c/docker-desktop-for-windows/

https://forums.docker.com/c/general-discussions/

デモループ