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 を付け、トークンを使ってログインしてから行う
  • エラーはメッセージの文言から、ログイン、名前空間、タグ、アーキテクチャの順に確認する

お気軽にご相談ください

お見積りへ お問い合わせへ
▲