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

推薦する

HTTP ステータス コード

このステータス コードは、リクエストのステータスに関する情報を提供し、サイトとリクエストされたページ...

CSSにおけるマージン値と垂直マージンの重なりについて

平行ボックスの余白 (二重余白の重なり) に関する面接の質問: 1 つのボックスに上余白があり、もう...

Jenkins でユーザー ロールの権限を設定する方法

Jenkinsのユーザーロール権限の設定には、ロール戦略プラグインのインストールが必要です。 1.ロ...

SQL効率を分析する方法を説明する

Explain コマンドは、データベースのパフォーマンス問題を解決するために最初に推奨されるコマンド...

ウェブデザイナーもウェブコーディングを学ぶ必要がある

多くの場合、Web デザインが完成した後でデザイナーの無知が露呈し、批判されることがあります。彼らは...

Vueグローバルカスタム命令の実践 モーダルドラッグ

目次背景実装のアイデア成果を達成する背景最近取り組んでいるプロジェクトは、Vue2 で構築されたプロ...

CSS トランジションを使用した円形ホバー効果のサンプルコード

この記事では ソースコードのオンラインプレビューとダウンロード今日のチュートリアルでは、円のホバー効...

iframeリフレッシュ方式の方が便利

iframeを更新する方法1. 更新するには、JavaScriptのdocument.fr.loca...

便利で使いやすいウェブアプリケーションを設計するための 10 のヒント

より使いやすい Web アプリケーションを設計するための 10 のヒントをご紹介します。ヒント1: ...

Layuiテーブルは指定された行のラジオボタンを選択し、その行の実装コードまでスクロールします。

layui テーブルには複数行のデータがあります。外部入力コンテンツを通じて、指定された行を見つけ...

CSSオーバーフローメカニズムについての簡単な説明

CSS オーバーフローのメカニズムを詳細に学ぶ必要があるのはなぜですか?実際の開発プロセスでは、コン...

HTMLウェブページのMETAタグのコンテンツを書く際のポイント

META タグは、HTML 言語のヘッダー領域にある補助タグです。作成者、日時、Web ページの説明...

MySQL でのサブクエリの基本的な使用法

目次1. サブクエリの定義2. サブクエリの分類1. スカラーサブクエリ: 2. MySQLサブクエ...

doctype のマークアップ検証

しかし最近、この方法を使用すると問題が発生することがわかりました。コードを参照してください。コードを...

MySQL GTID の総合概要

目次01 GTIDの紹介02 GTIDの仕組み03 GTIDの利点と欠点04 テスト環境構築05 テ...