Dock Stay
イメージをレジストリへ送受信する - docker push / pull の使い方・オプション・サンプル

イメージをレジストリへ送受信する - docker push / pull

ローカルのイメージをレジストリに送る `docker push` と、レジストリから取得する `docker pull`。認証とタグ運用が要点。

概念図

docker push / pull diagram

構文

bash
docker login [<registry>]
docker tag <source-image> <registry>/<namespace>/<name>:<tag>
docker push <registry>/<namespace>/<name>:<tag>
docker pull <registry>/<namespace>/<name>:<tag>

実例

GitHub Container Registry への push の最小例

bash
# GHCR にログインして push
echo "$GITHUB_TOKEN" | docker login ghcr.io -u <user> --password-stdin
docker tag myapp:dev ghcr.io/acme/myapp:1.2.3
docker push ghcr.io/acme/myapp:1.2.3

ECR は短命トークンを CLI で取得してログイン

bash
# AWS ECR はヘルパーでログイン
aws ecr get-login-password --region ap-northeast-1 \
  | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:2026-04-18

タグではなくダイジェストで pull して中身を固定する

bash
# ダイジェスト指定で pull(改ざん検知)
docker pull ghcr.io/acme/myapp@sha256:4f2d...9ab1

push/pull の流れ

docker push はイメージをレイヤー単位でレジストリへアップロードし、既に存在するレイヤーはスキップする。

初回は時間がかかるが、以降はベースイメージや共通レイヤーが再利用されるため増分のみが転送される。

docker pull は逆方向で、マニフェストを取得後にローカルに無いレイヤーだけダウンロードする。

認証はレジストリごとに docker login で行い、資格情報は既定で ~/.docker/config.json に保存される。

安全性を高めるには credential helper(macOS の Keychain、Windows の Credential Manager、docker-credential-pass など)の併用が望ましい。

タグ付けの命名規則(`registry/namespace/name:tag`)

イメージの完全名は registry/namespace/name:tag 形式。

registry を省略すると Docker Hub(docker.io)とみなされ、namespace を省略すると library が補われる(公式イメージ)。

docker tag <src> <dst> で別名を付けられる。

運用ではアプリ名に加えて、意味のある複数タグを同じイメージに付けることが多い。

例: myapp:1.2.3(SemVer)、myapp:1.2(マイナーの最新)、myapp:sha-4f2d9ab(コミット SHA)、myapp:2026-04-18(日付)。

CI では SHA とバージョン両方を push しておくと、問題が起きたときに特定のコミットへロールバックしやすい。

bash
docker tag myapp:dev registry.example.com/team/myapp:1.2.3
docker tag myapp:dev registry.example.com/team/myapp:1.2
docker tag myapp:dev registry.example.com/team/myapp:sha-$(git rev-parse --short HEAD)
docker push registry.example.com/team/myapp --all-tags

`:latest` の罠

:latest は「最後に push された latest というタグ」にすぎず、常に最新という保証はない。

運用で :latest に依存すると、再デプロイのたびに別のバイナリが起動しうる、ロールバック先が曖昧になる、キャッシュ済みのノードと未キャッシュのノードで別イメージが動く、といった事故につながる。

本番は SemVer やコミット SHA、不変タグ(immutable tag)で固定する。

さらに強固にするなら image@sha256:... のダイジェスト参照を使い、中身まで固定する。

開発用の :dev のようなタグを可変で使うのは問題ないが、本番と混ぜないのが鉄則。

関連トピック