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 マスター スレーブ レプリケーションを構成する方法

推薦する

CSS3で実装されたサムネイルホバー効果

成果を達成する実装コードhtml <ヘッダー> <h1><em>...

Reactでファイルパスエイリアスを素早く設定する方法

React は、ユーザー インターフェイスを構築するための JavaScript ライブラリです。F...

ページにスクロールバーが表示されたときに、スクロールバーがページ幅に影響しないようにする方法

本体の幅をウィンドウの幅に設定します(次のスクリプトで制御されます) $("body&qu...

MySQL の結合テーブルにインデックスを作成する方法

この記事では、MySQL で 2 つのテーブルを関連付ける結合テーブルにインデックスを作成する方法を...

Zookeeperスタンドアロン環境とクラスタ環境の構築

1. 単一マシン環境の構築# 1.1 ダウンロードZookeeper の対応するバージョンをダウンロ...

JavaScriptの知識ポイントの詳しい説明

目次1. JavaScriptの基礎2. 基本的なJavaScript構文3. JavaScript...

Tomcat を再デプロイした後にイメージやその他のリソースが自動的に削除される問題を解決します

昨日は写真をアップロードしてリンクを返す機能を実装していました。プロジェクトが Tomcat に再デ...

VirtualBox でのホストオンリー + NAT モードのネットワーク構成

VirtualBoxのHost Only+NATモードのネットワーク構成は参考用です。具体的な内容は...

熟練デザイナーの7つの原則(2):色の使い方

<br />前回の記事:優秀なデザイナーの7つの原則(1):フォントデザイン 英語 原文...

Nginx バージョンのスムーズなアップグレードソリューションの詳細説明

目次背景: Nginx スムーズ アップグレード ソリューションフォールバック手順要約する背景:負荷...

MySQL 5.7 生成列の使用例の分析

この記事では、例を使用して、MySQL 5.7 で生成された列の使用方法を説明します。ご参考までに、...

DockerでGPUを使用するプロセスの詳細な説明

目次tf-gpu をダウンロード取得したtf-gpuイメージに基づいて独自のイメージを構築するイメー...

1つの記事でJavaScript DOM操作の基本を学ぶ

DOM の概念DOM: ドキュメント オブジェクト モデル: ドキュメント オブジェクト モデルは、...

MySQL 8.0.17 のインストールと設定のグラフィックチュートリアル

この記事は、参考のためにMySQL 8.0.17のインストールと設定のグラフィックチュートリアルを記...

複数の画像を切り替えるJavaScript

この記事では、複数の画像を切り替えるJavaScriptの具体的なコードを参考までに紹介します。具体...