イメージをレジストリへ送受信する - docker push / pull
ローカルのイメージをレジストリに送る `docker push` と、レジストリから取得する `docker pull`。認証とタグ運用が要点。
概念図
構文
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 の最小例
# 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.3ECR は短命トークンを CLI で取得してログイン
# 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 して中身を固定する
# ダイジェスト指定で pull(改ざん検知)
docker pull ghcr.io/acme/myapp@sha256:4f2d...9ab1push/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 しておくと、問題が起きたときに特定のコミットへロールバックしやすい。
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 のようなタグを可変で使うのは問題ないが、本番と混ぜないのが鉄則。
