Dockerイメージ名はなぜ長いのかレジストリとリポジトリの違いから解説する

IBMクラウドにDockerイメージをプッシュしようと思ってチュートリアルを見るとこんな記述がありました。

$ docker push <region>.icr.io/<my_namespace>/<image_repo>:<tag>

Docker初心者なら誰でもこんな疑問を持つのではないでしょうか?

daiki
daiki

docker push イメージ名ではだめなんだろうか…
なんでこんな長いイメージ名がついているんだ?

本記事ではクラウドサービスにDockerイメージをプッシュする際のイメージ名の付け方の注意について紹介していきます。題材はせっかくなのでIBM Cloud Container Registryを取り上げます。

スポンサーリンク

Dockerイメージの名前の付け方

IBM Cloud Container Registryの概説にはDockerイメージのプッシュの方法として下のコマンドが記述されています。

$ docker push <region>.icr.io/<my_namespace>/<image_repo>:<tag>

なぜ <region>.icr.io/<my_namespace>/<image_repo>のような長いイメージ名をつけるかというと、本来Dockerのイメージ名は以下の形式だからです。

レジストリホスト名/ユーザー名/リポジトリ名:タグ

ここでレジストリやリポジトリという言葉について、意外と理解が曖昧な人(私)も多いと思うので両者の違いについて説明します。

レジストリはサービス名、リポジトリは保管場所名

レジストリとはDocker HubやIBM Cloud Container Registry、Amazon ECRといったDockerイメージを保存する台帳(サービス)を表しています。

一方でレポジトリとはレジストリの中でのイメージ保管庫の名前を表しています。リポジトリは同じイメージ名でタグが異なるイメージの集合となっています。

下の画像はDocker Hub(レジストリ)のCentOSリポジトリのページです。このリポジトリにはcentosという名前に対して異なるタグ名のついたイメージが格納されています。

ちなみにnamespace(名前空間)というのはイメージを例えばプロジェクト毎に区分けするための名前です。

クラウドサービスを使うとDockerイメージ名が長い理由

Dockerを使い始めたばかりの人やDocker Hubを利用していた人は下の形式でイメージをプッシュしていたと思います。

$ docker push <Docker Hubのユーザ名>/<image_repo>:<tag>

先程の形式と比べるとレジストリホスト名(ホスト名はコンピュータの名前)が省略されていますね。

実はレジストリホスト名はDockerのパブリックレジストリであるDocker Hubのホスト名registry-1.docker.ioがデフォルトで入っているため省略することが可能です。

一方IBM Cloud Container Registryのようなプライベートコンテナレジストリサービスでは、イメージ名にレジストリホスト名(IBM Cloudの場合<region>.icr.io)が必要となります。

私達Docker初心者はまずDocker Hubを使ってイメージやコンテナの操作を行うでしょうからレジストリについて気にしないのも当然です。

コメント