Docker
イメージ
調べる

Docker イメージの検査

この記事では、Dockerイメージの検証に関する4つのポイントを説明します。 Dockerイメージを検証するには、以下の3つのコマンドを使う。

  • docker image ls
  • docker image inspect
  • docker image history(ドッカーイメージ履歴)

この3つのコマンドをベースに、イメージの内容情報、バージョンフック、タグ、名前、レイヤー、容量、コンテナイメージ、Dockerfileなどの検証方法をまとめてみます。

1. Docker イメージを確認するための ls コマンド

1.1. lsコマンドで一般的な情報を確認する

Dockerイメージの中身を見るための最も一般的なコマンドである `ls' コマンドから始めましょう。

基本的な書式は

$ docker image ls [OPTIONS] [REPOSITORY[:TAG]]

一般的には、あなたの docker 環境に現在保存されているイメージの一覧が表示されます。[REPOSITORY[:TAG]] の部分を使うと、特定の docker イメージの内容を見ることができます。

例えば、以下のようにイメージの名前 (リポジトリ名) とタグ (バージョン) を指定すると、そのイメージの内容が表示されます。

docker image ls nginx:latest

以下の情報が得られます。最初から、画像名とタグ情報、ユニークID、作成時刻、画像サイズです。

repository tag image id created size
nginx last f9c14fe76d50 4 days ago 143MB

古いDockerコマンド docker images でも同じことができるが、より新しく整理されたコマンドを使うことを推奨する。

1.2. 特定のイメージに関する詳細な情報を得るための inspect コマンド。

セクション1.1で説明したlsコマンドは、イメージの名前、タグ、ID、作成時間、容量の5つの情報を返します。 inspectコマンドは、これらの情報を含め、指定した画像に関するすべての詳細を表示します。

デフォルトの書式は

inspect docker image [OPTIONS] IMAGE [IMAGE...]

コマンドを実行すると、多くの情報がJSON形式で出力され、スクロールするのに時間がかかることがあります。 Dockerは--formatオプションを提供しているので、特定の情報だけが必要なときに、この大量のデータを印刷し続ける必要はありません。 このオプションはGoテンプレート構文を使い、必要な情報だけを選択的に印刷することができます。

format'オプションの使い方の詳細については、[Docker Container Inspection - Section 1.2] (/docker/container/inspect#1.2)を参照してください。

以下のセクションでは、lsコマンドとinspectコマンド、そして--formatオプションを使って、必要な情報だけを表示する方法を説明する。

2. Dockerイメージの中身を確認する

Dockerユーザーからよく質問される、イメージの名前、バージョン/タグ、レイヤー、サイズを確認する方法を見てみましょう。

2.1. イメージ名の確認

Dockerイメージは、まだコンテナとしてインスタンス化されていないオブジェクトです。 そのため名前はなく、リポジトリ名をイメージ名と呼ぶことができます。 リポジトリ名はそのイメージのDocker Hubリポジトリの名前で、UbuntuやNginxなどの商用サービスは公式イメージと呼ばれます。

Docker image ls コマンドで返されるリストの REPOSITORY エントリを見れば、現在 Docker 環境に保存されているすべてのイメージ名を確認できます。

2.2. イメージのバージョン/タグを確認する

docker イメージのバージョンやタグを確認するには、まず ls コマンドを使用する。イメージリストの TAG エントリを確認することができる。

あるいは、 inspect コマンドの出力にある RepoTags エントリを確認することもできる。これは以下のコマンドを実行することで行うことができる。

$ docker image inspect --format '{ {.RepoTags} }' nginx
[nginx:latest]
 
$ docker image inspect --format '{ {.RepoTags} }' mariadb:10.6
[mariadb:10.6]'

2.3. イメージレイヤーを特定する [#2.3].

Dockerイメージは多くのレイヤーから構成されています。 各レイヤには特定のタスクが含まれており、異なるイメージでは同じレイヤを再利用することもあります。 そのため、レイヤーをどのように整理するかによって、Dockerイメージのサイズや動作速度が変わってきます。

Dockerは特定のレイヤー情報を提供しません。 しかし、inspecthistoryの2つのコマンドの内容から推測することはできます。 実際のレイヤーの内容は、サードパーティ製のツールを使ってより詳細に知ることができる。

まず、inspect コマンドを使って、画像に含まれるレイヤーのハッシュ値を見ることができます。 出力された RootFS エントリの中から Layers エントリを探します。ハッシュ値だけを見たい場合は、以下のコマンドを使います。

$ docker image inspect --format '{ {.RootFS.Layers} }' nginx
[sha256:8cbe4b54fa88d8fc0198ea0cc3a5432aea41573e6a0ee26eca8c79f9fbfa40e3 sha256:4b8862fe7056d8a3c2c0910eb38ebb8fc08785eaa1f9f53b2043bf7ca8adbafb sha256:e60266289ce4a890aaf52b93228090998e28220aef04f128704141864992dd15 sha256:7daac92f43be84ad9675f94875c1a00357b975d6c58b11d17104e0a0e04da370 sha256:5e099cf3f3c83c449b8c062f944ac025c9bf2dd7ec255837c53430021f5a1517 sha256:4fd83434130318dede62defafcc5853d03dae8636eccfa1b9dcd385d92e3ff19]

Dockerはハッシュ値を使って特定のレイヤーの内容を取得する機能を提供していません。例えば、イメージが同じレイヤーを共有していることを確認するためだけです。

docker image historyコマンドを使うことで、イメージを構成しているレイヤと、そのレイヤで実行されているコマンドを確認することができます。 これらのコマンドはDockerfileに基づいているので、特定のレイヤーにマッピングされているわけではありません。

コマンドを実行した結果を以下に示します。--no-truncオプションを追加することで、省略されないより詳細な情報を得ることができます。

$ docker image history nginx:latest
IMAGE          CREATED      CREATED BY                                      SIZE      COMMENT
f9c14fe76d50   5 days ago   /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B
<missing>      5 days ago   /bin/sh -c #(nop)  STOPSIGNAL SIGQUIT           0B
<missing>      5 days ago   /bin/sh -c #(nop)  EXPOSE 80                    0B
<missing>      5 days ago   /bin/sh -c #(nop)  ENTRYPOINT ["/docker-entr…   0B
<missing>      5 days ago   /bin/sh -c #(nop) COPY file:e57eef017a414ca7…   4.62kB
<missing>      5 days ago   /bin/sh -c #(nop) COPY file:36429cfeeb299f99…   3.01kB
<missing>      5 days ago   /bin/sh -c #(nop) COPY file:5c18272734349488…   2.12kB
<missing>      5 days ago   /bin/sh -c #(nop) COPY file:7b307b62e82255f0…   1.62kB
<missing>      5 days ago   /bin/sh -c set -x     && addgroup --system -…   62MB
<missing>      5 days ago   /bin/sh -c #(nop)  ENV PKG_RELEASE=1~bullseye   0B
<missing>      5 days ago   /bin/sh -c #(nop)  ENV NJS_VERSION=0.7.12       0B
<missing>      5 days ago   /bin/sh -c #(nop)  ENV NGINX_VERSION=1.25.0     0B
<missing>      6 days ago   /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B
<missing>      7 days ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      7 days ago   /bin/sh -c #(nop) ADD file:88252a7f118b4d6f5…   80.5MB

Dockerのビルトイン機能では見えないもの、 Dive (opens in a new tab)のようなサードパーティツールを使うのが良いでしょう。 Diveはあなたのイメージを分析し、各レイヤーに何が含まれ、どのように最適化すべきかを教えてくれます。 Diveは画像を分析し、各レイヤーに何が含まれ、どのように最適化されるかを教えてくれます。これについては、同様のことを行う他のツールとともに、新しい記事で取り上げます。

2.4. 画像サイズの確認

画像サイズは ls コマンドできれいに表示されます。SIZE項目で確認できます、 また、容量の値だけを知りたい場合は、以下のコマンドを使うことができます。

$ docker image ls --format '{ {.Size} }' nginx:latest
l43MB

inspectコマンドの内容から容量をバイト単位で知ることができ、Sizeエントリーを確認することができる。

$ docker image inspect --format '{ {.Size} }' nginx
142560184

3. 特定のコンテナ内のイメージの確認

container ls コマンドを使えば、特定のコンテナ内のイメージの名前を見ることができる。

$ docker container ls --all
CONTAINER ID   IMAGE          COMMAND   ...
55d8d5e95e61   mariadb:10.6   "docker-entrypoint.s…"

あるいは、container inspectコマンドを実行した結果のConfig.Imageセクションに、環境変数を含めた詳細が記載されています。

$ docker container inspect --format '{ {.Config.Image} }' 55d8mariadb:10.6

4. イメージの dockerfile をチェックする

Dockerイメージは Dockerfile を元に作成され、既に作成されたイメージには Dockerfile に関する情報は保存されていません。 Dockerfileの内容はセクション2.3で説明したhistoryコマンドによってある程度推測することができますが、ADDCOPYのようにhistoryに存在しないコマンドもあります。

そのため、Docker Hubで検索可能なイメージであれば中身を検索し、カスタムイメージであればDockerfileも共有する必要があります。

5. まとめ

今回は lsinspecthistory の3つのコマンドを元に、イメージの内容情報を確認する方法と、タグ、名前、レイヤー、容量、コンテナイメージ、Dockerfile のバージョンフックを確認する方法をまとめました。 画像の中身をチェックする必要があるときに、ぜひ参考にしてほしい。

copyright for docker image inspect

© 2023 All rights reserved.