目次
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.14 | Debian をベースにした完全版で、コンパイルツールなど多くのパッケージを含みます |
python:3.14-slim | Python の実行に必要なものだけを残した軽量版 Debian です |
python:3.14-alpine | Alpine Linux をベースにした、最小サイズのイメージです |
node:24-trixie | Debian のバージョンコードを指定します(trixie = Debian 13) |
nginx:1.30 / nginx:1.31 | nginx の 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 | 圧縮後の内容サイズで、ダウンロード量とほぼ同じです |
| EXTRA | U はコンテナが使用中(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.14 | 433 MB | 1.63 GB |
python:3.14-slim | 45.7 MB | 180 MB |
python:3.14-alpine | 21 MB | 82.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
下から上へ読みます。
- 一番下は Debian 13(trixie)のベースレイヤーで、87.7 MB です。
- 中ほどの
RUN ... groupadd ...は nginx 自体をインストールしており、88.2 MB で最大のレイヤーです。 COPYは起動スクリプトを追加します。サイズは数 KB だけです。ENV、EXPOSE、CMDなどは設定だけなので、サイズは 0B です。
<missing> はエラーではありません。中間レイヤーが別のマシンでビルドされ、このローカル環境には個別の ID がないことを示しています。
レイヤーには次の 2 つの利点があります。
- 共有:複数のイメージが Debian 13 をベースにしている場合、そのレイヤーは 1 つだけ保存され、ダウンロードも 1 回だけです(先ほどの
Already exists)。 - キャッシュ:イメージのビルド時に、変更されていないレイヤーはそのまま再利用できます。これがビルドキャッシュの基本です。
コンテナの起動時、Docker はこれらの読み取り専用レイヤーの上に書き込み可能レイヤーを追加します。コンテナ内で新規作成または変更されたファイルはすべてこのレイヤーに書き込まれ、コンテナを削除するとこのレイヤーも消えます。そのため、保存が必要なデータはVolumeに置きます。
Docker Desktop でイメージを選択すると、同じレイヤー情報を確認できます。

イメージの設定を確認する: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 pull 名稱:tag | イメージをダウンロードする |
docker images | ローカルのイメージを一覧表示する |
docker images -q | ID だけを一覧表示する |
docker tag 來源 新名稱 | 新しい名前 / タグを付ける |
docker rmi 名稱 | イメージを削除する |
docker image prune -a | 未使用のイメージをすべて削除する |
docker history 名稱 | レイヤーを確認する |
docker inspect 名稱 | 設定を確認する |
docker save -o a.tar 名稱 | tar ファイルにエクスポートする |
docker load -i a.tar | tar ファイルからインポートする |
次の節では、コンテナが作成されてから削除されるまでにどのような状態を経るかを紹介します。
まとめ
- イメージ名は
[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日