トラブルシューティング・Tips

クリーンアップ系コマンド

Dockerを使い続けると、使われていないイメージやコンテナがたまります。定期的な掃除が重要です。

# ディスク使用量を確認
docker system df

# 詳細情報を表示
docker system df -v

# 未使用の全リソースを一括削除
docker system prune

# 未使用イメージも含めて削除
docker system prune -a

# ボリュームも含めて削除(注意)
docker system prune -a --volumes

# 確認なしで実行
docker system prune -af

✓ 定期的にpruneを実行してディスク容量を節約

--volumesオプションはデータベースデータを削除する可能性があるので注意

コンテナのクリーンアップ

# 停止中のコンテナを全て削除
docker container prune

# 全コンテナを停止
docker stop $(docker ps -q)

# 全コンテナを削除
docker rm $(docker ps -aq)

# 実行中の全コンテナを強制停止・削除
docker rm -f $(docker ps -aq)

イメージのクリーンアップ

# 未使用イメージを削除
docker image prune

# タグなしイメージ(dangling)を削除
docker image prune

# 未使用の全イメージを削除
docker image prune -a

# タグなしイメージのみ一括削除
docker rmi $(docker images -f "dangling=true" -q)

# 全イメージを削除(注意)
docker rmi $(docker images -q)

ボリュームの管理

# ボリューム一覧
docker volume ls

# ボリュームの詳細情報
docker volume inspect ボリューム名

# ボリュームを作成
docker volume create my-volume

# 未使用ボリュームを削除
docker volume prune

# 特定のボリュームを削除
docker volume rm ボリューム名

# 全ボリュームを削除(非常に危険)
docker volume rm $(docker volume ls -q)

※ ボリュームはデータを保持するため、削除前に必ず確認してください。

ネットワークの管理

# ネットワーク一覧
docker network ls

# ネットワークの詳細情報
docker network inspect bridge

# ネットワークを作成
docker network create my-network

# コンテナをネットワークに接続
docker network connect my-network コンテナ名

# コンテナをネットワークから切断
docker network disconnect my-network コンテナ名

# 未使用ネットワークを削除
docker network prune

# ネットワークを削除
docker network rm my-network

よくあるトラブルと対処法

ポートがすでに使用されている

# エラー例: Error starting userland proxy: listen tcp4 0.0.0.0:8080: bind: address already in use

# 対処方法1: 使用中のプロセスを確認
lsof -i :8080
# または
netstat -an | grep 8080

# 対処方法2: 別のポートを使用
docker run -d -p 8081:80 nginx

# 対処方法3: 使用中のコンテナを停止
docker ps | grep 8080
docker stop コンテナ名

イメージが削除できない

# エラー例: Error response from daemon: conflict: unable to remove repository reference

# 対処方法1: 使用中のコンテナを確認・削除
docker ps -a | grep イメージ名
docker rm -f コンテナ名

# 対処方法2: 強制削除
docker rmi -f イメージID

コンテナが起動しない

# ログを確認
docker logs コンテナ名

# 詳細情報を確認
docker inspect コンテナ名

# イベントを確認
docker events --since 1h

# コンテナを再作成
docker rm コンテナ名
docker run [OPTIONS] イメージ名

ボリュームのパーミッションエラー

# エラー例: Permission denied

# 対処方法1: ユーザーIDを指定
docker run -u $(id -u):$(id -g) -v $(pwd):/app イメージ名

# 対処方法2: ホスト側のパーミッションを変更
chmod -R 755 ./data

# 対処方法3: SELinuxが原因の場合(Linux)
docker run -v $(pwd):/app:z イメージ名

Dockerデーモンが起動しない

# Dockerデーモンの状態確認
sudo systemctl status docker

# Dockerデーモンを再起動
sudo systemctl restart docker

# Dockerデーモンを有効化
sudo systemctl enable docker

# macOS/Windowsの場合:Docker Desktopを再起動

便利なTips

コンテナ内でシェルを起動

# bashを起動
docker exec -it コンテナ名 bash

# shを起動(Alpine Linuxなど)
docker exec -it コンテナ名 sh

# rootユーザーで接続
docker exec -it -u root コンテナ名 bash

# 新規コンテナでシェル起動
docker run -it --rm ubuntu bash

ログを見やすく表示

# リアルタイムでログを追跡
docker logs -f コンテナ名

# 最新100行を表示
docker logs --tail 100 コンテナ名

# タイムスタンプ付きで表示
docker logs -t コンテナ名

# 特定時間以降のログ
docker logs --since 2h コンテナ名
docker logs --since 2024-01-01T00:00:00 コンテナ名

コンテナのリソース使用状況を監視

# 全コンテナのリソース使用状況
docker stats

# 特定コンテナのみ監視
docker stats コンテナ名

# ストリームしない(一回のみ表示)
docker stats --no-stream

# 実行中のプロセスを表示
docker top コンテナ名

ファイルのコピー

# ホストからコンテナへ
docker cp ./local-file.txt コンテナ名:/path/to/

# コンテナからホストへ
docker cp コンテナ名:/path/to/file.txt ./

# ディレクトリごとコピー
docker cp コンテナ名:/app/logs ./logs

イメージのエクスポート・インポート

# イメージをtarファイルに保存
docker save -o my-image.tar イメージ名

# tarファイルからイメージを読み込み
docker load -i my-image.tar

# 複数イメージを一括保存
docker save -o images.tar イメージ1 イメージ2

エイリアスを使用した短縮コマンド

# ~/.bashrc または ~/.zshrc に追加

# コンテナ一覧
alias dps='docker ps'
alias dpsa='docker ps -a'

# クリーンアップ
alias dprune='docker system prune -af'

# コンテナを停止・削除
alias dstop='docker stop $(docker ps -q)'
alias drm='docker rm $(docker ps -aq)'

# Docker Compose
alias dc='docker compose'
alias dcu='docker compose up -d'
alias dcd='docker compose down'
alias dcl='docker compose logs -f'

セキュリティのベストプラクティス

  • rootユーザーを避ける:コンテナ内では非rootユーザーを使用
  • 最小限のイメージを使用:Alpine Linuxなど軽量イメージを選ぶ
  • イメージを定期的に更新:セキュリティパッチを適用
  • シークレットをハードコードしない:環境変数やDocker Secretsを使用
  • コンテナのリソースを制限--memory--cpusで制限

デバッグ用コマンド

# コンテナの全詳細情報をJSON形式で表示
docker inspect コンテナ名

# 特定の情報だけ抽出
docker inspect --format='{{.NetworkSettings.IPAddress}}' コンテナ名

# コンテナのプロセス一覧
docker top コンテナ名

# コンテナの変更点を確認
docker diff コンテナ名

# イメージの履歴を確認
docker history イメージ名