Docker buildx を使用してマルチプラットフォーム イメージをビルドし、プライベート リポジトリにプッシュする方法

Docker buildx を使用してマルチプラットフォーム イメージをビルドし、プライベート リポジトリにプッシュする方法

導入

最近、Docker の ARM バージョンがあることを知りました。 hub.docker.com にも ARM バージョンのイメージがあるのですが、ARM バージョンの Docker イメージをビルドするのが問題です。組み込みプログラムは PC 上でクロスコンパイルできますが、Docker にクロスビルド ソリューションがあるかどうかはわかりません。

プラン

Docker を使用して ARM イメージを構築する方法はいくつか考えられます。 3番目はクロスコンパイルに似ています。

  1. ARM ホストを使用して、Docker の ARM バージョンをインストールします。Docker によってビルドされるイメージは ARM バージョンです。
  2. qemu などの Linux 仮想化ソフトウェアを使用して、ARM チップ + Linux をシミュレートします。
  3. Docker の実験的な機能 buildx を使用すると、複数のプラットフォーム用のイメージをビルドできます。

Docker buildx を使用して複数のプラットフォーム イメージを構築する

以下のリンクを参照してください。
マニフェスト
ビルド
翻訳: 翻訳元: docker, 翻訳元日本語訳: docker, 翻訳元日本語訳: docker, 翻訳元日本語訳: docker

docker の 2 つの実験的な機能が使用されており、使用時には実験的な機能を有効にする必要があります。

Docker マニフェスト、マニフェストはイメージ情報を含むファイルです。マニフェスト リストは、異なる OS/アーキテクチャのイメージ情報を保存するために使用されるイメージ リストです。 2 つのイメージを指すマニフェスト リストを作成し、複数のプラットフォームをサポートできます。

docker buildx、buildx は docker のプラグインであり、次世代の docker イメージ構築です。このプラグインは、qemu-user-static を介してさまざまなプラットフォームの命令セットを変換し、x64 上で他のプラットフォームのプログラムを実行します。 buildx は実際には、マルチプラットフォーム ビルドに moby/buildkit:buildx-stable-1 イメージを使用します。

マルチプラットフォーム版のDockerレジストリを構築する

Docker レジストリ イメージをビルドするには、次のリンクを参照してください。
https://community.arm.com/developer/tools-software/tools/b/tools-software-ides-blog/posts/deploying-multi-architecture-docker-registry

buildx のバグを解決するために DNS サーバーを構築する

buildx プラグインはローカル ホスト ファイルを使用しないため、DNS を使用する必要があります。これはバグです (https://github.com/docker/buildx/issues/218)。コミュニティでは誰も気にしていません。
解決策: 独自の DNS を構築し、ミラー アドレス buildx.com をレジストリ マシンにポイントして、後で nginx を使用します。 Ubuntu にはデフォルトの systemd-resolved がありますが、これは dnsmasq で無効にされてから有効になります。

nginx プロキシを使用して命名問題を解決する

HTTP と HTTPS の両方をサポートするために nginx プロキシを追加しました。 buildx プラグインは HTTPS の使用を強制し、それをオフにする方法はありませんでした。
証明書の問題が表示されます。証明書はこのドメイン名のものではありません。解決策は、証明書を再生成し、独自のドメイン名を入力することです。
証明書の問題。自己署名証明書を信頼しないでください。自己署名証明書を buildx デーモン コンテナの証明書信頼チェーンに追加します。 https://github.com/docker/buildx/issues/80#issuecomment-533844117

Nginx は、クライアントがプッシュするときにいくつかの問題を解決するために 2 つの構成を追加します。

# nignx.conf 設定 proxy_ignore_client_abort on; # クライアントの警告を無視 client_max_body_size 0; # アップロードファイルサイズ無制限 # 仮想ホスト設定 server {
  聞く 443;
  サーバー名 buildx.com;
  sslオン;
  ssl_certificate crt/server.crt;
  ssl_certificate_key crt/server.key;
  ssl_session_timeout 5分;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #このプロトコルに従って設定します ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; #このスイートに従って設定します ssl_prefer_server_ciphers on;
  位置 / {
    プロキシパス http://192.168.1.11:81;
  }
}

サーバー{
  聞く 80;
  サーバー名 buildx.com;
  位置 / {
    プロキシパス http://192.168.1.11:81;
  }
}

ローカルDocker環境の設定

ローカル Docker では実験的な機能を有効にする必要があります。

  1. /etc/docker/daemon.json で "experimental": true を設定し、Docker を再起動します。 Docker デーモンの実験的な機能を有効にします。
  2. Docker クライアントの実験的な機能を有効にするには、ローカルで export DOCKER_CLI_EXPERIMENTAL=enabled を実行します。
  3. docker version を使用して、実験的な機能が有効になっているかどうかを確認します。
  4. docker run --rm --privileged docker/binfmt:820fdd95a9972a5308930a2bdfb8573dd4447ad3 を実行してカーネルの binfmt_misc 関数を有効にし、現在のプラットフォームで複数のプラットフォーム上のプログラムを実行できるようにします。
  5. aarch64 プログラムがサポートされているかどうかを確認します。 /proc/sys/fs/binfmt_misc/qemu-aarch64 を cat します。
  6. この時点で、ローカル Docker はさまざまなプラットフォームの Docker コンテナを実行できます。たとえば、arm64。次のコマンドを使用してテストできます。
# arm64 バージョンのイメージをプルし、docker pull --platform arm64 alpine:3.10 を実行します。
docker run --rm -it alpine:3.10 sh

ベースイメージを作成する

hub.docker.com から複数のプラットフォームのバージョンを取得し、マニフェスト リストを生成して、レジストリにアップロードできます。

# arm64 バージョンをプルし、名前を変更してアップロードします。 特定のイメージが複数のプラットフォームをサポートしているかどうかは、hub.docker.com で確認できます。
docker pull --platform arm64 centos:7
docker タグ centos:7 buildx.com/base/centos-arm64:7
docker push buildx.com/base/centos-arm64:7
# amd64 バージョンをプルし、名前を変更してアップロードします docker pull --platform amd64 centos:7
docker タグ centos:7 buildx.com/base/centos-amd64:7
docker push buildx.com/base/centos-amd64:7
# マニフェスト リストを作成してアップロードします。
docker マニフェスト作成 --insecure buildx.com/base/centos:7 buildx.com/base/centos-amd64:7 buildx.com/base/centos-arm64:7
docker マニフェスト プッシュ --insecure buildx.com/base/centos:7

ビジネスイメージの構築

# buildx では複数のプラットフォームを指定できますが、Dockerfile 内の FROM イメージに対応するバージョンが必要です。
# buildx によってパッケージ化されたイメージはローカルに保存されません。docker リポジトリをアップロードするには --push を追加します。あるいは、--output を使用して出力方法を指定することもできます。
docker buildx ビルド --platform linux/amd64,linux/arm64 -t buildx.com/base/java-base:openjdk-8-centos7 . --push

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Dockerを使用してクローンリポジトリを使用してGitイメージを構築する
  • Docker用国産イメージウェアハウスの使い方
  • Jenkins は Docker イメージを構築し、Harbor ウェアハウスにプッシュします
  • docker-maven-pluginはイメージをパッケージ化し、プライベートウェアハウスにアップロードします。
  • Dockerイメージリポジトリの使い方
  • Docker プライベート イメージ リポジトリの Alibaba Cloud 展開手順
  • Dockerコンテナ練習用イメージウェアハウス

<<:  MySQL 最適化技術における Limit クエリの最適化分析

>>:  WeChatミニプログラムページで値を返す4つの解決策のまとめ

推薦する

Vueページジャンプの実装方法

1. this.$router.push() 1. ビュー <テンプレート> <d...

ネイティブ JavaScript 継承方法とその長所と短所の詳細な説明

目次序文プロトタイプ継承アドバンテージ欠点コンストラクタの継承アドバンテージ欠点組み合わせ継承寄生的...

MySQL は information_schema オブジェクトの付与をバイパスし、ERROR 1044 (4200) エラーを報告します

この質問は、MySQL の権限に関する WeChat グループのネットユーザー間の議論です。次のよう...

CSS で透明なグラデーション効果を実装するためのサンプルコード

Zhihu Discovery コラムのタイトル画像は、通常、以下のように表示されます。明らかに、グ...

Three.js が Facebook Metaverse 3D ダイナミック ロゴ効果を実現

目次背景メタバースとは何ですか?成果を達成するトライアル 1: THREE.TorusGeometr...

HTML+CSS+jQuery はスクリーンショットで検索ホットリストタブ効果を模倣します

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

XHTML CSS ページをプリンタ ページに変換する

以前は、Web ページのプリンタ対応バージョンを作成するには、印刷したときに見栄えがよくなるようにレ...

CocosCreator ソースコードの解釈: エンジンの起動とメインループ

目次序文準備行く!文章プロセスを開始するメインループまとめ要約する序文準備皆さんは、こんなことを考え...

Mac に mysql5.7 をインストールするための完全な手順 (画像とテキスト付き)

最近、Mac システムを使用して、ローカル Web サーバー環境を構築する準備をしていました。 Ma...

Linux 編集の開始、停止、再起動の Springboot jar パッケージ スクリプトの例

序文springboot設定ファイルでは、設定ファイルの名前には独自の意味と用途があります。 dev...

Web ページでパラメータ名によって ActiveX コントロールのプロパティに値を割り当てる例

コードをコピーコードは次のとおりです。 <HTML> <ヘッド> <T...

自動行折り返し機能付き CSS Flex レイアウトのサンプル コード

フレックス コンテナーを作成するには、要素に display: flex プロパティを追加するだけで...

Vue 折りたたみ表示の複数行テキスト コンポーネントの実装コード

折りたたみ表示の複数行テキストコンポーネント複数行のテキスト コンポーネントを折りたたんで表示し、展...

Node.jsはexpress-fileuploadミドルウェアを使用してファイルをアップロードします

目次プロジェクトを初期化するサーバーの作成クライアントを初期化するコンポーネントの記述ファイルアップ...

MySQL データ型の完全分析

データ型: 列に格納できるデータとそのデータが実際にどのように格納されるかを定義する基本ルール。デー...