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

推薦する

Linux カーネルプログラミングにおけるコンテナの of() 関数の紹介

序文Linux カーネルプログラミングでは、マクロ関数 container_of(ptr, type...

MySQL に配列を保存するサンプルコードと方法

多くの場合、ストアド プロシージャを作成するときに配列がよく使用されますが、MySQL ではストアド...

nginx.conf のルートディレクトリ設定の詳細な説明

nginx.conf を構成するときには常に何らかの問題が発生します。ここでは、よくある問題とその解...

Centos7 システム上の nginx サーバーで Phalcon 環境を構築する方法の詳細な説明

この記事では、centos7 システムの nginx サーバーの下に phalcon 環境を構築する...

Vueベースのビデオプレーヤーの実装例

既存のビデオ プレーヤーがニーズを満たせない場合は、ビデオを自分でカプセル化する必要があります。ビデ...

一般的なフロントエンドJavaScriptメソッドのカプセル化

目次1. 値を入力し、そのデータ型を返す** 2. アレイ重複排除3. 文字列の重複排除4. ディー...

Tomcat の maxPostSize 設定に関する問題と注意事項

1. maxPostSize を設定する理由は何ですか? tomcat コンテナには送信データのサイ...

ルート権限なしでログインするためのDockerソリューション

docker コマンドを初めて使用する場合、権限の問題を確認するメッセージが表示されます。 unix...

ウェブメッセージボード機能を実現するjs

この記事の例では、Webメッセージボードを実装するためのjsの具体的なコードを参考までに共有していま...

MySQLが間違ったインデックスを選択する理由と解決策

MySQL では、テーブルに複数のインデックスを指定できますが、ステートメントの実行時に、使用するイ...

HTML割引価格計算の実装原理とスクリプトコード

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

MySQL 継続的集計の原理と使用法の分析

この記事では、例を使用して、MySQL の継続的な集計の原理と使用方法を説明します。ご参考までに、詳...

GET POSTの違い

1. Get はサーバーからデータを取得するために使用され、Post はサーバーにデータを渡すために...

Nginx を使用して rtmp ライブ サーバーを実行する方法

今回は、コンピューターや携帯電話用の rtmp ライブ ブロードキャスト サーバーを設定し、ライブ ...

CSS3の3D効果を使って立方体を作成する

CSS3 の 3D 効果を使用して立方体を作成する方法を学ぶと、3D シーンの回転と変位のプロパティ...