Docker noneとは何ですか:画像はありませんか?

Docker noneとは何ですか:画像なしの記事の翻訳に注目します Project Atomicブログから。


最後の数日間、Docker <none>:<none>イメージの演習に費やしました。 それらが何であり、何ができるかを説明するために、私は質問を投げかけるこの投稿を書きます:


  1. Docker <none>:<none>イメージとは何ですか?
  2. ぶら下がり画像とは何ですか?
  3. docker images -aを実行すると、 docker images -a<none>:<none> docker images -aれるのはなぜですか?
  4. docker imagesdocker images -aの違いは何ですか?

質問に答える前に、 <none>:<none>には2種類のイメージがあることを思い出してください<none>:<none>イメージ:良いイメージと悪いイメージ。


格好良い<なし>:<なし>


それらを理解するには、Dockerイメージファイルシステムの仕組みとイメージレイヤーの編成方法を理解する必要があります。 この投稿では、例としてFedoraイメージを使用します。 ラップトップ上でDockerデーモンが実行されているので、dockerハブからfedoraイメージをダウンロードします。


ドッカー画像


このスクリーンショットでは、 docker imagesfedora:latestdocker 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/graphdocker pull fedoraと、イメージは一度に1つのレイヤーをロードします。 48ecf305d2cf最初に48ecf305d2cfレイヤーをロードし、 <none>:<none>マークを付けます。これは、 48ecf305d2cf fedora:latestイメージのレイヤーの1つにすぎないためです。 Dockerの用語では、 -aオプションのために中間イメージと呼ばれます。


次に、Dockerはレイヤーded7cd95e059をロードし、 ded7cd95e059 fedora:latestとマークします。 fedora:最新のイメージは、これら2つのレイヤーで構成され、親と子の間の接続を形成します。


親子


親子関係の存在を確認するために、レイヤーded7cd95e059 JSONファイルを確認できます。


親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には現在、自動ガベージコレクションシステムがありません。 持っているといいでしょう。 それまでの間、このコマンドを使用して手動でガベージを収集できます。



Source: https://habr.com/ru/post/J304134/


All Articles