Table of Contents
なぜ自動ドッカークリーンアップがディスクスペース管理に不可欠である
Dockerコンテナは、アプリケーション開発、テスト、およびデプロイメントのための軽量で一貫性のある環境を提供します。しかし、急速に回転する利便性と引き裂きのコンテナは、コストで来ます。ディスクの肥大。時間が経つにつれて、画像のダンシング、容器の停止、未使用のボリューム、および残ったビルドキャッシュの蓄積、貴重なディスク容量の消費。チェックが解除されたこのクラスターは、劣化したパフォーマンス、失敗したデプロイ、およびシステムの不足につながることができます。クリーンアップを自動化するだけでなく、ストレージを再開することも保証します。
単一の開発者ワークステーションは、数週間以内に、Dockerイメージを未使用の]のgigabytesを収集するかもしれません。 生産環境では、コンテナが頻繁に更新または置換される場合、問題は急速に拡大します。 手動クリーンアップはエラーが発生し、しばしば無視されます。 自動化されたスケジュールされた剪定戦略を実行することにより、あなたは推測を排除し、ほとんどの重要なリソースを解放します:アプリケーションを実行します。
Dockerのクリーンアップユーティリティの理解
Docker は、未使用のデータを削除するためのコマンドのスイートを提供します。最も強力なのは です。これは、コンテナ、画像、ボリューム、ネットワークをターゲットにすることができます。キーオプションを破してみましょう。
- ] – コンテナ、すべてのダンシング画像、および未使用ネットワークを全て削除します。
- [] – コンテナで参照されていない画像を含む、すべての未使用画像の除去を追加します。
- []] – 未使用のボリュームをプルーン(デフォルトボリュームは削除されません)。
- [] - すべてのフラグを組み合わせます:確認なしで力の取り外し、すべての未使用の画像、およびボリューム。 これは、クリーンアップのための核オプションです。
より詳細な制御については、Docker は別のコマンドを「、[、]]、および [] で提供しています。各々は、特定の時間よりも古いリソースに削除を制限するために、フィルタ(])を受け付けます。
クローンベースの自動化のためのステップバイステップセットアップ
Linux システムでは、cron はタスクを再帰するための最も簡単なスケジューリングツールを残します。 Docker のクリーンアップを自動化するには、crontab の行数だけが必要です。
1. Dockerコマンドパスの確認
限られた環境で実行されるCronジョブ。実行中の[のフルパスを決定します。
which docker
通常、このリターン。 cronコマンドのパスを使用します。
2. Crontab を編集する
実行:
crontab -e
これが初めての場合、エディタを選択するように求められます。次の行を2:00 AMで毎日実行します。
0 2 * * * /usr/bin/docker system prune -af --volumes > /dev/null 2>&1
[ stdout と stderr を null にリダイレクトし、メールボックスを出力で充填しないようにします。 スケジュールを必要に応じて調整します(例: ) 週単位)。
3. ジョブをテストする
cron に依存する前に、コマンドを手動で実行して、期待通りに動作するようにします。
sudo /usr/bin/docker system prune -af --volumes
非root Docker インストールを使用している場合は、[] を追加したり、 []]] グループで cron ジョブをユーザとして実行する必要があります。
高度な自動化システムタイマー
cron は多くの人にとって十分ですが、システム化されたタイマーは、より良いロギング、依存処理、およびインイトシステムの残りの部分と統合を提供します。 Docker のクリーンアップのためのタイマーを作成する方法は次のとおりです。
1. サービスユニットを作成する
以下を[として保存します。
[Unit]
Description=Docker system prune
Wants=docker.service
After=docker.service
[Service]
Type=oneshot
ExecStart=/usr/bin/docker system prune -af --volumes
User=root
StandardOutput=journal
2.タイマーユニットを作成する
として保存します。]:
[Unit]
Description=Run Docker cleanup daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
3.タイマーを有効にして起動する
sudo systemctl daemon-reload
sudo systemctl enable docker-cleanup.timer
sudo systemctl start docker-cleanup.timer
で確認します。このアプローチは、システム化されたジャーナルに出力されたログを記録し、監査クリーンアップが実行されるのを容易にします。
保持ポリシーのクリーンアップフィルタの設定
攻撃的な剪定はほとんどの開発環境で安全ですが、生産システムには[]の保持ポリシー]が必要です。例えば、またはとしてタグ付けされた画像を保持するか、48時間以上経過したリソースのみを削除したい場合があります。
年齢別フィルター
未使用の画像やコンテナを24時間以上使用できるように:
docker system prune -af --filter "until=24h" --volumes
[]は、画像とコンテナの両方で動作します。 []と組み合わせて、より複雑なルールを複数回します。
特定のリソースを除外する
Docker には組み込みの無視リストはありませんが、削除を防ぐためにラベルを使うことができます。ラベルの重要なコンテナやイメージ(例えば、])をラベルにし、マイナスラベルフィルタ(ではまだサポートされていません)を使用します。 回避策は、を削除前にラベルをチェックするカスタムスクリプトと ]]]]を組み合わせることです。 [FLTFLT:[FLT:] [FLT:] [FLT:]]] [FLTFLT:[FLT]]]]]] または [F]:[F] [F] [FLT:[F]] [F]] [F] [F] [F] [F]] [F] [FLT: [F]]]] [F] [F] [F] [FLT: [F] [FLT: [F] [F] [F] [F] [F] [F] [FLT: [F] [FLT: [F] [F] [F] [F] [F] [F
ディスクスペースの監視とクリーンアップ効果
オートメーションは、監視と同じくらい良いです。各クリーンアップ後にディスクの使用状況を追跡するためにアラートを設定してください。簡単なアプローチには、次のものが含まれます。
- 実行中 の cron ジョブで、結果を記録します。
- ]のようなツールを使用して、docker-system-resource-influx]]をInfluxDBまたはPrometheusにメトリックを送信するために使用します。
- ]Datadogまたは]]と統合して、Dockerストレージを時間をかけて視覚化します。
クリーンアップが実行されるがディスク使用量が高かった場合、スペースが消費される場所を調べるを使って調べてください。 一般的な犯人は、CIシステムや、コンテナを中止することでまだ参照されていない大容量のビルドキャッシュを含みます。
生産環境のベストプラクティス
1. 常に段階的なアプローチを使用する
を フラグ無しで、週単位で乾式で起動します。(削除されるものを見る)。 削除を有効にする前に出力を確認します。
2. CI/CD パイプラインと座標
ビルドシステムが多くの一時的なイメージを作成したら、ビルド後にまたは低トラフィックのウィンドウで実行するスケジュールをスケジュールします。ビルド中に実行しないでください。 中間層の誤った除去を防ぐため、まだ使用中の。
3. バックアップクリティカルなデータ
データベースやユーザのアップロードを含むボリュームは、任意の攻撃的なボリュームの実行の前にバックアップする必要があります。 []のようなDockerボリューム管理ツールを使用して、プルーンの影響を受けないマウント外部ストレージをバインドします。
4. 実行非ルートユーザとして実行
セキュリティのために、必要に応じて、cronジョブをrootとして実行することを避けてください。 []グループにユーザーを追加し、なしでジョブを実行します。 しかし、グループ内の任意のユーザーが、効果的にホストへのルートアクセスを持っています。 あなたの環境のリスクを評価します。
5. ログクリーンアップ活動
監査のためにの代わりにログファイルに出力をリダイレクトする:
0 2 * * * /usr/bin/docker system prune -af --volumes >> /var/log/docker-cleanup.log 2>&1
定期的に、エラーや予期しない削除のログを確認します。
一般的な落札とテムを避ける方法
- []] 実行中のコンテナのデータを[: [] フラグは、将来のビルドに必要な中間層を含む、すべての未使用画像を削除します。 頻繁に再構築する場合は、] のフィルタまたは実行 を]なしで設定してください。
- ] 重要な state[ を含むボリューム: デフォルトでは、 が使用されていない限り、ボリュームを削除しません。 特定のボリュームが永続的なデータを保持していない場合は、そのフラグのみを追加します。
- []ネットワークプルーンがコンテナ接続を破る:[[は、未使用のネットワークを削除します。カスタムネットワークが任意のコンテナで参照されていない場合は、将来のコンテナ起動を破壊する可能性があります。スワルムにオーバーレイネットワークを使用する場合は、この点を留意してください。
- Cron環境問題]:cronが実行したときにDockerはPATHにないかもしれません。 常にバイナリにフルパスを使用します。
代替ツールとアプローチ
ネイティブ Docker コマンドは、ほとんどのニーズに対応している一方で、サードパーティ製のツールは高度な機能を提供します。
- Watchtower[] - 実行中のコンテナを更新し、更新後に古い画像をクリーンアップすることができます自動化します。
- [Portainer[] – スケジュールされたクリーンアップ機能を含むDocker管理用のWeb UI。
- [docker Builder prune] - 具体的にはCI / CDパイプラインで非常に巨大なビルドキャッシュを対象としています。
Kubernetes環境では、]]kubeletごみ収集]や]などのツール、Kured[、または]])、Descheduler[[をノードレベルのクリーンアップに使用して検討してください。
コンテンツ
Dockerコンテナのクリーンアップを自動化するのは、健康で効率的なDockerホストを維持するためのシンプルで重要な実践です。 cron、システム化されたタイマー、またはサードパーティ製のツールを選択するかどうかにかかわらず、キーは、必要なデータを削除するリスクに対してディスク保存のバランスをとっているポリシーで定期的に実行することです。 フィルターとログを節約し、あなたの自信が成長するにつれてスケジュールを締めます。 運用中のルーチンに自動化されたクリーンアップを統合することにより、あなたは、ディスクが必要なスペースを保ち、あなたのスペースを確保し、あなたのスケジュールを安全にし、確実に実行することを保証します。