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

推薦する

このようなシェル スクリプトを使用して、多数の MySQL データベースを強制終了します (推奨)

朝早くに電話で起こされました。あるプロジェクトのデータベースがダウンしていて起動できないとのことでし...

ページコードの変更の効率を向上させ、HTML言語のコア知識を習得します。

ウェブサイトを構築するとき、HTML 言語は重要ではないと思われるかもしれませんが、実際には、基本的...

dockerネットワーク双方向接続の詳細な説明

Dockerネットワークを見るdocker ネットワーク ls [root@master ~]# d...

CSS3を使って歌詞進行テキストカラー塗りつぶし変更の動的効果を実装するアイデアの詳細な説明

音楽を再生すると、曲が進むにつれて歌詞が徐々に色づきます。色は単語ごとに変わるのではなく、左から右へ...

Alibaba CloudがCloud Shieldから無料のSSL証明書(https)を申請

プロジェクトでは https サービスを使用する必要があるため、Alibaba Cloud では無料...

シャトルボックス機能を実装するためのVueの詳細なコード

Vue - シャトルボックス機能を実装します。効果図は次のようになります。 CS 。移行{ ディスプ...

CSS ボーダーは四隅の実装コードを追加します

1.html <div class="ログインボディ"> <...

el-table カプセル化に基づくドラッグ可能な行と列、および選択列コンポーネントの実装

効果環境が必要ビュー要素UIドラッグアンドドロッププラグインSortable.js必要な構成プロパテ...

MySQLの使用中に発生した問題

ここでは、MySQL の使用中に発生するいくつかの問題とその解決策を示します。 sql_mode=o...

Centos7.3は起動時に自動的に起動または指定されたコマンドを実行します

Centos7では、/etc/rc.d/rc.localファイルの権限が削減されており、実行権限があ...

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

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

jsはカスタムドロップダウンボックスを実装します

この記事の例では、カスタムドロップダウンボックスを実装するためのjsの具体的なコードを参考までに共有...

MySQL 8.0 における非同期レプリケーションの 3 つの方法について簡単に説明します。

この実験では、空のデータベース、オフライン、オンラインの 3 つのモードで、1 つのマスターと 2 ...

ウェブサイトを高速化する

パフォーマンスは本当に重要ですか?パフォーマンスは重要であり、誰もがそれを知っています。なぜ私たちは...

Google Web Fonts でウェブサイトに無制限のフォントを追加

長い間、リソースの制約により、使用できるフォントが限られていたため、Web サイトの開発は妨げられて...