Dockerが重いと感じたときにまず確認すること

Dockerを日常的に使っていると、「最近なんだか重いな」と感じる場面があるかと思います。
ビルドや起動に時間がかかったり、PC全体の動作が遅くなったりする場合は、**Docker内部に不要なリソースが溜まっている可能性が高いです。**

この記事では、Dockerの動作が重くなったときに確認すべきポイントや、よくある原因・対処方法・注意点について、実際のコマンド例とともにご紹介します。

# 1. まずは現在の使用状況を確認する
重くなった原因を探るためには、まずリソース使用状況の可視化が重要です。以下の2つのコマンドを使って、現状を把握しましょう。
```
docker system df
```
このコマンドでは、イメージ・コンテナ・ボリューム・ビルドキャッシュなどのディスク使用状況を確認できます。
特に「Reclaimable（再利用可能）」な容量が多い場合は、不要なデータが残っている可能性が高いです。
```
docker stats
```
こちらは、現在起動中のコンテナごとのCPU使用率・メモリ使用量・ネットワークIOなどをリアルタイムで確認できます。
一部のコンテナがリソースを過剰に消費していないか、チェックしましょう。

# 2. よくある原因
Dockerのパフォーマンスが低下する主な原因として、以下のようなケースが挙げられます。

### 未使用のイメージ・ボリューム・ビルドキャッシュの蓄積
Dockerでは、ビルド時に生成されるキャッシュや古いイメージ、停止済みのコンテナなどが自動で削除されることはありません。そのため、**プロジェクトを繰り返しビルド・実行しているうちに、ディスク容量がどんどん消費されていきます。**

特にdocker system dfで確認した際に、Reclaimableな容量が多い場合はこれが原因である可能性が高いです。

### コンテナによる過剰なリソース消費
特定のコンテナが高負荷状態になっている場合、Docker全体の動作に影響を与えることがあります。
docker statsで、CPUやメモリを異常に消費しているプロセスがないか確認しましょう。

# 3. 解決方法：不要なリソースの削除
原因がある程度わかったら、不要なリソースを削除して環境をクリーンアップしましょう。

### 基本のクリーンアップ
```
docker system prune
```
このコマンドは、未使用のコンテナ・ネットワーク・ビルドキャッシュを削除します。
比較的安全に使用できますが、**必要なリソースが削除されないよう注意が必要です。**

### 全面的なクリーンアップ（より強力）
```
docker system prune -a --volumes
```
**このコマンドは、未使用のイメージ・ボリュームも含めて一括削除します。
ディスク使用量を大幅に削減できますが、永続化されていたデータも削除される可能性があるため慎重に使用してください。**

::: note alert
使用には十分注意してください
:::

### ビルドキャッシュのみを削除
```
docker builder prune
```
ビルド時に残ったキャッシュだけを削除したい場合は、こちらを使うと便利です。
ビルドの再実行に時間がかかることがありますが、容量の節約には効果的です。

# 4. クリーンアップ時の注意点
リソース削除は便利ですが、以下の点には十分注意しましょう。

### 本当に不要か確認してから削除する
間違って必要なボリュームやイメージを削除してしまうと、復旧が困難になることがあります。

### 永続化されたデータに注意
特にデータベースなど、ボリュームを使って保存しているデータは簡単に削除しないようにしましょう。

### 定期的なメンテナンスを習慣にする
ある程度の期間ごとに、状態を確認して不要なデータを整理しておくと、快適な開発環境を保てます。

# まとめ
Dockerが重くなったときの対応は、以下の手順が基本です

### 🔍 確認コマンド一覧
<table border="1" cellspacing="0" cellpadding="8">
  <thead>
    <tr>
      <th>🧪 コマンド</th>
      <th>🎯 内容</th>
      <th>🔐 安全性</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code>docker system df</code></td>
      <td>イメージ・コンテナ・ボリューム・ビルドキャッシュの使用状況と再利用可能容量を確認</td>
      <td>✅ 安全</td>
    </tr>
    <tr>
      <td><code>docker stats</code></td>
      <td>起動中コンテナのCPU・メモリ使用状況をリアルタイムで確認</td>
      <td>✅ 安全</td>
    </tr>
    <tr>
      <td><code>docker images -a</code></td>
      <td>ローカルに存在する全てのイメージ（使用中・未使用）を確認</td>
      <td>✅ 安全</td>
    </tr>
    <tr>
      <td><code>docker volume ls</code></td>
      <td>ボリューム一覧を確認</td>
      <td>✅ 安全</td>
    </tr>
    <tr>
      <td><code>docker buildx du</code></td>
      <td>ビルドキャッシュの使用状況を確認（BuildKit利用時）</td>
      <td>✅ 安全</td>
    </tr>
  </tbody>
</table>

### 🧹 削除コマンド一覧
<table border="1" cellspacing="0" cellpadding="8">
  <thead>
    <tr>
      <th>🧹 コマンド</th>
      <th>🎯 内容</th>
      <th>🔐 安全性</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code>docker builder prune</code></td>
      <td>未使用のビルドキャッシュを削除</td>
      <td>✅ 安全</td>
    </tr>
    <tr>
      <td><code>docker image prune</code></td>
      <td>未使用のイメージを削除（使用中のものは除外）</td>
      <td>⚠️ 注意</td>
    </tr>
    <tr>
      <td><code>docker system prune</code></td>
      <td>停止中のコンテナ、未使用のネットワーク・ビルドキャッシュを削除</td>
      <td>⚠️ 注意</td>
    </tr>
    <tr>
      <td><code>docker volume prune</code></td>
      <td>未使用のボリュームを削除</td>
      <td>⚠️ 注意</td>
    </tr>
    <tr>
      <td><code>docker system prune -a</code></td>
      <td>使用していない全てのイメージも含めて削除</td>
      <td>🚨 危険</td>
    </tr>
    <tr>
      <td><code>docker system prune -a --volumes</code></td>
      <td>すべての未使用リソース（イメージ・ボリューム含む）を削除</td>
      <td>🚨 危険</td>
    </tr>
  </tbody>
</table>