Docker周りのトラブルシューティングガイドブック

# 背景

Dockerを使用していると、コンテナが起動しない、ポートが競合する、ネットワークがつながらないなど、さまざまな不具合が発生することがあります。本記事では、Dockerの不具合を解決するためのコマンドや手順をまとめました。

---

## 1. **Dockerの基本情報を確認する**
### 🔍 **Dockerが正常に動作しているかチェック**
```sh
docker version    # Dockerのバージョン確認
docker info       # システムの詳細情報確認
```

### 📋 **コンテナとイメージの状態を確認**
```sh
docker ps -a      # すべてのコンテナ（実行中・停止中）を一覧表示
docker images     # 保存されているDockerイメージ一覧
docker network ls # Dockerネットワーク一覧
docker volume ls  # Dockerボリューム一覧
```

---

## 2. **コンテナ関連のトラブルシューティング**
### ⚠ **コンテナが起動しない場合の対処**
```sh
docker logs <コンテナ名 or コンテナID>  # コンテナのログを確認
docker inspect <コンテナ名 or コンテナID> # コンテナの詳細情報を取得
docker top <コンテナ名 or コンテナID>     # コンテナ内のプロセス確認
```

### 🚑 **コンテナがエラーで即終了する場合**
```sh
docker start <コンテナ名 or コンテナID>  # コンテナを再起動
docker restart <コンテナ名 or コンテナID>  # コンテナをリスタート
docker run -it --rm <イメージ名> /bin/sh  # 手動でコンテナを起動しデバッグ
```

### 🔄 **不要なコンテナの削除**
```sh
docker rm -f <コンテナ名 or コンテナID>
```

---

## 3. **イメージ関連のトラブルシューティング**
### 🛠 **イメージの詳細を確認**
```sh
docker history <イメージ名>  # イメージの作成履歴を確認
docker inspect <イメージ名>  # イメージの詳細情報を取得
```

### 🗑 **不要なイメージの削除**
```sh
docker rmi <イメージ名 or イメージID>
docker rmi $(docker images -q)  # すべてのイメージを削除
```

---

## 4. **ポート競合の解決方法**
### 🔍 **特定のポートを使用しているプロセスを調査**
```sh
netstat -ano | findstr :3306  # 例: MySQLの3306番ポートを調査
```

### 🛑 **プロセスを強制終了**
```sh
taskkill /PID <プロセスID> /F
```

### 🔄 **ポート競合を解決後、Dockerを再起動**
```sh
docker-compose up -d  # バックグラウンドでコンテナを起動
```

---

## 5. **ネットワーク関連のトラブルシューティング**
### 🌐 **ネットワークの詳細を確認**
```sh
docker network inspect <ネットワーク名>
docker network ls  # ネットワーク一覧表示
```

### 🔄 **ネットワークを削除・再作成**
```sh
docker network rm <ネットワーク名>
docker network create <新しいネットワーク名>
```

### 🔗 **コンテナのネットワーク接続を確認**
```sh
docker network connect <ネットワーク名> <コンテナ名 or コンテナID>
docker network disconnect <ネットワーク名> <コンテナ名 or コンテナID>
```

---

## 6. **Docker全体のクリーンアップ**
### 🗑 **不要なリソースを削除**
```sh
docker system prune -a  # すべての不要なコンテナ、イメージ、ネットワークを削除
docker system df        # ディスク使用量の確認
```

### 🗑 **すべてのコンテナ・イメージ・ボリュームを削除**
```sh
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker rmi $(docker images -q)
docker volume rm $(docker volume ls -q)
```

---

## 7. **Docker Compose のトラブルシューティング**
### 🚀 **サービスの状態を確認**
```sh
docker-compose ps
docker-compose logs
```

### 🔄 **サービスを再起動**
```sh
docker-compose restart
```

### 🏗 **エラー時のデバッグ**
```sh
docker-compose up --build --force-recreate
```

### 🗑 **すべてのコンテナ・ネットワーク・ボリュームを削除**
```sh
docker-compose down -v --remove-orphans
```

---

## 8. **その他のデバッグ方法**
### 🛠 **コンテナ内に入る**
```sh
docker exec -it <コンテナ名 or コンテナID> /bin/sh  # Alpine Linux
```
```sh
docker exec -it <コンテナ名 or コンテナID> /bin/bash # Ubuntu, Debian
```

### 🔄 **Docker自体を再起動**
```sh
sudo systemctl restart docker  # Linux
docker system prune -a         # すべての不要なデータを削除
```

### 📝 **Docker Daemonのログ確認**
```sh
journalctl -u docker --no-pager | tail -n 100
```

---

## **まとめ**
Dockerでトラブルが発生したら、以下の手順で対処しましょう。

1. **`docker ps -a` でコンテナの状態を確認**
2. **`docker logs <コンテナ名>` でエラー内容を確認**
3. **ポート競合なら `netstat -ano | findstr :<ポート番号>` を確認**
4. **該当プロセスを強制終了 `taskkill /PID <PID> /F`**
5. **コンテナが正常に動かない場合 `docker-compose up --build --force-recreate`**
6. **不要なコンテナやイメージを削除 `docker system prune -a`**
7. **WSL2環境なら `wsl --shutdown` でWSLをリセット**
8. **Docker Desktopの再起動 `taskkill /IM "Docker Desktop.exe" /F`**

これでDockerの不具合もスムーズに解決できるはずです！🔥