Docker noneとは何ですか:画像なしの記事の翻訳に注目します。 Project Atomicブログから。
最後の数日間、Docker <none>:<none>
イメージの演習に費やしました。 それらが何であり、何ができるかを説明するために、私は質問を投げかけるこの投稿を書きます:
- Docker
<none>:<none>
イメージとは何ですか? - ぶら下がり画像とは何ですか?
-
docker images -a
を実行すると、docker images -a
の<none>:<none>
docker images -a
れるのはなぜですか? -
docker images
とdocker images -a
の違いは何ですか?
質問に答える前に、 <none>:<none>
には2種類のイメージがあることを思い出してください<none>:<none>
イメージ:良いイメージと悪いイメージ。
格好良い<なし>:<なし>
それらを理解するには、Dockerイメージファイルシステムの仕組みとイメージレイヤーの編成方法を理解する必要があります。 この投稿では、例としてFedoraイメージを使用します。 ラップトップ上でDockerデーモンが実行されているので、dockerハブからfedoraイメージをダウンロードします。
このスクリーンショットでは、 docker images
はfedora:latest
とdocker images
示していdocker images -a
すでに2つのfedora:latest
イメージを持っていますfedora:latest
と<none>:<none>
。 Dockerを使用している場合、画像の数<none>:<none>
はダウンロードされた画像の数とともに指数関数的に増加することに気づきました。
<none>:<none>
イメージとは何ですか? これを理解するには、Dockerファイルシステムのレイヤーがどのように構成されているかを知る必要があります。 各ドッカーイメージはレイヤーで構成され、レイヤーには他のレイヤーとの親子関係があります。 dockerファイルシステムのすべてのレイヤーは、デフォルトで/var/lib/docker/graph
保存されます。 Dockerの用語では、グラフデータベースと呼ばれます。 fedora:latest
例では、 /var/lib/docker/graph
にある2つのレイヤーで構成されてい/var/lib/docker/graph
。
IMAGE ID
は、ディレクトリ/var/lib/docker/graph
内のレイヤーに対応してい/var/lib/docker/graph
。 docker pull fedora
と、イメージは一度に1つのレイヤーをロードします。 48ecf305d2cf
最初に48ecf305d2cf
レイヤーをロードし、 <none>:<none>
マークを付けます。これは、 48ecf305d2cf
fedora:latest
イメージのレイヤーの1つにすぎないためです。 Dockerの用語では、 -a
オプションのために中間イメージと呼ばれます。
次に、Dockerはレイヤーded7cd95e059
をロードし、 ded7cd95e059
fedora:latest
とマークします。 fedora:最新のイメージは、これら2つのレイヤーで構成され、親と子の間の接続を形成します。
親子関係の存在を確認するために、レイヤーded7cd95e059
JSONファイルを確認できます。
大丈夫! これで、 <none>:<none>
の意味がわかりました。 これらは、 docker images -a
を使用して表示できる中間docker images -a
。 これらはハードドライブをオーバーフローさせませんが、コマンドの出力で多くのスペースを占有します。 そして、それらが何に関連しているのかを理解することは非常に困難です。
(1)、(3)、(4)と答えました。 (2)に光を当てましょう。
悪い<なし>:<なし>
その他の<none>:<none>
イメージ<none>:<none>
は、ハードドライブをオーバーフローさせる可能性がある個別のイメージです。
JavaおよびGolangプログラミング言語では、メモリの独立したブロックは、コードのどこからでもリンクのないブロックです。 このような言語のガベージコレクションシステムは、定期的にブロックを個別としてマークし、ヒープに返します。その後、これらのブロックは将来使用できるようになります。 それらと同様に、Dockerファイルシステムの別のレイヤーは未使用のものであり、画像からのリンクはありません。 したがって、これらの分離されたイメージをクリアするようにDockerに指示する方法が必要です。
docker images -a
での<none>:<none>
意味はすでにわかっています。 これらは中間画像であると上記で述べられています。 ただし、 docker images
の出力に<none>:<none>
docker images
がない場合、クリーニングに使用できる中間イメージがあります。 彼らはどこから来たのですか?
これらの中間イメージは、 docker build
またはpull
コマンドの結果です。 具体例として、
以前にhello_world
ベースフェドライメージを使用してhello_world
イメージをhello_world
ましょう。 Dockerfileを使用しhello_world
イメージをhello_world
。
上のスクリーンショットに示すように、Dockerfileを使用してhello_world
イメージを正常に作成しました。
hello_world
イメージをビルドしてから時間が経過し、Fedoraの新しいバージョンがリリースされました。 新しいFedoraイメージをダウンロードしましょう。
新しいFedoraイメージを入手しました。 次に、新しいFedoraを使用してhello_world
イメージを構築しhello_world
。 同じDockerfileを使用してイメージを再度アセンブルしましょう。
ded7cd95e059
て確認すると、古いFedoraイメージにはIMAGE ID( ded7cd95e059
)があり、上のスクリーンショットの新しいFedoraイメージにはIMAGE ID( 5c6d07393f9f
)があります。つまり、Fedoraイメージは正常に更新されています。 一番上のスクリーンショットで注意すべき重要なことは、画像<none>:<none>
です。
覚えているなら、 docker images -a
指定された<none>:<none>
docker images -a
は中間(良い)画像ですが、この<none>:<none>
画像は通常のドッカー画像です。 これは孤立したイメージであり、クリーニングする必要があります。 Dockerfileを使用してhello_world
イメージhello_world
再構築すると、古いFedoraへの参照がマークされず、切り離されました。
このコマンドを使用して、孤立したイメージをクリーニングできます。
docker rmi $(docker images -f "dangling=true" -q)
Dockerには現在、自動ガベージコレクションシステムがありません。 持っているといいでしょう。 それまでの間、このコマンドを使用して手動でガベージを収集できます。