Docker | 2週間で実務レベルに到達するDocker学習:ログ・デバッグ - Day12

Docker Docker
スポンサーリンク

Day12:ログ・デバッグ(中盤)

テーマ:実際の障害シナリオを使って “docker logs と docker exec をどう使い分けるか” を体で覚える

中盤では、前半で学んだ
docker logs(ログ確認)
docker exec(コンテナ内部調査)
を、実際のトラブル事例を使って「どう使い分けるか」を深掘りします。

ここを理解すると、あなたは
“原因を推測する人” から “原因を特定できるエンジニア”
に進化します。


コンテナ障害対応の基本フローを理解する

まずはこの順番を頭に入れる

障害対応は次の順番で進めると、最短で原因にたどり着けます。

  1. docker logs でエラー内容を確認する
  2. docker ps でコンテナの状態を確認する
  3. docker exec で内部に入り、設定・ファイル・ネットワークを調査する

この順番は、実務でもほぼ全員が使っています。
理由は「ログ → 状態 → 内部調査」が最も効率的だからです。


シナリオ1:アプリが起動直後に落ちる

Step1:まずログを見る

docker logs web

ログにこう出ていたとします。

Error: Cannot find module 'express'

これは
express がインストールされていない
という意味です。

Step2:コンテナに入って確認

docker exec -it web bash
ls node_modules

ここに express がなければ、
Dockerfile の npm install が正しく動いていない可能性が高いです。

Step3:原因を特定

  • COPY の順番が間違っている
  • package.json がコピーされていない
  • npm install がキャッシュされている

などが考えられます。


シナリオ2:web → db の接続が失敗する

Step1:ログを見る

docker logs web

ログにこう出ていたとします。

Error: connect ECONNREFUSED 127.0.0.1:3306

これは
localhost に DB がいない
という意味です。

Step2:コンテナに入ってネットワーク確認

docker exec -it web bash
ping db

応答があれば、
ネットワークはつながっている
ということです。

Step3:環境変数を確認

env | grep DB

もし DB_HOST=db が設定されていなければ、
docker-compose.yml の environment が間違っています。


シナリオ3:コンテナは動いているのに API が応答しない

Step1:ログをリアルタイムで追う

docker logs -f api

リクエストが来ているか、エラーが出ているかを確認します。

Step2:コンテナ内部でポート確認

docker exec -it api bash
netstat -tlnp

ここで
アプリが 3000 番で待っているか
を確認します。

もし 3000 番で待っていないなら、
アプリ側の設定ミスです。

Step3:Dockerfile の CMD やアプリ設定を確認

  • CMD が間違っている
  • ポート番号が違う
  • アプリが 0.0.0.0 で待っていない(127.0.0.1 で待っている)

などが原因になります。


シナリオ4:コンテナが “Restarting” を繰り返す

Step1:状態確認

docker ps

STATUS が Restarting なら、
起動 → エラー → 再起動 を繰り返しています。

Step2:ログで原因確認

docker logs <ID>

多くの場合、

  • ポート競合
  • 環境変数不足
  • DB 接続失敗
  • CMD の書き間違い

が原因です。

Step3:exec は使えない

Restarting 状態では exec が失敗します。
つまり、
logs が唯一の情報源
になります。


docker logs と docker exec の使い分けを深掘りする

docker logs が向いている場面

  • アプリのエラーを知りたい
  • 起動時のエラーを確認したい
  • Restarting の原因を知りたい
  • リクエストの流れを追いたい(-f)

docker exec が向いている場面

  • ファイルが正しくコピーされているか確認したい
  • 環境変数が正しいか確認したい
  • ネットワークがつながっているか確認したい
  • DB や Redis に直接接続して状態を見たい

この使い分けができると、
障害対応のスピードが劇的に上がります。


中盤まとめ

あなたがここまで理解できていれば、中盤はクリアです。

  • 障害対応は「logs → 状態 → exec」の順で進める
  • 起動直後のエラーは logs が最速
  • 接続エラーは logs と exec の両方で調査
  • Restarting は logs が唯一の情報源
  • exec でファイル・環境変数・ネットワークを直接確認できる
タイトルとURLをコピーしました