目次

Docker イメージ入門:pull、images、tag、rmi とレイヤー構造

映像(イメージ)は、コンテナを作成するためのテンプレートです。前の節の docker run nginx:1.30 の背後では、Docker がまず nginx:1.30 というイメージをダウンロードしました。この節では、イメージの命名方法、ダウンロード方法、確認と削除の方法、そして「層を重ねた」構造について説明します。

イメージ名の構成

完全なイメージ名は次のようになります。

docker.io/library/nginx:1.30-alpine
└───┬───┘ └──┬──┘ └─┬─┘ └────┬────┘
 registry  名前空間  名前     tag
部分説明省略した場合のデフォルト値
registryイメージを保存するサーバーdocker.io(Docker Hub)
名前空間ユーザーまたは組織の名前公式イメージでは library
名前(repository)イメージ名省略できません
tagバージョンラベルlatest

そのため、次の3つの書き方は同じイメージを指します。

docker pull nginx
docker pull nginx:latest
docker pull docker.io/library/nginx:latest

ほかの registry のイメージでは、完全なアドレスを指定します。たとえば GitHub の ghcr.io/owner/app:1.0、Google の gcr.io/distroless/static-debian13 です。

よく使われる tag の命名

公式イメージでは、通常、複数のバリエーションが提供されています。

tag の例意味
python:3.14Debian をベースにした完全版で、コンパイルツールなど多くのパッケージを含みます
python:3.14-slimPython の実行に必要なものだけを残した軽量版 Debian です
python:3.14-alpineAlpine Linux をベースにした、最小サイズのイメージです
node:24-trixieDebian のバージョンコードを指定します(trixie = Debian 13)
nginx:1.30 / nginx:1.31nginx の stable(偶数)版と mainline(奇数)版です

この節の後半では、これら3種類の Python イメージを実際にダウンロードして、サイズを比較します。

イメージをダウンロードする:docker pull

ローカルにイメージがない状態で docker run を実行すると、自動的にダウンロードされます。docker pull はダウンロードだけを行い、実行はしません。すでにあるイメージに対してもう一度 pull を実行すると、Docker は更新があるか確認します。

$ docker pull nginx:1.30
1.30: Pulling from library/nginx
Digest: sha256:9bf97bd7714f5e24c1ccd545ecb9eb5435cb6d109c97cebb15e7e455e0239edb
Status: Image is up to date for nginx:1.30
docker.io/library/nginx:1.30

Image is up to date は、ローカルにあるイメージがすでに最新で、再ダウンロードされなかったことを示します。最後の行はイメージの完全な名前です。デフォルトの registry docker.io と名前空間 library を確認できます。

「共有される層」を実際に確認する

続いて、nginx の別バージョン 1.31 をダウンロードします。

$ docker pull nginx:1.31
1.31: Pulling from library/nginx
ecc510c1e359: Already exists
807ab930f3a0: Pull complete
04bdbc7ea6b5: Pull complete
f7e1db57b58b: Pull complete
8020170dc65f: Pull complete
1efc53192927: Pull complete
947d22046304: Pull complete
Digest: sha256:f9ea18bfa4fad859e1ed38259d711da7ccad2c3516e875cec3351a57c859f571
Status: Downloaded newer image for nginx:1.31
docker.io/library/nginx:1.31

最初の層 ecc510c1e359 に Already exists と表示されています。nginx 1.30 と 1.31 はどちらも同じ Debian 13 のベース層から始まるため、この層はすでにディスク上にあり、再ダウンロードされません。これが第1節で説明した「イメージが基底層を共有する」という仕組みです。

python:3.14-slim をダウンロードする場合も同じです。こちらも Debian 13 をベースにしています。

$ docker pull python:3.14-slim
3.14-slim: Pulling from library/python
ecc510c1e359: Already exists
a5883d972f3b: Pull complete
6aaf5b0aae75: Pull complete
bb8166eb34e6: Pull complete
Digest: sha256:a2b82f3c48559aa0a8446d9af49826b6e2b2016f4cd2afabfe6013ec53729170
Status: Downloaded newer image for python:3.14-slim
docker.io/library/python:3.14-slim

ローカルのイメージを確認する:docker images

$ docker images
IMAGE                ID             DISK USAGE   CONTENT SIZE   EXTRA
hello-world:latest   5e2309035332       25.9kB         9.49kB   U
nginx:1.30           9bf97bd7714f        242MB         66.5MB
nginx:1.31           f9ea18bfa4fa        243MB         66.7MB
ubuntu:26.04         f144425ff09b        162MB         45.6MB

Docker 29 の docker images の出力形式は旧バージョンと異なります。旧バージョンの列は REPOSITORY TAG IMAGE ID CREATED SIZE です。インターネット上には旧形式のままのチュートリアルが多くあります。表示が違っていても心配はいりません。内容は同じです。

列意味
IMAGE名前と tag
IDイメージ ID の先頭12文字
DISK USAGE展開後にディスク上で使用する容量
CONTENT SIZE圧縮後の内容サイズで、ダウンロード量とほぼ同じです
EXTRAU はコンテナが使用中(In use)であることを示します。ここでは前の節で残した hello-world コンテナを指します

docker image ls と docker images は同じコマンドです。よく使う絞り込み方法を紹介します。

$ docker images -q
b9767f56a1cc
a2b82f3c4855
9bf97bd7714f
f9ea18bfa4fa
f6a589d43c42
f144425ff09b
5e2309035332

-q は ID だけを出力するため、ほかのコマンドと組み合わせた一括処理によく使われます。docker images nginx は nginx だけを表示し、docker images --filter dangling=true は名前のない「ダングリング」イメージ(通常は再ビルド後に置き換えられた古いバージョン)を表示します。

slim、alpine、フル版を比較する

Python の別の 2 つのバージョンもダウンロードします。

$ docker pull python:3.14-alpine
3.14-alpine: Pulling from library/python
e2de96513ba9: Pull complete
48f6a2588427: Pull complete
2a22c5887fa2: Pull complete
d486488257d0: Pull complete
Digest: sha256:f6a589d43c42b9e7f7dc67a12d37132491f362859a5d750607710cc56da3bc72
Status: Downloaded newer image for python:3.14-alpine
docker.io/library/python:3.14-alpine

$ docker pull python:3.14
3.14: Pulling from library/python
4846f2900730: Pull complete
62fe2e747f69: Pull complete
4dc3950125eb: Pull complete
b2eb680928d4: Pull complete
083b5813628d: Pull complete
9b0ef59a9f4a: Pull complete
6e255bfcc16c: Pull complete
Digest: sha256:b9767f56a1cc620aa72d38cc3557d26412e38a4597c92953476136b78894ccbd
Status: Downloaded newer image for python:3.14
docker.io/library/python:3.14
$ docker images python
IMAGE                ID             DISK USAGE   CONTENT SIZE   EXTRA
python:3.14          b9767f56a1cc       1.63GB          433MB
python:3.14-alpine   f6a589d43c42       82.6MB           21MB
python:3.14-slim     a2b82f3c4855        180MB         45.7MB

同じ Python 3.14 でも、サイズには大きな差があります。

バージョンダウンロードサイズ(CONTENT SIZE)ディスク使用量(DISK USAGE)
python:3.14433 MB1.63 GB
python:3.14-slim45.7 MB180 MB
python:3.14-alpine21 MB82.6 MB
  • フル版には gcc などのコンパイルツールが含まれており、イメージ内でパッケージをコンパイルする必要がある場合に適しています(またはマルチステージビルドのビルドステージとして使えます)。
  • slim は、ほとんどのアプリケーションに適しています。
  • alpine は最小サイズですが、glibc ではなく musl を使用するため、コンパイルが必要なパッケージ(Python パッケージの一部など)は Alpine へのインストールが難しい場合があります。迷ったら、通常は slim を選ぶのが無難です。

イメージにタグを付ける:docker tag

docker tag はイメージをコピーせず、同じ内容を指す名前をもう 1 つ追加するだけです。

$ docker tag nginx:1.30 myname/nginx:v1

$ docker images --filter reference=nginx:1.30 --filter reference=myname/nginx
IMAGE             ID             DISK USAGE   CONTENT SIZE   EXTRA
myname/nginx:v1   9bf97bd7714f        242MB         66.5MB
nginx:1.30        9bf97bd7714f        242MB         66.5MB

2 行の ID は同じなので、同じイメージを指しています。Docker Hub にプッシュする前に、この方法でイメージに あなたのアカウント名/名前:tag という名前を付けます。Docker Hub にプッシュするを参照してください。

tag は固定バージョンではありません

tag は単なる「ラベル」であり、メンテナーはいつでもそれを新しい内容に付け替えられます。nginx:1.30 は来月には 1.30.6 を指しているかもしれません。完全に固定したい場合は、digest(内容の SHA256 ハッシュ)を使います。

$ docker images --digests nginx
REPOSITORY   TAG       DIGEST                                                                    IMAGE ID       CREATED      SIZE
nginx        1.30      sha256:9bf97bd7714f5e24c1ccd545ecb9eb5435cb6d109c97cebb15e7e455e0239edb   9bf97bd7714f   6 days ago   242MB
nginx        1.31      sha256:f9ea18bfa4fad859e1ed38259d711da7ccad2c3516e875cec3351a57c859f571   f9ea18bfa4fa   6 days ago   243MB
docker pull nginx@sha256:9bf97bd7714f5e24c1ccd545ecb9eb5435cb6d109c97cebb15e7e455e0239edb

digest を使ってダウンロードすれば、常にまったく同じ内容を取得できます。

イメージを削除する:docker rmi

コンテナ(停止中のものも含む)がこのイメージを使用している場合、削除できません。

$ docker run -d --name web nginx:1.30
e34409bcf1727f02fc3b0558d202dd057f2116b4a2e9186f83bbed4625842272

$ docker rmi nginx:1.30
Error response from daemon: conflict: unable to delete nginx:1.30 (must be forced) - container e34409bcf172 is using its referenced image 9bf97bd7714f

先に使用中のコンテナを削除してから、イメージを削除します。

$ docker rm -f web
web

$ docker rmi nginx:1.30
Untagged: nginx:1.30
Deleted: sha256:9bf97bd7714f5e24c1ccd545ecb9eb5435cb6d109c97cebb15e7e455e0239edb
  • Untagged:名前を削除します。
  • Deleted:ほかの名前から参照されていない場合に限り、イメージ自体が削除されます。myname/nginx:v1 のような別名が同じイメージを指している場合は、Untagged だけが表示されます。

不要なイメージを削除します。

docker image prune      # dangling イメージ(名前のない <none>)だけを削除
docker image prune -a   # コンテナに使用されていないイメージをすべて削除

イメージのレイヤー構造:docker history

docker history は、イメージの各レイヤーと、そのレイヤーを作成した Dockerfile の命令を一覧表示します。

$ docker history nginx:1.30
IMAGE          CREATED      CREATED BY                                      SIZE      COMMENT
9bf97bd7714f   6 days ago   CMD ["nginx" "-g" "daemon off;"]                0B        buildkit.dockerfile.v0
<missing>      6 days ago   STOPSIGNAL SIGQUIT                              0B        buildkit.dockerfile.v0
<missing>      6 days ago   EXPOSE map[80/tcp:{}]                           0B        buildkit.dockerfile.v0
<missing>      6 days ago   ENTRYPOINT ["/docker-entrypoint.sh"]            0B        buildkit.dockerfile.v0
<missing>      6 days ago   COPY 30-tune-worker-processes.sh /docker-ent…   16.4kB    buildkit.dockerfile.v0
<missing>      6 days ago   COPY 20-envsubst-on-templates.sh /docker-ent…   12.3kB    buildkit.dockerfile.v0
<missing>      6 days ago   COPY 15-local-resolvers.envsh /docker-entryp…   12.3kB    buildkit.dockerfile.v0
<missing>      6 days ago   COPY 10-listen-on-ipv6-by-default.sh /docker…   12.3kB    buildkit.dockerfile.v0
<missing>      6 days ago   COPY docker-entrypoint.sh / # buildkit          8.19kB    buildkit.dockerfile.v0
<missing>      6 days ago   RUN /bin/sh -c set -x     && groupadd --syst…   88.2MB    buildkit.dockerfile.v0
<missing>      6 days ago   ENV DYNPKG_RELEASE=1~trixie                     0B        buildkit.dockerfile.v0
<missing>      6 days ago   ENV PKG_RELEASE=1~trixie                        0B        buildkit.dockerfile.v0
<missing>      6 days ago   ENV ACME_VERSION=0.4.1                          0B        buildkit.dockerfile.v0
<missing>      6 days ago   ENV NJS_RELEASE=1~trixie                        0B        buildkit.dockerfile.v0
<missing>      6 days ago   ENV NJS_VERSION=1.0.1                           0B        buildkit.dockerfile.v0
<missing>      6 days ago   ENV NGINX_VERSION=1.30.5                        0B        buildkit.dockerfile.v0
<missing>      6 days ago   LABEL maintainer=NGINX Docker Maintainers <d…   0B        buildkit.dockerfile.v0
<missing>      7 days ago   # debian.sh --arch 'amd64' out/ 'trixie' '@1…   87.7MB    debuerreotype 0.17

下から上へ読みます。

  1. 一番下は Debian 13(trixie)のベースレイヤーで、87.7 MB です。
  2. 中ほどの RUN ... groupadd ... は nginx 自体をインストールしており、88.2 MB で最大のレイヤーです。
  3. COPY は起動スクリプトを追加します。サイズは数 KB だけです。
  4. ENV、EXPOSE、CMD などは設定だけなので、サイズは 0B です。

<missing> はエラーではありません。中間レイヤーが別のマシンでビルドされ、このローカル環境には個別の ID がないことを示しています。

レイヤーには次の 2 つの利点があります。

  • 共有:複数のイメージが Debian 13 をベースにしている場合、そのレイヤーは 1 つだけ保存され、ダウンロードも 1 回だけです(先ほどの Already exists)。
  • キャッシュ:イメージのビルド時に、変更されていないレイヤーはそのまま再利用できます。これがビルドキャッシュの基本です。

コンテナの起動時、Docker はこれらの読み取り専用レイヤーの上に書き込み可能レイヤーを追加します。コンテナ内で新規作成または変更されたファイルはすべてこのレイヤーに書き込まれ、コンテナを削除するとこのレイヤーも消えます。そのため、保存が必要なデータはVolumeに置きます。

Docker Desktop でイメージを選択すると、同じレイヤー情報を確認できます。

Docker Desktop に表示されたイメージのレイヤー
Docker Desktop のイメージ詳細画面:Layers に各レイヤーの命令とサイズが表示されます。画像出典:Docker 公式ドキュメント(Apache-2.0)

イメージの設定を確認する:docker inspect

docker inspect はイメージの完全な設定を大量の JSON として出力します。--format を使うと、必要なフィールドだけを取り出せます。

$ docker inspect --format '{{.Config.Cmd}}' nginx:1.30
[nginx -g daemon off;]

$ docker inspect --format '{{.Os}}/{{.Architecture}}' nginx:1.30
linux/amd64

$ docker inspect --format '{{json .Config.ExposedPorts}}' nginx:1.30
{"80/tcp":{}}

$ docker inspect --format '{{range .Config.Env}}{{println .}}{{end}}' nginx:1.30
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_VERSION=1.30.5
NJS_VERSION=1.0.1
NJS_RELEASE=1~trixie
ACME_VERSION=0.4.1
PKG_RELEASE=1~trixie
DYNPKG_RELEASE=1~trixie

ここから、コンテナの起動時にデフォルトで nginx -g daemon off; を実行すること、linux/amd64 版であること、80 番ポートを公開すること、イメージに組み込まれた環境変数を確認できます。

エクスポートとインポート:docker save / load

ネットワークに接続できないマシン間でイメージを移動するときは、イメージを tar ファイルに保存できます。

$ docker save -o nginx-1.30.tar nginx:1.30

$ ls -lh nginx-1.30.tar
-rw-------    1 root     root       63.4M Oct 12 14:41 nginx-1.30.tar

$ docker rmi nginx:1.30
Untagged: nginx:1.30
Deleted: sha256:9bf97bd7714f5e24c1ccd545ecb9eb5435cb6d109c97cebb15e7e455e0239edb

$ docker load -i nginx-1.30.tar
Loaded image: nginx:1.30

tar ファイルを別のマシンにコピーして docker load を実行すれば、Docker Hub に接続せずにイメージを使用できます。

Docker Desktop でイメージを管理する

Docker Desktop の左側のメニューで Images を選択すると、ローカルにあるすべてのイメージが表示されます。これは docker images と同じです。右側のボタンから、イメージを実行または削除できます。

Docker Desktop の Images 画面
Images 画面には、ローカルのイメージ、tag、サイズ、作成日時が表示されます。画像出典:Docker 公式ドキュメント(Apache-2.0)

コマンドのまとめ

コマンド用途
docker pull 名稱:tagイメージをダウンロードする
docker imagesローカルのイメージを一覧表示する
docker images -qID だけを一覧表示する
docker tag 來源 新名稱新しい名前 / タグを付ける
docker rmi 名稱イメージを削除する
docker image prune -a未使用のイメージをすべて削除する
docker history 名稱レイヤーを確認する
docker inspect 名稱設定を確認する
docker save -o a.tar 名稱tar ファイルにエクスポートする
docker load -i a.tartar ファイルからインポートする

次の節では、コンテナが作成されてから削除されるまでにどのような状態を経るかを紹介します。

まとめ

  • イメージ名は [registry/]リポジトリ:tag です。公式イメージにはプレフィックスがありません。
  • 複数のイメージで同じベースレイヤーを共有できるため、ダウンロードも保存も 1 回だけで済みます。
  • 多くのアプリケーションには slim が適しています。alpine は最小ですが、互換性は低めです。
  • docker history は、各レイヤーを作成した命令を表示します。

練習問題

練習 1:alpine:3.23 と python:3.14-alpine をダウンロードし、2 回目のダウンロード時に Already exists が表示されるか確認してください。

ヒント

両方が同じ Alpine ベースレイヤーを使用している場合、2 回目のダウンロードではそのレイヤーに Already exists と表示され、再ダウンロードは不要です。docker history を使うと、両方の最下層を比較できます。

練習 2:nginx:1.30 に新しい名前 mysite/web:test を付けてから、その新しい名前を削除してください。元の nginx:1.30 は残っていますか?

解答
docker tag nginx:1.30 mysite/web:test
docker rmi mysite/web:test

残っています。docker rmi で名前を削除すると Untagged と表示されるだけです。イメージにほかの名前が付いている限り、実際の内容は削除されません。

よくある質問

latest は最新バージョンですか?

必ずしもそうではありません。latest は通常の tag 名で、どのバージョンを指すかは作成者が決めます。本番環境では nginx:1.30 のようにバージョンを明記してください。

Docker 29 の docker images の列が、ネット上の情報と違うのはなぜですか?

Docker 29 では IMAGE ID DISK USAGE CONTENT SIZE EXTRA に変更されました。旧バージョンでは REPOSITORY TAG IMAGE ID CREATED SIZE でした。詳しくはこの章の説明を参照してください。

slim と alpine のどちらを選べばよいですか?

ほとんどのアプリケーションでは slim を選びます。alpine は最小サイズですが、musl libc を使用するため、コンパイルが必要な一部のパッケージ(特に Python)はインストールに失敗したり、時間がかかったりすることがあります。

更新日 2026年10月14日