メインコンテンツまでスキップ

第54章:コンテナ内確認(exec)で現場検証🔦

ログだけだと「何が起きてるか」は見えても、「いま中がどうなってるか」は分からないことが多いんだよね😵‍💫 そこで出番なのが exec !コンテナの“現場”に入って、事実を集めていく章だよ〜🕵️‍♂️✨


0) 今日のゴール🎯

  • コンテナに入って(または1発コマンドで)状況確認できるようになる😊
  • ファイル / 環境変数 / プロセス / ポートを確認して、原因のアタリを付けられるようになる🔦
  • exec できない時」の逃げ道も持つ🏃‍♂️💨

1) docker exec って何ができるの?🧰

docker exec は「動いてるコンテナの中で、新しいコマンドを実行する」ためのコマンドだよ✨ (Docker Documentation) ポイントはここ👇

  • exec で動くコマンドは、メインプロセス(PID 1)が動いてる間だけ実行できる(落ちてたら無理) (Docker Documentation)
  • exec で動かしたコマンドは、コンテナが再起動しても勝手に再実行されない(一時的な調査用) (Docker Documentation)
  • “コマンドは実行ファイルとして渡す”必要がある(引用符で丸ごとはダメ、複数コマンドはシェル経由で) (Docker Documentation)

2) exec 最小チートシート🧾✨(まずこれ覚える)

**① 中に入る(シェル)**🕳️

docker exec -it <container> sh
## もし bash があるなら
docker exec -it <container> bash

-it が「対話できるモード」だよ😊 (Docker Documentation)

**② 1発で確認(覗くだけ)**👀

docker exec <container> node -v
docker exec <container> pwd
docker exec <container> printenv
docker exec <container> ls -la

**③ 複数コマンドやりたい(重要!)**🧠 docker exec <container> "echo a && echo b"ダメ。 こうやって シェルに渡すのが正解✅ (Docker Documentation)

docker exec -it <container> sh -lc "echo a && echo b"

④ 作業ディレクトリを指定する📁

docker exec -it -w /app <container> ls
```` :contentReference[oaicite:6]{index=6}

**⑤ ユーザーを指定する(権限確認に便利)**🔒
````bash
docker exec -it -u root <container> sh
docker exec -it -u node <container> sh
```` :contentReference[oaicite:7]{index=7}

---

## 3) 現場検証の「型」🕵️‍♂️🔁(順番を固定すると強い)

困ったら、だいたいこの順でOK!✨

1. **どのコンテナ?**(名前と状態)📛
2. **プロセス生きてる?**(落ちてない?再起動してない?)💓
3. **設定合ってる?**(環境変数・起動コマンド・作業ディレクトリ)🎛️
4. **ファイルある?**(ビルド成果物/設定/マウント)📦
5. **ポート待ち受けしてる?**(アプリがlistenしてるか)🚪
6. **内部から疎通**(localhost / DB / 他サービス)📡

---

## 4) ハンズオン:Todo API を “中から” 点検してみよう🧪✨

### 4-1) まず対象を特定する📛
(Composeならこっちが見やすい)
````bash
docker compose ps

単体運用なら:

docker ps

4-2) API コンテナに入る🔦

Composeの場合、docker compose exec が超便利! docker exec 相当だけど、TTY がデフォルトで付くので楽だよ😆 (Docker Documentation)

docker compose exec api sh
## bash があるなら
docker compose exec api bash

4-3) “今どう起動してる?” を事実で押さえる🧠

中に入ったら、まずこれ👇

**(A) どこにいる?何がある?**📁

pwd
ls -la

**(B) バージョン確認(Node/TS系のズレ発見)**🧪

node -v
npm -v

ちなみに現時点だと Node は v24 が Active LTS(安定運用向け)だよ🛡️ (Node.js)

**(C) 環境変数(設定ミスの宝庫)**🎛️

printenv | sort
## よく見るやつだけ絞る例
printenv | sort | grep -E "NODE_ENV|PORT|DATABASE_URL|DB_|JWT|LOG"

**(D) プロセス(落ちてない?別のコマンド動いてない?)**💓

ps aux
## もし ps が無い超スリム環境なら…
cat /proc/1/cmdline | tr '\0' ' '

4-4) “ポート待ち受け” を確認する🚪👂

## どれか1つ通ればOK(環境で入ってるコマンドが違う)
ss -lntp || netstat -lntp || (echo "ss/netstat無いかも!")

「アプリは起動してるのに外から見えない」系は、ここで気配が出るよ👀✨

4-5) “コンテナ内から” API を叩く(curlが無い時の裏技あり)📡

curl が無いこともある(最近の軽量イメージあるある😇)

  • curl があるなら:
curl -sS http://localhost:3000/health
  • curl が無いなら Nodeの fetch で殴れる!🥊
node -e "fetch('http://localhost:3000/health').then(r=>r.text()).then(console.log).catch(console.error)"

4-6) DB/別サービスに繋がる “名前解決” を確認する🏷️🌐

「DBに繋がらない」系は、まず 名前解決 が速い!⚡

## db というサービス名(例)を解決できる?
node -e "require('dns').lookup('db', (e,a)=>console.log(e||a))"

ここで解決できないなら、ネットワーク/サービス名/Compose設定の線が濃いよ🔥


5) exec できない時あるある😵‍💫(ここで詰まりがち)

(1) コンテナが落ちてる / 再起動ループexec は “動いてる前提” なので入れないことがある(PID 1 が止まってたら無理) (Docker Documentation) この場合はまずログ&終了コード(前章)へ戻ろう🪵🔁

(2) コンテナが paused → paused 中は exec 失敗するよ⚠️(解除してから) (Docker Documentation)


6) 2026の新定番:docker debug(道具持ち込みデバッグ)🧰✨

最近の流れは「本番相当のイメージはスリムに(ツール削る)→ でもデバッグしにくい」問題があるよね😇 そこで docker debug が強い!💪

  • シェルが入ってないコンテナ/イメージでも入れる
  • curlhtop みたいなツール入りの“道具箱”が付いてくる
  • イメージ自体は改変しない(安心) (Docker Documentation)

使い方はシンプル👇

docker debug <container-or-image>

注意点:Docker Desktop のバージョン条件や、古いバージョンだとプラン条件が付くことがあるよ(ドキュメント参照) (Docker Documentation)


7) VS Code から “中” に入って作業する🧑‍💻✨

ターミナルで exec も良いけど、VS Code で Attach すると爆速で快適になるよ🚀 Command Palette(F1)から “Dev Containers: Attach to Running Container…” で、動いてるコンテナに接続できる🧲 (Visual Studio Code) (拡張入れてれば、いつものエディタ体験でデバッグできるやつ!)


8) Node のデバッグポートだけは注意⚠️🧨(超大事)

Node の --inspect はデフォルトで 127.0.0.1:9229 にバインドするよ (Node.js) もし 0.0.0.0 にすると、到達できる人が任意コード実行できる危険がある(マジで危ない)😱 (Node.js)

「どうしてもコンテナからデバッグしたい」時は、ポート公開を ローカル限定にするなど、露出を最小にしようね🛡️


9) AI活用(そのままコピペOK)🤖📌

  • 状況整理してもらう

    • 「この printenvps aux の結果から、怪しい点トップ3と確認手順を作って」
  • “必要な exec コマンドセット”を作る

    • 「Node/TS API が起動しない時に、docker exec だけで確認できるコマンドを10個、目的付きで出して」
  • Compose環境の切り分け

    • 「API→DB 接続失敗の時、名前解決/ポート/認証/起動順 の順に、確認コマンドを提案して」

10) ミニ課題(手を動かすと一気に定着)✅🎮

  1. API コンテナで printenv を見て、PORTNODE_ENV を探す🔎
  2. pwdls -la で「コードが置かれてる場所」を特定する📁
  3. node -e fetch(...)localhost に疎通してみる📡
  4. dns.lookup('db') を実行して、DBサービス名が解決できるか確認する🏷️
  5. うまくいかなかったら、その出力をAIに貼って「次の一手」を出してもらう🤖✨

次の第55章は「ポート系トラブル(見えない/繋がらない)🚪❌」だから、今章の exec で集めた事実がそのまま武器になるよ💪😆