2026年7月4日
2026年7月4日
Dockerイメージのbuild・pull・pushの方法|イメージ名とタグの付け方から公開まで
Docker イメージは、レジストリから取得する(pull)、Dockerfile から作る(build)、レジストリに送る(push)の3つの操作で扱います。この3つは「イメージ名とタグ」という共通のルールでつながっているため、名前の付け方を理解すると、どのコマンドもすっきり使えるようになります。この記事では、イメージ名の構造から、WordPress 用のカスタムイメージを例にした build・pull・push の流れ、よくあるエラーの読み方までを通して説明します。
イメージ名の構造を理解する
3つのコマンドで指定するイメージ名は、次のような構造になっています。
[レジストリのホスト名/][名前空間/]リポジトリ名[:タグ]
例:
wordpress:php8.3-apache → Docker Hub の公式イメージ
yourname/wp-custom:1.0.0 → Docker Hub の yourname アカウントのイメージ
ghcr.io/yourorg/wp-custom:1.0.0 → GitHub Container Registry のイメージ
レジストリのホスト名を省略すると Docker Hub(docker.io)が使われます。公式イメージは名前空間を省略でき、内部的には library という名前空間として扱われます。タグを省略すると latest が使われますが、latest は「最新版」という意味ではなく、単に既定で付く名前にすぎません。いつ、どの内容を指しているかが変わりうるので、本番で使うイメージには、バージョン番号などの具体的なタグを付けるのが基本です。
pull:レジストリからイメージを取得する
まずは公開されているイメージを取得してみます。
docker pull wordpress:php8.3-apache
docker image ls wordpress
使えるタグの種類は、Docker Hub の各イメージのページで確認してください。上のタグは説明用の例で、提供されるタグの組み合わせは PHP や WordPress のバージョンに合わせて変わります(2026年10月現在)。
実行するマシンの CPU アーキテクチャに注意する
多くの公式イメージは、amd64 や arm64 など複数のアーキテクチャ向けに用意されており、pull すると実行中のマシンに合ったものが自動で選ばれます。別のアーキテクチャ用を明示的に取得したい場合は --platform を使います。
docker pull --platform linux/amd64 wordpress:php8.3-apache
タグではなくダイジェストで固定する
タグは後から別の内容に付け替えられることがあります。まったく同じイメージを使い続けたい場合は、内容から計算されたダイジェスト(sha256 で始まる値)で指定します。
docker image ls --digests wordpress
docker pull wordpress@sha256:ダイジェストの値
Docker Hub の取得回数制限
Docker Hub には、未ログインや無料アカウントからの pull に回数制限があります。具体的な回数や条件は変更されることがあるので、Docker の公式ドキュメントで確認してください。CI や複数サーバーで頻繁に pull する場合は、docker login してから取得する、自前のレジストリやミラーを用意する、といった対策が考えられます。
build:Dockerfile からイメージを作る
公式の WordPress イメージをもとに、PHP のアップロード上限を変えたカスタムイメージを作る例です。作業用のディレクトリに次の2つのファイルを用意します。
; uploads.ini
upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
# Dockerfile
FROM wordpress:php8.3-apache
# PHP の設定ファイルを追加する
COPY uploads.ini /usr/local/etc/php/conf.d/uploads.ini
ビルドの前に、イメージに含めたくないファイルを .dockerignore に書いておきます。ビルド時にはディレクトリの中身がまとめて Docker に送られる(ビルドコンテキスト)ため、これを書かないと、不要な大容量ファイルや秘密情報が含まれる原因になります。
# .dockerignore
.git
.env
*.sql
node_modules
準備ができたらビルドします。-t でイメージ名とタグを、最後の . でビルドコンテキストのディレクトリを指定します。
docker build -t yourname/wp-custom:1.0.0 .
docker image ls yourname/wp-custom
最近の Docker Engine では、docker build は BuildKit という仕組みで実行されます。出力の形式が古い解説記事と違って見えることがありますが、基本的な使い方は同じです。
ビルドを速く、安全にするコツ
- ベースイメージを更新したいときは
docker build --pullを付ける。付けないと手元の古いベースイメージがそのまま使われることがある - Dockerfile は、変更の少ない手順を上に、よく変わるファイルのコピーを下に書く。上の層のキャッシュが再利用され、ビルドが速くなる
- キャッシュを使わずに作り直したいときは --no-cache を付ける
- API キーやパスワードを ENV や COPY でイメージに入れない。ビルド中に秘密情報が必要な場合は、BuildKit のシークレットマウント(
RUN --mount=type=secret)を使う。イメージに入った値は、docker history や層の中身から読み取れてしまう
できあがったイメージは、push する前に手元で起動して動作を確かめてください。
docker run --rm yourname/wp-custom:1.0.0 php -i | grep upload_max_filesize
push:レジストリにイメージを送る
レジストリにログインする
push するには、送り先のレジストリにログインしておく必要があります。Docker Hub では、アカウントのパスワードではなく、アクセストークンを作成して使う方法が推奨されています。
# Docker Hub(対話形式でユーザー名とトークンを入力)
docker login
# GitHub Container Registry(トークンを標準入力から渡す)
echo "$GHCR_TOKEN" | docker login ghcr.io -u yourname --password-stdin
パスワードやトークンをコマンドラインの引数に直接書くと、シェルの履歴やプロセス一覧に残ります。--password-stdin で渡すか、OS の認証情報ストアと連携する credential helper を使ってください。Amazon ECR のように、専用のコマンドで一時的なパスワードを発行してからログインするレジストリもあるので、各サービスのドキュメントに従ってください。
タグを付けて送る
push 先は、イメージ名に含まれるレジストリと名前空間で決まります。別の名前で作ったイメージを送るときは、docker tag で送り先の名前を付けます。docker tag はイメージをコピーするのではなく、同じイメージに別名を付けるだけなので、容量はほとんど増えません。
# バージョン番号と、どのコミットから作ったかが分かるタグを付ける例
docker tag yourname/wp-custom:1.0.0 yourname/wp-custom:1.0
docker tag yourname/wp-custom:1.0.0 yourname/wp-custom:git-abc1234
docker push yourname/wp-custom:1.0.0
docker push yourname/wp-custom:1.0
docker push yourname/wp-custom:git-abc1234
# 同じリポジトリのタグをまとめて送る場合
docker push --all-tags yourname/wp-custom
push すると、レジストリにすでにある層は送られず、変更された層だけが転送されます。公開範囲(パブリックかプライベートか)はレジストリ側のリポジトリ設定で決まるので、社内用のイメージを誤って公開リポジトリに送らないよう、事前に確認してください。
別の環境で取得して確かめる
push したら、別のマシンやサーバーで pull して起動できるかを確かめると、名前の付け間違いやアーキテクチャの違いに早く気づけます。
よくあるエラーと原因
denied: requested access to the resource is denied
push 時によく出るエラーです。原因として多い順に、ログインしていない、イメージ名の名前空間が自分のアカウント名や組織名と違う、そのリポジトリへの書き込み権限がない、の3つを確認してください。docker image ls で、送ろうとしているイメージ名が送り先と一致しているかを見ると切り分けやすくなります。
An image does not exist locally with the tag
指定した名前とタグのイメージが手元にない状態です。docker tag で送り先の名前を付け忘れていることがほとんどです。
manifest unknown / not found
pull しようとしたタグがレジストリに存在しません。タグの綴り、プライベートリポジトリならログイン状態を確認します。
no matching manifest for linux/arm64/v8
使っているマシンのアーキテクチャ向けのイメージが提供されていません。Apple シリコンの Mac などで起きやすく、--platform linux/amd64 を指定してエミュレーションで動かすか、対応したイメージを探します。
exec format error
逆に、arm64 の Mac でビルドしたイメージを amd64 のサーバーで動かしたときなどに起きます。ビルド時に --platform で実行先のアーキテクチャを指定するか、buildx で複数アーキテクチャ向けのイメージを作って push してください。
toomanyrequests
Docker Hub の取得回数制限に達しています。ログインしてから pull する、取得の頻度を減らす、ミラーを使うといった対策を検討します。
まとめ
- イメージ名は「レジストリ/名前空間/リポジトリ:タグ」の構造で、pull・build・push の共通ルールになる
- latest は最新版という意味ではない。本番ではバージョン番号のタグやダイジェストで固定する
- build では .dockerignore を用意し、秘密情報をイメージに入れない。ベースイメージの更新には --pull を使う
- push は送り先の名前で docker tag を付け、トークンを使ってログインしてから行う
- エラーはメッセージの文言から、ログイン、名前空間、タグ、アーキテクチャの順に確認する