Dockerレジストリイメージ同期の実装アイデア

Dockerレジストリイメージ同期の実装アイデア

はじめに

以前は、Docker イメージは Azure のコンテナー レジストリに保存されていました。最近、独自の Docker レジストリを構築しました。以前 Azure のコンテナー レジストリに保存した Docker イメージを独自の Docker レジストリに同期したいと考えています。

実装のアイデア

私たちの方法は比較的単純で低レベルですが、基本的には要件を満たすことができます。

私たちのアプローチは

  • まず、ソースレジストリ内のすべてのイメージのリストを取得します
  • 次に画像タグを一つずつ取得します
  • 次に、対応するイメージをローカルコンピュータにトラバースしてプルし、dockerタグを付けて新しいレジストリイメージ名として名前を付けます。
  • 次に、dockerイメージを新しいレジストリにプッシュします。
  • ローカルコンピュータにダウンロードされたイメージと新しいレジストリにプッシュされたイメージを削除します。

その後、Alibaba Cloudにイメージ同期ツールがあるらしいことを突然思い出しました。 https://github.com/AliyunContainerService/image-syncer image-syncer多対多のイメージリポジトリ同期に使用できるdockerイメージ同期ツールです。現在主流のdockerイメージリポジトリサービスのほとんどをサポートしています。紹介を見て良かったです。レジストリ間でイメージを同期する必要がある場合は、このツールを試してみてください。紹介によると、このツールはローカルディスクにプルしません。ソースレジストリからイメージデータを取得した後、新しいレジストリに直接プッシュされるため、はるかに効率的になります。

Docker レジストリ API

Dockerレジストリには一連の仕様があり、詳細についてはhttps://docs.docker.com/registry/spec/api/を参照してください。

すべての画像を取得

Dockerレジストリv2では、すべてのイメージを取得するための新しい_catalog APIが追加されました。v1は_searchに置き換えることができます。

構文は次のとおりです。

/v2/_catalog を取得する

デフォルトでは、最大 100 件のレコードが返されます。レコード数が 100 を超える場合は、パラメータnを使用して、返されるレコード数を指定できます。ページングを使用する場合は、別のパラメータlastを指定して、前のページの後に返される最後の画像を指定できます。例: http://example.com/v2/_catalog?n=20&last=b

画像タグを取得する

docker イメージのタグ リストを取得するには、 GET /v2/<repository-name>/tags/listを使用します。また、上記のイメージ リストの取得と同様に、ページングすることもできます。n n lastを使用して、ページングされた読み込みを実現できます。

操作例

デモ用にテスト用の Docker レジストリがローカルにデプロイされています。テストには httpie を使用します。

ミラーリストを取得します:

画像リストを取得するには_catalogインターフェースを呼び出します

http://5000/v2/_catalog

画像のタグリストを取得する

tags/listインターフェースを呼び出して画像タグを取得します

http://5000/v2/busybox/タグ/リスト
http:5000/v2/redis/タグ/リスト

PowerShell スクリプト

自動化されていない運用とメンテナンスはフーリガンです。将来的にも同様のニーズが発生する可能性が非常に高いです。自動的に実行するスクリプトを記述する方がよいでしょう。

以下のスクリプトは、Azure コンテナー レジストリにイメージがあまりなく、50 または 60 イメージ程度しかなく、イメージには最新のタグのみがあり、他のタグはないため、上記の手順は簡略化されており、ページングによってすべてのイメージが取得されるわけではなく、すべてのタグが取得されるわけでもありません。実際に使用する場合は、使用前に自分で変更してください。

# 変数
$srcRegUser = "xxx"
$srcRegPwd = "111111"
$srcRegHost = "xxx.azurecr.cn"
$destRegUser = "yyy"
$destRegPwd = "222"
$destRegHost = "registry.xxx.com"

# ソースレジストリからリポジトリを取得する
# httpie
$response = (http -b -a "${srcRegUser}:${srcRegPwd}" "https://${srcRegHost}/v2/_catalog") | ConvertFrom-Json
# カール
#$response = (curl -u "${srcRegUser}:${srcRegPwd}" "https://${srcRegHost}/v2/_catalog") | ConvertFrom-Json
# リポジトリ
$リポジトリ = $レスポンス.リポジトリ

#
書き込みホスト $repositories

# ログインソースレジストリ
docker ログイン $srcRegHost -u $srcRegUser -p $srcRegPwd
# ログイン先レジストリ
docker ログイン $destRegHost -u $destRegUser -p $destRegPwd

# 同期
foreach($repo と $repositories)
{
  書き込みホスト "同期 $repo 開始"

  $srcTag = "${srcRegHost}/${repo}:latest"
  $destTag = "${destRegHost}/${repo}:latest"

  Write-Host "ソース画像タグ: $srcTag"
  Write-Host "dest イメージ タグ $destTag"

  ホストへの書き込み「docker pull $srcTag begin」

  docker pull $srcTag

  Write-Host "docker pull $srcTag が完了しました"

  Write-Host "docker tag $srcTag $destTaging"

  docker タグ $srcTag $destTag

  ホストへの書き込み「docker push $destTag begin」

  docker push $destTag

  Write-Host "docker push $destTag が完了しました"
  
  書き込みホスト "docker rmi $srcTag $destTag begin"

  docker rmi $srcTag $destTag

  書き込みホスト "docker rmi $srcTag $destTag end"

  書き込みホスト「$repo の同期が完了しました」
}

ホストへの書き込み「完了しました...」

もっと

多数の画像を同期する必要がある場合は、Alibaba Cloud の画像同期ツールを使用して同期することを検討してください。

参照

https://stackoverflow.com/questions/31251356/docker-registry-v2 上のイメージのリストを取得する方法

https://github.com/AliyunContainerService/image-syncer

詳しくはこちら:

要約する

これで、docker レジストリ イメージの同期に関するこの記事は終了です。docker レジストリ イメージに関するその他の関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • プライベートイメージウェアハウスを構築するためのDockerレジストリの実装方法
  • プライベートレジストリ内の画像を照会または取得する方法
  • Docker 国内イメージ取得とイメージ高速化のレジストリミラー設定変更の詳しい説明
  • Dockerレジストリイメージを使用してプライベートリポジトリを作成する方法
  • Dockerレジストリイメージの削除とガベージコレクションの詳細な説明

<<:  MYSQLデータベースの最適化段階を簡単に理解する

>>:  Windows で MySQL マスター スレーブ レプリケーションを構成する方法

推薦する

HTMLフォーム要素の包括的な理解

以下のように表示されます。 XML/HTML コードコンテンツをクリップボードにコピー<!DO...

単純なCSSの詳細に惚れ込むと、重要ではないものの、効率性が向上する可能性がある

CSS の将来は非常に楽しみです。一方では、まったく新しいページ レイアウト方法であり、他方では、ク...

CSS3ダイヤモンドパズルはdivのみを回転し、背景画像は回転しない機能を実現します

需要背景プロジェクトはVueを使用して作成され、ビジネス要件にはパズル効果があります。デフォルトの背...

Vueは要素ツリーコントロールを通じてツリーテーブルを実装します

目次実装効果図依存関係をインストールするカスタムツリーコントロールその他の実装要約するVueでは、要...

MySQL クラスタの詳細な説明: 1 つのマスターと複数のスレーブのアーキテクチャ実装

実験環境: 1. CentOS 7 サーバー 3 台2. mysql5.7.26 (3台のマシンはす...

MySql 範囲内の検索時にインデックスが有効にならない理由の分析

1 問題の説明この記事では、確立された複合インデックスをソートし、レコード内の非インデックス フィー...

Vueはシンプルなショッピングカートの例を実装します

この記事では、参考までに、Vue の具体的なコードを共有して、簡単なショッピングカートを実装します。...

MYSQL フルバックアップ、マスタースレーブレプリケーション、カスケードレプリケーション、および半同期の概要

MySQL フルバックアップ1. バイナリログを有効にし、データベースから分離して別々に保存する v...

JavaScriptプロトタイプとプロトタイプチェーンを徹底的に理解する

目次序文基礎を築くプロトタイプコンストラクタのプロパティ__プロト__プロトタイプチェーン改善する要...

MySQL のデータ型とスキーマの最適化の詳細な説明

現在、MySQL の最適化について学習しています。この記事では、データ型とスキーマの最適化について紹...

CSS3の新しいセレクタの例

構造(位置)擬似クラスセレクタ(CSS3) :first-child : 指定されたセレクタは、親要...

MySQL 8.0.12 winx64 詳細なインストールチュートリアル

この記事では、MySQL 8.0.12のインストールチュートリアルを参考までに紹介します。具体的な内...

Linux プロセスが占有するポート番号を表示する 6 つの方法

Linux システム管理者にとって、サービスがポートに正しくバインドされているか、またはポートをリッ...

MySQL InnoDBとMyISAMの違いを簡単に理解する

序文MySQL は、myisam、innodb、memory、archive、example など、...