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は特定のレイヤー情報を提供しません。
しかし、inspect
とhistory
の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
コマンドによってある程度推測することができますが、ADD
やCOPY
のようにhistoryに存在しないコマンドもあります。
そのため、Docker Hubで検索可能なイメージであれば中身を検索し、カスタムイメージであればDockerfile
も共有する必要があります。
5. まとめ
今回は ls
、inspect
、history
の3つのコマンドを元に、イメージの内容情報を確認する方法と、タグ、名前、レイヤー、容量、コンテナイメージ、Dockerfile
のバージョンフックを確認する方法をまとめました。
画像の中身をチェックする必要があるときに、ぜひ参考にしてほしい。
