Docker Buildxを使用して複数のシステムアーキテクチャイメージを構築する

Docker Buildxを使用して複数のシステムアーキテクチャイメージを構築する

[[418928]]

1. ツールの説明

  • Docker >= 19.03 をインストールします。このバージョンの Docker には buildx が含まれています。
  • buildx をインストールします: https://github.com/docker/buildx#in。
  • Linux カーネル >= 4.8: この Linux カーネル バージョン以降、binfmt_misc は fix-binary (F) フラグをサポートします。 fix_binary フラグを使用すると、ハンドラー バイナリがそのコンテナーまたは chroot 内で可視のファイル システムの一部でない場合でも、カーネルはコンテナーまたは chroot 内で binfmt_misc に登録されたバイナリ形式ハンドラーを使用できるようになります。

Docker Buildx は、docker コマンドを拡張して Moby BuildKit が提供する機能をサポートする docker CLI プラグインです。 docker build と同じユーザー エクスペリエンスを提供し、多くの新機能を追加します。

BuildKit は、多くの主要機能を備えた次世代のイメージ構築コンポーネントです。この記事では、複数のシステム アーキテクチャをコンパイルできる機能を主に使用します。

URL: https://github.com/moby/buildkit

この機能は Docker v19.03 以降でのみ使用できることに注意してください。

この記事では、Buildx を使用して複数のシステム アーキテクチャのイメージをビルドする方法について説明します。

始める前に、Linux システム (すべての主要ディストリビューション) に 64 ビット Docker がインストールされていることを前提としています。

この記事の執筆時点で使用されている Docker バージョンは 19.03.11 です。

  1. root@i-3uavns2y:~# docker バージョン
  2. クライアント: Docker Engine - コミュニティ
  3. バージョン: 19.03.11
  4. APIバージョン: 1.40
  5. Goバージョン: go1.13.10
  6. Gitコミット: 42e35e61f3
  7. 作成日: 2020年6月1日月曜日 09:13:48
  8. OS/アーキテクチャ: linux/amd64
  9. 実験的: 
  10. サーバー: Docker Engine - コミュニティ
  11. エンジン:
  12. バージョン: 19.03.11
  13. API バージョン: 1.40 (最小バージョン 1.12)
  14. Goバージョン: go1.13.10
  15. Gitコミット: 42e35e61f3
  16. 作成日: 2020年6月1日月曜日 09:12:26
  17. OS/アーキテクチャ: linux/amd64
  18. 実験的: 
  19. コンテナ:
  20. バージョン: 1.2.13
  21. GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
  22. ランク:
  23. バージョン: 1.0.0-rc10
  24. GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
  25. docker-init:
  26. バージョン: 0.18.0
  27. Gitコミット: fec3683
  28. root@i-3uavns2y:~# uname -a
  29. Linux i-3uavns2y 4.15.0-55-generic #60-Ubuntu SMP 火曜 7月 2 18:22:20 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

2. 動作原理

Buildx は基本的にビルドキット API を呼び出し、ビルドはビルドキット環境で実行されます。複数のアーキテクチャがサポートされるかどうかは、ビルドキット環境によって異なります。ビルドキットが複数のアーキテクチャをサポートする必要がある場合は、ホスト マシン上で実行する必要があります。 (もちろんこれは必須ではなく、ビルドの要件に応じて制御されます)

BuildKit は、ビルドを呼び出すユーザーが実行しているアーキテクチャとオペレーティング システムだけでなく、複数のプラットフォーム向けにビルドするように設計されています。

ビルドを呼び出すときに、--platform フラグを設定して、ビルド出力のターゲット プラットフォームを指定できます (例: linux/amd64、linux/arm64、darwin/amd64)。

現在のビルダー インスタンスが docker-container または kubernetes ドライバーによってサポートされている場合は、複数のプラットフォームをまとめて指定できます。この場合、指定されたすべてのアーキテクチャのタイプを含むマニフェスト リストが作成されます。このイメージを docker run または docker service で使用すると、Docker はノードのプラットフォームに基づいて正しいイメージを選択します。

Buildx と Dockerfiles でサポートされている 3 つの異なる戦略を使用して、マルチプラットフォーム イメージを構築できます。

  • カーネルでのQEMUエミュレーションサポートの使用
  • 同じビルダーインスタンスを使用して複数のネイティブノード上にビルドする
  • Dockerfileのステージを使用して異なるアーキテクチャにクロスコンパイルする

ノードがすでに QEMU をサポートしている場合 (たとえば、Docker Desktop を使用している場合)、QEMU を開始するのが最も簡単な方法です。 Dockerfile を変更する必要はなく、BuildKit は利用可能なセカンダリ アーキテクチャを自動的に検出します。 BuildKit が異なるアーキテクチャ用のバイナリを実行する必要がある場合、binfmt_misc ハンドラに登録されたバイナリを介して自動的にロードされます。

ホスト OS 上の binfmt_misc を使用して登録された QEMU バイナリがコンテナー内で透過的に動作するには、fix_binary フラグを使用して登録する必要があります。これにはカーネル >= 4.8 および binfmt-support >= 2.1.7 が必要です。 /proc/sys/fs/binfmt_misc/qemu-* に何かあるかどうかを確認することで、正しく登録されているかどうかを確認できます。 Docker Desktop には他のプラットフォーム用の binfmt_misc サポートが事前設定されていますが、他のインストールでは tonistiigi/binfmt イメージを使用してインストールする必要がある場合があります。

  1. root@i-tpmja312:~# docker run --privileged --rm tonistiigi/binfmt --install all  
  2. root@i-tpmja312:~# ls /proc/sys/fs/binfmt_misc/qemu-*
  3. /proc/sys/fs/binfmt_misc/qemu-aarch64 /proc/sys/fs/binfmt_misc/qemu-ppc64le
  4. /proc/sys/fs/binfmt_misc/qemu-arm /proc/sys/fs/binfmt_misc/qemu-riscv64
  5. /proc/sys/fs/binfmt_misc/qemu-mips64 /proc/sys/fs/binfmt_misc/qemu-s390x
  6. /proc/sys/fs/binfmt_misc/qemu-mips64el

複数のネイティブ ノードを使用すると、QEMU が処理できないより複雑な状況をより適切にサポートでき、一般的にパフォーマンスが向上します。 --append フラグを使用して、ビルダー インスタンスに追加のノードを追加できます。

2. Buildxを有効にする

Docker は 19.03 で新しい機能を導入し、ARM イメージなどのさまざまな CPU アーキテクチャのイメージをビルドできるようになりました。これは、エミュレータを導入する必要なく Docker 自体が提供するネイティブの統合ビルド メカニズムですが、使用する前に設定する必要があります。 (バージョン 20.10 以降では、Docker CLI のすべての実験的な機能がデフォルトで有効になっており、システム環境変数を構成または設定する必要はありません。)

buildx コマンドは実験的な機能なので、最初に有効にする必要があります。

  • 問題現象

実験的な機能が有効になっていないため、直接使用すると以下の問題が発生する可能性があります。

  1. root@i-3uavns2y:~# docker buildx バージョン
  2. docker: 'buildx'    docker コマンドではありません
  3. 「docker --help」を参照してください 
  • dockerdの実験的な機能を永続的に有効にする

~/.docker/config.json ファイルを編集し、次の内容を追加します (以下のデモンストレーションは、.docker ディレクトリが事前に存在しない場合に適用されます)。バージョン情報を表示するには、docker version コマンドを使用します。設定が有効になると、Server: Docker Engine に Experimental: true が設定されていることがわかります。

  1. root@i-3uavns2y:~# mkdir ~/.docker
  2. root@i-3uavns2y:~# cat > ~/.docker/config.json <<EOF
  3. {
  4. 「実験的」 「有効」  
  5. }
  6. 終了
  7. root@i-3uavns2y:~# docker buildx バージョン
  8. github.com/docker/buildx v0.3.1-tp-docker 6db68d029599c6710a32aa7adcba8e5a344795a7
  • 臨時開店

Linux/macOS の場合、または環境変数を設定する場合 (非推奨):

  1. $ エクスポート DOCKER_CLI_EXPERIMENTAL=有効
  2. $ docker buildx バージョン
  3. github.com/docker/buildx v0.3.1-tp-docker 6db68d029599c6710a32aa7adcba8e5a344795a7

3. 新しいビルダーインスタンスを作成する

Docker 19.03 以降では、docker buildx build コマンドを使用して BuildKit でイメージをビルドできます。このコマンドは、複数のシステム アーキテクチャを同時にサポートする Docker イメージをビルドするための --platform パラメータをサポートしており、ビルド手順が大幅に簡素化されます。

Docker は Linux システム アーキテクチャの下では ARM アーキテクチャ イメージをサポートしていないため、この機能をサポートするために新しいコンテナーを実行できます。 Docker デスクトップ バージョンをセットアップする必要はありません (Mac システム)。

マルチアーキテクチャイメージの構築にはカーネル内の QEMU エミュレーションサポートを使用します。

  1. # シミュレータをインストールする(マルチプラットフォームイメージ構築用)
  2. $ docker run --rm --privileged tonistiigi/binfmt:latest --install all  

注: docker/binfmt の場合、最新のイメージを取得するには、URL: https://hub.docker.com/r/docker/binfmt/tags を参照してください。

デフォルトの Docker ビルダー インスタンスでは複数の --platforms を同時に指定できないため、最初に新しいビルダー インスタンスを作成する必要があります。同時に、国内のイメージの取得が遅いため、イメージ高速化アドレス dockerpracticesig/buildkit:master で設定したイメージを使用して、公式イメージを置き換えることができます。

プライベート イメージ アクセラレータをお持ちの場合は、https://github.com/docker-practice/buildx に基づいて独自のビルドキット イメージをビルドして使用できます。

  1. # 国内環境に適用可能
  2. root@i-3uavns2y:~# docker buildxを作成します  --use --name=mybuilder-cn --driver docker-container --driver-opt イメージ=dockerpracticesig/buildkit:master  
  3.  
  4. # Tencent Cloud 環境に適用可能 (Tencent Cloud ホスト、coding.net 継続的インテグレーション)
  5. root@i-3uavns2y:~# docker buildxを作成します  --use --name=mybuilder-cn --driver docker-container --driver-opt イメージ=dockerpracticesig/buildkit:master-tencent  
  6. # デフォルトの画像を使用する
  7. root@i-3uavns2y:~# docker buildxを作成します  --name mybuilder --driver docker-container  
  8.  
  9. # 新しく作成されたビルダーインスタンスを使用する
  10. root@i-3uavns2y:~# docker buildx 使用 mybuilder

既存のビルダーインスタンスを表示します。

  1. root@i-tpmja312:~# docker buildx ls
  2. 名前/ノード ドライバー/エンドポイント ステータス プラットフォーム
  3. mybuilder * dockerコンテナ
  4. mybuilder0 unix:///var/run/docker.sock 非アクティブ
  5. デフォルトのドッカー
  6. デフォルト    デフォルトではlinux/amd64、linux/386 が稼働しています

4. 新しいDockerfileを作成する

複数のシステム アーキテクチャのイメージをビルドするには、サポートする Dockerfile ファイルも必要です。ここでのマルチアーキテクチャ イメージに関する最も重要な点は、ベース イメージとインストールされたソフトウェアの両方が複数のアーキテクチャをサポートする必要があることです。

以下はサンプルの Dockerfile ファイルです。 Dockerfile ファイルの内容は次のとおりです。

  1. mkdir ~/demo
  2. cd ~/デモ
  3. cat > Dockerfile <<EOF
  4. から  --platform=$TARGETPLATFORM アルパイン 
  5. uname -a > /os.txt を実行します。
  6. コマンド cat /os.txt
  7. 終了

$TARGETPLATFORM は組み込み変数であり、その値は --platform パラメータによって指定されます。

これは alpine イメージをベースとしており、alpine は次の 7 つのシステム アーキテクチャをサポートしているため、作成するイメージもこれらの 7 つのシステム アーキテクチャをサポートします。

  1. linux/amd64、linux/arm/v6、linux/arm/v7、linux/arm64/v8、linux/386、linux/ppc64le、linux/s390x

よりわかりやすいスキーマ名は次のようになります。

  1. amd64、arm32v6、arm32v7、arm64v8、i386、ppc64le、s390x

ARM システム アーキテクチャの簡単な概要は次のとおりです。

  1. arm64、armv8l、arm64v8、aarch64
  2. アーム、アーム32、アーム32v7、アームv7、アームv7l、アームhf
  3. arm32v6、armv6、armv6l、arm32v5、armv5、armv5l、armel、aarch32

Intel と AMD の比較ははるかに簡単です。

  1. x86、386、i386、i686
  2. x86_64、x64、amd64、その他の言語

5. イメージを構築する

docker buildx build のパラメータの具体的な意味については、次の公式ドキュメントを参照してください: https://docs.docker.com/engine/reference/commandline/buildx_build/ 。

$ docker buildx build コマンドを使用してイメージをビルドします。 myusername を自分の Docker Hub ユーザー名に置き換える必要があることに注意してください。 --push パラメータは、ビルドされたイメージを Docker リポジトリにプッシュすることを意味します。次に、マルチシステム アーキテクチャ イメージをビルドし、ビルドしたイメージを Docker リポジトリ (hub.docker.com) にプッシュします。この操作の前に、アカウントを登録し(デモのプロセスでは省略)、ログインする必要があります。

ログインコマンドは次のとおりです。

  1. root@i-tpmja312:~/demo# dockerログイン

ログインするにはユーザー名とパスワードを入力してください。

次のコマンドのタグの前に、ユーザー名 doubledong が付いていることに注意してください。独自の画像を作成したい場合は、独自のユーザー名に置き換えてください。

--push パラメータを使用してイメージをビルドし、Docker リポジトリにプッシュします。

ビルドコマンドは次のとおりです。

7つのプラットフォームをサポートするためにローカルでイメージを構築する

  1. root@i-tpmja312:~/demo# docker buildx ビルド--platform linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/386,linux/ppc64le,linux/s390x -t doubledong/hello 。 - 押す 
  2.  
  3. # 画像情報を表示
  4. root@i-tpmja312:~/demo# docker buildx imagetools を検査 doubledong/hello
  5. 名前: docker.io/doubledong/hello:latest
  6. メディアタイプ: application/vnd.docker.distribution.manifest.list.v2+json
  7. ダイジェスト: sha256:7fd51fbd9f5a478c751ab2138d87341da7937b82bbf2362b23d474727b2c7234
  8.  
  9. マニフェスト:
  10. 名前: docker.io/doubledong/hello:latest@sha256:564098e26174ef2142fbb8bf21d3e57bc2cb31e31933e6e23c5ee8a7bea05219
  11. メディアタイプ: application/vnd.docker.distribution.manifest.v2+json
  12. プラットフォーム: linux/amd64
  13.  
  14. 名前: docker.io/doubledong/hello:latest@sha256:d378c84bcd8bce4b5d771be692bd251a8cb3bbaca9f203d20a5da6989d42c614
  15. メディアタイプ: application/vnd.docker.distribution.manifest.v2+json
  16. プラットフォーム: linux/arm/v6
  17.  
  18. 名前: docker.io/doubledong/hello:latest@sha256:1968399b3651bbcb0dc6218e6dfcb261995723decf39b9c80327624409158ff5
  19. メディアタイプ: application/vnd.docker.distribution.manifest.v2+json
  20. プラットフォーム: linux/arm/v7
  21.  
  22. 名前: docker.io/doubledong/hello:latest@sha256:62ac2af6e39ab10e77d83114931ff1abe449c30a86d0bf590d4bbf71836dcec1
  23. メディアタイプ: application/vnd.docker.distribution.manifest.v2+json
  24. プラットフォーム: linux/arm64
  25.  
  26. 名前: docker.io/doubledong/hello:latest@sha256:3ef9adac67717528ca95f89c184830aa072da155fc17e2a7e95dd9433d9aab51
  27. メディアタイプ: application/vnd.docker.distribution.manifest.v2+json
  28. プラットフォーム: linux/386
  29.  
  30. 名前: docker.io/doubledong/hello:latest@sha256:67e4c3e5c7eca8af5909373446e9e5fa6d1083223b3766bb8e9e6f41c01ca43b
  31. メディアタイプ: application/vnd.docker.distribution.manifest.v2+json
  32. プラットフォーム: linux/ppc64le
  33.  
  34. 名前: docker.io/doubledong/hello:latest@sha256:f3dc2d058e4915a61281d945ae92e77b44e2b81a601c63470ce1912e4e29c53e
  35. メディアタイプ: application/vnd.docker.distribution.manifest.v2+json
  36. プラットフォーム: linux/s390x

コマンドが正常に実行されると、Docker Hub にアップロードしたイメージが表示されます。例の写真は次のとおりです。

上記の手順を完了すると、ビルドされたイメージが実際にローカル パスに配置されます。次に、既存のビルダー インスタンスを確認しましょう。

  1. root@i-tpmja312:~/demo# docker buildx ls
  2. 名前/ノード ドライバー/エンドポイント ステータス プラットフォーム
  3. mybuilder * dockerコンテナ
  4. mybuilder0 unix:///var/run/docker.sock は linux/amd64、linux/arm64、linux/riscv64、linux/ppc64le、linux/s390x、linux/386、linux/mips64le、linux/mips64、linux/arm/v7、linux/arm/v6 を実行しています
  5. デフォルトのドッカー
  6. デフォルト    デフォルトではlinux/amd64、linux/386 が稼働しています

mybuilder では 8 つのアーキテクチャがサポートされていることがわかります (riscv64 はまだ使用されていませんが、サポートされています)。

このとき、docker イメージの実行状態を確認すると、buildx_buildkit_mybuilder0 というコンテナが実行中であることがわかります。

これは、現在ローカルでビルドするときに自動的に作成されます。停止したり削除したりしないように注意してください。

  1. root@i-tpmja312:~/demo# docker ps - as |grep buildx_buildkit
  2. e274b21faea2 moby/buildkit:buildx-stable-1 "buildkitd" 7 分前 7 分前 buildx_buildkit_mybuilder0 0B (仮想 144MB)

6. 最後に

複数のシステム アーキテクチャ用の Docker イメージを作成する場合は、強力な CPU または複数のコアを備えた VPS を使用してビルドすることをお勧めします。そうしないと、非常に時間がかかります。この記事では主に、マルチアーキテクチャ イメージを手動で構築する方法について説明しますが、cicd ツールを使用して自動化することもできます。以降の記事で説明する

参考リンク:

https://yeasy.gitbook.io/docker_practice/image/manifest

https://github.com/docker/buildx#installing

この記事はWeChatの公開アカウント「運営保守開発ストーリー」から転載したものです。

<<:  PaaSとは何ですか?どのようなポジショニングですか?利点は何ですか?

>>:  天一クラウドと中国アラブ博覧会が協力し、デジタル経済に新たな活力を注入

推薦する

クラウド技術特許出願ランキングが発表され、テンセント、アリババ、360がトップ3にランクイン!

1月10日、知的財産出版社i Think Tankは「中国インターネットクラウド技術特許分析レポート...

Godaddy - 初回注文で65%割引コード

Godaddy - 初回注文で 65% オフの割引コード、6 月 25 日に期限切れになります!左の...

CDN からエッジ コンピューティングまで、どちらが水に近いでしょうか?

CDN が誕生して以来、従来の CDN、クラウド CDN、共有 CDN の 3 世代が存在しましたが...

SEO は死んだのか? SEO の今後の方向性は?

「Forbes: SEO は終わり、ソーシャル リアルタイム コンテンツが人気」という記事があります...

タオバオ、低価格ショッピングガイドサイトを制限するために検索ソートルールを変更

タオバオは、サードパーティのトラフィックプラットフォームに関する新しいポリシーを発表しました。VIP...

クラウド移行のアプローチ、課題、リスク

クラウド移行アプローチは、既存のオンプレミス サーバーからクラウド コンピューティング サーバーにデ...

Google Analytics の検索エンジンのトラフィックの傾向を分析するにはどうすればよいですか?

SEO 担当者やウェブマスターは、通常、PV、UV、IP などの多くのデータを確認する必要があります...

百度の最近のアルゴリズム調整から学んだ教訓

最近、百度検索エンジンは頻繁にアルゴリズムを調整しています。数日前、私のウェブサイトの1つが毎日2つ...

ローコードデプロイメントで避けるべき7つの間違い

[[441390]]調査会社ガートナーによると、世界のローコード開発市場規模は2021年に138億米...

SEOにおける「サブドメインとディレクトリ」の違い

サブドメインとディレクトリに関しては、多くの人がそれらの違いを知らず、いつサブドメインを使用し、いつ...

百度のホームページで急速にランク付けするための6つの単語のマントラ

すべてのウェブマスターがウェブサイトの構築に一生懸命取り組んだ後、次に最も重要なことは、正確にターゲ...

2019 年のクラウド コンピューティング市場の競争は企業にとって何を意味するのでしょうか?

パブリッククラウドサービス市場は成長している調査会社ガートナーによると、パブリッククラウドの市場規模...

vpsserver - 香港 VPS/直接接続/$4.99/KVM/512m メモリ/250G トラフィック

vpsserver は 2009 年に設立されたアメリカのホスティング会社で、KVM 仮想化と純粋な...

vultr-新しいスナップショット機能は無料です

Vultr は、SSD VPS クラウドがスナップショット機能を正式にサポートすることを公式に発表し...