Skip to content
VDS · Dockerとコンテナ

Docker:よくある問題のトラブルシューティング

コンテナが再起動を繰り返す、ポートが使用中、空き容量なし、「permission denied」、サービスが隣のサービスを見つけられない——症状とトラブルシューティング手順の表です。

更新日 2026年8月23日

コンテナの問題は、ほぼ十数個のよくある原因に集約されます。診断はいつも同じ3つのコマンドから始めます。

最初の3つのコマンド

docker compose ps
docker compose logs --tail 100 <service>
docker inspect -f '{{.State.Status}} {{.State.ExitCode}} {{.State.OOMKilled}} {{.State.Error}}' <container>

ステータス、ログの最後の数行、終了コードでほとんどの疑問は解決します。その後は、症状に応じて対処します。

症状別一覧

症状考えられる原因対処
常に Restartingアプリケーションが起動時にクラッシュしているdocker compose logs --tail 200 で、最後ではなく最初のエラーを確認する
終了コード137、OOMKilled: trueメモリ不足上限を引き上げるかリークを特定する。リソース制限を参照
起動直後に終了コード1設定または変数のエラーdocker compose config で変数の展開を確認する
port is already allocatedポートが別のプロセスに占有されているsudo ss -tulpn | grep :<port>
no space left on deviceディスク容量またはinodeの不足df -h と df -i を確認する。ディスク容量を参照
ボリューム上のファイルで permission deniedUIDの不一致docker compose exec app id を実行し、chown または PUID/PGID を設定する
アプリケーションからデータベースが見えないネットワークが異なる、または localhost へのリクエストDockerネットワークを参照
Cannot connect to the Docker daemonサービスが起動していない、または権限不足sudo systemctl status docker、docker グループを確認する
すべてが遅い、負荷は低いディスクのボトルネックiostat -x 2 を実行する。ディスク速度を参照

コンテナはクラッシュするが、ログが空

これは、プロセスが何も出力する前に終了した場合に起こります。メインのコマンドではなく、シェルでイメージを手動で起動してください。

docker run --rm -it --entrypoint sh <image>

その中で起動コマンドを手動で実行すると、エラーが画面に表示されます。ついでに、設定ファイルが所定の場所にあるかも確認してください。

docker compose run --rm app cat /app/config.yaml

変更が反映されない

よくあるのは、ファイルを編集して再起動しても何も変わらないケースです。

docker compose config          # does Compose see your changes
docker compose up -d --force-recreate app
docker compose exec app cat /etc/app/config.yaml

原因は通常2つです。ファイルが想定とは別の場所にマウントされているか、ビルド時にイメージへ取り込まれたコピーをコンテナが参照しているかです。

docker system prune -a で問題を解決しないでください。未使用のイメージ、ネットワーク、ビルドキャッシュが削除され、--volumes フラグを付けるとデータ入りのボリュームも削除されます。ボリュームは、そのコンテナが停止した瞬間に「未使用」と見なされます。まず原因を突き止め、その後でクリーンアップしてください。

それでもクリーンアップする場合

docker system df
docker image prune
docker builder prune
docker container prune

docker system df を実行すると、何が容量を占めているかが正確にわかります。イメージ、ビルドキャッシュ、ボリューム、コンテナログのいずれかです。通常はビルドキャッシュが原因で、削除しても安全です。

マシンが応答しない場合

SSHに接続できない、サイトが開かない — 通常はコンテナがメモリを食いつぶし、システムがスワップに移行しています。マシンパネルのコンソールからログインしてください。htop や btop には「Screen」モードが必要です。テキスト行ではウィンドウサイズが渡されないため、常に80×24になります。

free -h
sudo dmesg -T | tail -40
sudo systemctl restart docker

システムがまったく起動しない場合は、「アクセス」タブで起動モードをSystemRescueリカバリディスクに切り替えてください。マシンがそこへ再起動し、パスワードなしでrootログインでき、ディスクは /dev/sda として見えます。そこからパーティションをマウントし、データを回収できます。

後ではなく、事前に確認すべきこと

  • ログのサイズ制限が設定されている — コンテナログを参照。
  • すべてのサービスにメモリ制限が設定されている。
  • イメージのバージョンが固定され、古いイメージが削除されていない — コンテナの更新を参照。
  • データのコピーが存在し、検証済みである — リストア演習を参照。