Dockerイメージを完全にアンインストールする手順

Dockerイメージを完全にアンインストールする手順

1. docker ps -a 実行中のイメージプロセスを表示する

[root@mylinux~]# docker ps -a
コンテナID イメージ コマンド 作成ステータス ポート名
98acb9dcb2a2 redis:5 "docker-entrypoint.s..." 8 分前 8 分前にアップ 0.0.0.0:6379->6379/tcp redis
1b1ff7f08583 mysql:5.7 "docker-entrypoint.s…" 8 分前 8 分前にアップ 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
035129f60a64 mongo:3.6 "docker-entrypoint.s..." 8 分前 8 分前にアップ 0.0.0.0:27017->27017/tcp mongo

2.docker stop CONTAINER ID 例えば、mysqlイメージを削除するには、イメージプロセスを停止します

ドッカーを停止 035129f60a64

3.docker rm CONTAINER ID イメージのアンインストール

ドッカーrm 035129f60a64

4.dockerイメージ 現在のdockerイメージのIMAGE IDを表示します

[root@mylinux ~]# docker イメージ
リポジトリ タグ イメージ ID 作成 サイズ
redis 5 a4fe14ff1981 25時間前 95MB
mysql 5.7 7faa3c53e6d6 29時間前 373MB
mongo 3.6 0f29e46dab41 2日前 432MB

5. docker rmi イメージID イメージを削除

[root@mylinux ~]# docker rmi 7faa3c53e6d6
タグなし:mysql:5.7
タグなし: mysql@sha256:204f5c77fe589c202e2ebc8b6b7dcdc442d67c07168916a302ede26b3e9ab168
削除済み: sha256:7faa3c53e6d699fe92d49a361e427c3af937c6cea9517f092e8013b1fff1c4d9
削除済み: sha256:bada5edfe9c6f4637d3ef1f4797561867be56282a750c0f1d4a83c227bc7a153
削除済み: sha256:cb6436acc7f930ab22d387016b2296e6c191fc4ebbb1611f84e3e15073588fc7
削除済み: sha256:1716d22cd68158fa78c60cf78d8e25457fb384de45de7775abf3a31502b6f00e
削除済み: sha256:daeb1195813697ab0182eb75de7f5a0f5bbfc4f8eb91be9f844777841e759984
削除済み: sha256:64ffa0ccfe7f5ecb4fb721913499a8e0b1af9897b69a0dbec0922f5b70666e76
削除済み: sha256:3b3af32bd87b74f389198eab8514d9f32f3e513dae313748b165333b286bd171
削除済み: sha256:c75ab456a585af40ca2ec8488164230deb81a1739d868604cb7b6661c24e37b5
削除済み: sha256:50a75eb6a0b2254fe5d96f999cc2087e72d515c93509a816bbd9ffb707a3b1b0
削除済み: sha256:1ae6616333a66450738a72a75c03bdf0236e0425ba0336ac5cdbe470ab6f4a3e
削除済み: sha256:68e318bd9263aedd19d9d73b051a262fa57e2a16f9c81c8b39163601020cd405
削除済み: sha256:6270adb5794c6987109e54af00ab456977c5d5cc6f1bc52c1ce58d32ec0f15f4

補足: Dockerはプライベートライブラリイメージを完全に削除します

まず、インターネット上の一般的な慣行を見てみましょう

デフォルトでは、プライベート ライブラリはイメージの削除をサポートしていません。config.yml 構成ファイルを変更し、ストレージ ノードの下に delete: enabled: true を追加してから、プライベート ライブラリを再起動する必要があります。

Docker が提供するイメージ削除 API は次のとおりです。

ip:port/v2/<リポジトリ>/manifests/<参照> を削除します。

リポジトリはミラー化されたリポジトリです

参照は、イメージが正常にプッシュされた後に生成されたダイジェストです: sha256値

ダイジェストを取得:

curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -XGET <プライベート ライブラリ IP>:ポート番号/v2/<イメージ リポジトリ>/manifests/<イメージ タグ>

知らせ:

--header "Accept: application/vnd.docker.distribution.manifest.v2+json" このヘッダーを追加する必要があります。追加しないと、Content-Type は v1+prettyjws になり、取得されたダイジェストが間違っています。 !

例: curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -XGET 192.168.120.107:5000/v2/my-registry/manifests/1.0

画像を削除するには:

例: curl -I -X DELETE http://192.168.120.107:5000/v2/my-repository/manifests/sha256:4d523adb3c653bab7dfd0326081860b3cba24dc393f69d6731daa513c435ec0c

削除後、プライベートライブラリを確認してみましょう

カール 192.168.120.107:5000/ v2/my-repository/tags/list

削除したタグが消えていることがわかります。しかし、コマンド実行前と実行後のガレージ内のプライベートライブラリイメージ保存ディレクトリのファイルサイズを確認すると、あまり変化がないことがわかります。

当然ながら、データは実際には削除されないため、Docker が提供するガベージ コレクション コマンドを実行する必要があります。

ガベージコレクション

プライベート ライブラリが配置されているサーバーにログインし、次のコマンドを実行する必要があります。

docker exec -it <プライベートライブラリのコンテナIDまたはコンテナ名> sh -c 'registry garbage-collect /etc/docker/registry/config.yml'

もちろん、プライベート ライブラリのコンテナーに入って次のコマンドを実行することもできます。

docker exec -it <プライベートライブラリのコンテナIDまたはコンテナ名> sh

レジストリガベージコレクション /etc/docker/registry/config.yml

この方法は非常に面倒です。タグは削除できますが、リポジトリは削除できません。削除後、blobs ディレクトリに多くの空のフォルダーが残ります。さらに、リポジトリに複数のタグがあり、これらのタグのデータが同じである場合、1 つのタグを削除すると、すべてのタグが同時に削除されます。

インターネット上にはプライベートライブラリイメージを削除するための Python スクリプトがありますが、使いやすいとは思えません。

これでは満足できないので、まずは効果を確認するために自分で sh スクリプトを書きました。

このスクリプトにはユーザーフレンドリーなプロンプトもいくつかあり、sh スクリプトは理解しやすく拡張も簡単です。このスクリプトは gitHub にもアップロードしました。ご興味があればダウンロードして試してみてください。

gitHubアドレス: https://github.com/hushuai86/docker-delete

ダウンロードして実行:

#まずスクリプトを /usr/local/bin/ ディレクトリにダウンロードします curl https://raw.githubusercontent.com/hushuai86/docker-delete/master/docker-delete-2.0.sh | sudo tee /usr/local/bin/docker-delete >/dev/null

#実行権限を与える chmod a+x /usr/local/bin/docker-delete

#プライベート ライブラリ イメージ ストレージ ディレクトリ パス グローバル環境変数 (このパスは、プライベート ライブラリ コンテナを実行するときに -v コマンドを使用して、プライベート ライブラリ コンテナ内の /var/lib/registry ディレクトリをローカル マシンにマウントするパスです)
#例: /opt/data/registry は、コンテナ echo "export DOCKER_REGISTRY_DIR=/opt/data/registry" >>/etc/profile を実行するときに、プライベート ライブラリ イメージ ストレージ ディレクトリがローカル ディレクトリにマウントされるディレクトリです。

#プライベートライブラリコンテナIDグローバル環境変数設定を実行(実行中のプライベートライブラリコンテナのID)
#例: 89b9b3c9054ayは私のプライベートライブラリコンテナのIDです
echo "DOCKER_REGISTRY_CONTAINER_ID=89b9b3c9054a をエクスポート" >>/etc/profile

#設定を有効にするsource /etc/profile

その後、docker-delete コマンドを使用できます。スクリプトに不安がある場合は、スクリプトを編集して自分で変更することもできます。

原則分析:

(次のスクリーンショットでは、/opt/data/registry は、コンテナを実行したときにプライベート ライブラリ イメージ ストレージ ディレクトリがローカル ディレクトリにマウントされるディレクトリです)

プライベートライブラリイメージストレージディレクトリの下には、blobsとrepositoriesの2つのフォルダがあります。

リポジトリ ディレクトリには、ミラー リポジトリにちなんで名付けられたいくつかのファイルが含まれています。

つまり、プライベート ライブラリにどのような画像が含まれているかを知りたい場合は、このフォルダー内のサブフォルダーを確認するだけです。

各イメージリポジトリフォルダ/_m​​anifests/tagsディレクトリでは、イメージにどのタグが付いているか確認できます。

ただし、イメージの実データはリポジトリディレクトリには存在せず、blobs ディレクトリにデータブロックとして保存されます。イメージは複数のデータブロックに分割されており、これはガベージコレクションコマンドを実行したときに出力される「marking blob ...」のような関連付け関係です。イメージとデータブロックの関連付けは、repositories/image ディレクトリにあります。

repository/_manifests/revisions/sha256/ ディレクトリ内の sha256 値。

sha256値にちなんで名付けられたディレクトリにはリンクファイルがあり、その内容はこのsha256値です

テストの結果、このリンク ファイルが削除され、プライベート ライブラリ コンテナーでガベージ コレクション コマンド「registry garbage-collect /etc/docker/registry/config.yml」が実行されると、この sha256 値に関連付けられた BLOB が完全に削除されることがわかりました。

ただし、画像には多くのタグが付いている場合があり、この sha256 値に関連付けられた BLOB データはどのタグに属するのでしょうか?

イメージの tag/index/sha256/ ディレクトリに移動すると、sha256 値にちなんで名付けられたフォルダーが見つかります。この sha256 値は、以前のリビジョン/sha256/ の下に存在します。このフォルダーには、sha256 値を保存するリンク ファイルもあります。

したがって、私の理解によれば、docker が提供する API を呼び出してタグを削除すると、このイメージの tag/index/sha256/<sha256 value>/link ファイル内の sha256 値が取得され、この sha256 値に関連付けられている他のタグがあるかどうかが確認されます。ある場合は、このタグ フォルダーのみを削除します。そうでない場合は、タグ ファイルを削除すると、revisions/sha256/ ディレクトリ内の変更された sha256 に対応するリンク ファイルも削除されます。このようにして、コンテナ内でガベージ コレクション コマンドを実行すると、sha256 値に関連付けられた BLOB データが完全に削除されます。

特別な注意:

イメージのデータを完全に削除した後は、プライベートライブラリコンテナを再起動する必要があります。再起動しないと、再度プライベートライブラリにイメージをプッシュすると必ず「レイヤーが既に存在します」と出力され、プッシュアップされているように見えますが、ローカルイメージを削除してから再度プルするとエラーになります。もちろん、私が書いたスクリプトにはこのステップがあります

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。

以下もご興味があるかもしれません:
  • Dockerイメージ内のnoneイメージ操作を削除する
  • Dockerイメージが消える問題を解決する
  • Dockerとイメージの操作方法
  • Docker イメージのインポートとエクスポートのコード例
  • Docker イメージのダウンロードが遅すぎる場合の解決策
  • Dockerイメージ構築原理の分析(Dockerをインストールしなくてもイメージを構築できる)
  • スクリプトを使用して、ワンクリックでDockerイメージをパッケージ化してアップロードします。
  • Dockerビルドキットを使用して、Raspberry Piで使用できるDockerイメージを構築します。

<<:  16進カラーコード(完全版)

>>:  CSS3 パッケージ化後にプレフィックスプラグインを自動的に追加する方法の詳細な説明: autoprefixer

推薦する

Vue v-for ループを書く 7 つの方法

目次1. v-forループでは常にキーを使用する2. 特定のスコープ内でv-forループを使用する3...

MySQLがブール型を返すいくつかの状況について簡単に説明します。

mysqlはブール型を返します最初のケースでは、直接戻ります select id='22a...

Javascript サンプル プロジェクトでの虫眼鏡効果の実装プロセス

目次序文事例: JD.com の虫眼鏡効果の模倣オフセットシリーズクライアントシリーズスクロールシリ...

MySQLリモート接続を有効にする方法

セキュリティ上の理由から、MySql-Server はローカル マシン (localhost、127...

WeChatアプレットのスクロールビューは、プルアップ時にデータの読み込みを重複させるソリューションを実装しています。

WeChat アプレットのスクロール ビューでは、プルアップして読み込むときにバグが多く発生します...

Linux プラットフォームでの Zabbix エージェントのインストールと設定方法

ここでは、Linux プラットフォームでの Zabbix エージェントのインストールと構成について簡...

Vue は zip ファイルのダウンロードを実装します

この記事の例では、Vueの具体的なコードを共有し、zipファイルをダウンロードして参考にしています。...

React-Native環境のセットアップと基本的な紹介

環境の準備1. 環境構築React Native 中国語ウェブサイト2. 開発ツール フロントエンド...

React 入門レベルの詳細なメモ

目次1. Reactの基本的な理解1. はじめに2. Reactの特徴3. Reactが効率的な理由...

アコーディオン効果を実現するJavaScript

この記事では、アコーディオン効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

node.jsのインストールとHbuilderXの設定の詳細な説明

npm インストールチュートリアル: 1. Node.jsインストールパッケージをダウンロードする公...

現在使用されている設定ファイル my.cnf を表示する mysql メソッド (推奨)

my.cnfは、MySQL の起動時に読み込まれる設定ファイルです。通常は MySQL インストー...

React Fiber構造の作成手順

目次リアクトファイバーの作成1. 始める前に2. React.renderから始める3. 終了リアク...

Vueモバイル端末は左スライド編集と削除の全プロセスを実現します

序文プロジェクトのニーズに応じて、Vue-touch を使用して、vue モバイル端末の左スワイプ編...

CocosCreator システムイベントがどのように生成され、トリガーされるかについての詳細な説明

目次環境まとめモジュール機能関連文書ソースコード分析CCGame.js CCInputManager...