🐧 Linux 総合学習プラットフォーム
コンテナ Docker/Podman ・ 中級

イメージの配布——レジストリとタグ

自分でビルドしたイメージを他のマシンやチームに届けるには、レジストリと呼ばれる保管庫にアップロードします。ここではDocker HubやGitHub Container Registryといったレジストリの役割、image名の構造、タグの付け方とpush・pullの流れを学びます。特に「latest」という便利だが罠にもなるタグの正体を理解し、実務で事故らないバージョン運用の考え方まで押さえます。

自分のマシンでビルドしたイメージは、そのままでは自分のマシンの中にしか存在しない。別のマシンやサーバー、あるいはチームの他のメンバーに使ってもらうには、どこかに届ける必要がある。

この「届け先」の役割を果たすのがレジストリだ。イメージを保管し、必要なときに取り出せるようにする倉庫のような場所になる。

🔗
たとえレジストリは、写真を保存しておくクラウドアルバムのようなものだ。自分のスマホだけに写真があっても他の人とは共有できないが、アルバムにアップロードしておけば、URLを知っている人がいつでもダウンロードできる。

🏬 レジストリという保管庫

代表的なレジストリには、Dockerの公式であるDocker Hub、GitHubが提供するGitHub Container Registry(略してghcr.io)などがある。企業では自社専用のプライベートレジストリを用意することもある。

これまでのトピックでdocker pullしてきたpostgresやnginxといったイメージも、実はDocker Hubというレジストリから取得していたものだ。レジストリは初心者のうちから知らずに使っている、身近な仕組みだ。

自分のPCビルド済みイメージpushレジストリDocker Hubghcr.iopull別のサーバー同じイメージを取得

🧾 image名の構造

レジストリを扱うために、まずimage名の構造を分解しておこう。フルの形式はregistry/名前空間/名前:タグ となる。registryを省略するとDocker Hubが暗黙に補われる。

たとえばpostgres:16は、実際にはdocker.io/library/postgres:16の短縮形だ。自分のDocker Hubアカウントに置く場合はmyuser/myapp:1.0のように名前空間として自分のユーザー名が入り、GitHub Container Registryならghcr.io/myuser/myapp:1.0のようにレジストリのドメインが先頭に付く。

レジストリghcr.io/名前空間myuser/名前myappタグ:1.0
💡
ポイントimage名は「どこの倉庫の・誰の棚の・何という荷物の・どのバージョン」を1本の文字列で表している。読み方を知っておくと、見慣れないimage名に出会っても迷わない。

🏷️ tag・push・pullの流れ

自分でビルドしたイメージにレジストリへ送るための名前を付けるには、docker tagを使う。ローカルでmyapp:latestとしてビルドしたイメージに、レジストリ用の正式な名前を付け直すイメージだ。

名前を付けたら、docker pushでレジストリへ送信する。受け取る側は、docker pullで同じ名前を指定すれば、同じイメージを取得できる。

一連の流れの例。$ docker build -t myapp:1.0 . でビルドし、$ docker tag myapp:1.0 ghcr.io/myuser/myapp:1.0 でレジストリ用の名前を付け、$ docker push ghcr.io/myuser/myapp:1.0 でアップロードする。別のマシンでは $ docker pull ghcr.io/myuser/myapp:1.0 で取得できる。
コツpushする前に、レジストリへのログイン(docker login)が必要になることが多い。プライベートなイメージを扱う場合は認証を求められると覚えておく。

⚠️ latestの罠

タグを省略すると、既定でlatestというタグが使われる。名前だけ見ると「常に最新版」に思えるが、実際にはただの1つのタグ名にすぎない。

問題は、latestという同じタグ名のまま中身だけを何度でも上書きpushできてしまうことだ。1週間前にpullしたlatestと、今日pullしたlatestが、実は全く違う中身になっている、ということが起こりうる。

つまずきlatestは「自動的に最新版を指す魔法のタグ」ではない。単に慣習的にそう運用されがちな、ただの1つのタグにすぎない。本番環境でlatestに頼ると、いつの間にか想定外のバージョンに切り替わっているリスクがある。

🔒 ダイジェスト固定とバージョンタグ運用

この罠を避けるため、実務ではタグ名だけでなく、より厳密な識別子を使うことがある。それがダイジェスト(sha256から始まる長いハッシュ値)だ。ダイジェストはイメージの中身そのものから計算されるため、中身が1バイトでも変われば別の値になる。

本番運用では、latestのような曖昧なタグではなく、myapp:1.4.2のような具体的なバージョン番号のタグを使い、必要に応じてダイジェストで固定する運用が安全とされる。バージョンタグなら「1.4.2で動作確認した」という事実がそのまま追跡できる。

ダイジェスト指定でpullする例。$ docker pull myapp@sha256:9f2c... のように書くと、タグの上書きに影響されず、常に同じ中身のイメージだけを取得できる。
💡
ポイント実務ではlatestに頼らず、意味のあるバージョン番号でタグ付けする。「今動いているのはどのバージョンか」を後から確実に言えることが、トラブル対応の速さに直結する。

イメージを安全に配布・取得できるようになったら、あとはそのコンテナをどう安定して動かし続けるかだ。次は再起動や資源制限といった運用の基本を見ていく。

この項目に出てくる用語

イメージダイジェストいめーじだいじぇすと
イメージの中身から計算されるsha256形式のハッシュ値。中身が変われば必ず値も変わる。
latestタグれいてすとたぐ
タグを省略したときに既定で使われるタグ名。「常に最新版」を意味する予約語ではない。

関連コマンド

docker tag

▶ 学習アプリでこの続きを学ぶ・演習する