僕は技術ができない

技術のできないスーツ園児ニアが考えていること

Docker Registry と Repository の違いをめちゃくちゃわかりやすく説明してみた

Docker には Docker Registory(以下 レジストリ)と Repository(以下リポジトリ)の概念があります。

「レジストリ」のことを「リポジトリ」って普段あまり意識せずに使ったりしますが、全然違うものなのでしっかりと区別して理解しておきたいです。

まだ僕は Docker 初心者なので間違ってるかもしれません。コメントください。


目次

まずはふわっと理解

まず、 レジストリ は「コンテナイメージをホストするサーバ」のことを指します。Docker イメージを保管しておく場所です。

そして、 リポジトリ は「同じイメージ名だけど、異なるタグを持つイメージの集合」のことを指します。

以下では「リポジトリは機能的に似通ったイメージのコレクションで、同じ名前を持つが異なるバージョンがあって、タグによって個々のイメージは区別できる」と言及されています。

Repository is a collection of the functionally similar images, which share same name but may represent different versions/flavours of the same software. Images in the repository are distinguished by tags.

What is the difference between a Docker repository and an image?


絵に描いてみるとこんな感じです。

f:id:contemporarycuz:20190830010306p:plain

イメージ名に対応するリポジトリがあり、それらをレジストリがホストしているという構造になります。

実際にはレジストリとして Docker Hub やプライベートレジストリを利用するため、
<リポジトリ名> <レジストリホスト名>/<イメージ名>
となります。

例えば、my-private-registry/my-image とか。


手を動かして確認

ふわっと理解したら、実際に手を動かして確認してみます。

ローカルに持っているイメージにタグをつけていきます。 ここでは Azure Container Registry を利用する感じで書きますが、本筋には関係ないはずです。

# とりあえずタグをつける
$ docker tag my-local-image my-private-registry.azurecr.io/my-image:1.0.0

# プッシュするイメージ名は "同じ" で タグを変える
$ docker tag my-local-image my-private-registry.azurecr.io/my-image:1.1.0

# イメージ名が異なるリポジトリ名をつける
$ docker tag my-local-image my-private-registry.azurecr.io/my-image-another:1.2.0

次にリモートリポジトリにプッシュします。

$ docker push my-private-registry.azurecr.io/my-image:1.0.0

$ docker push my-private-registry.azurecr.io/my-image:1.1.0

$ docker push my-private-registry.azurecr.io/my-image-another:1.2.0

レジストリ 内の リポジトリ 一覧を取得します。

$ az acr repository list --name my-private-registry --output table

Result
------------------------
my-image
my-image-another

3つのイメージをプッシュしましたが、その内2つのイメージ名が同じなので、結果的にリポジトリは2つになっています。

最後にそれぞれのリポジトリのタグ一覧を確認してみます。

# リポジトリ "my-private-registry.azurecr.io/my-image" のタグ一覧を取得
$ az acr repository show-tags --name my-private-registry --repository my-image --output table

Result
--------
1.0.0
1.1.0

# リポジトリ "my-private-registry.azurecr.io/my-image-another" のタグ一覧を取得
$ az acr repository show-tags --name my-private-registry --repository my-image-another --output table

Result
--------
1.2.0

人と話をするときには ちゃんと レジストリ と リポジトリ を使い分けて話そうと思います。