第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 が強い!💪
- シェルが入ってないコンテナ/イメージでも入れる
curlやhtopみたいなツール入りの“道具箱”が付いてくる- イメージ自体は改変しない(安心) (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)🤖📌
-
状況整理してもらう
- 「この
printenvとps auxの結果から、怪しい点トップ3と確認手順を作って」
- 「この
-
“必要な exec コマンドセット”を作る
- 「Node/TS API が起動しない時に、
docker execだけで確認できるコマンドを10個、目的付きで出して」
- 「Node/TS API が起動しない時に、
-
Compose環境の切り分け
- 「API→DB 接続失敗の時、名前解決/ポート/認証/起動順 の順に、確認コマンドを提案して」
10) ミニ課題(手を動かすと一気に定着)✅🎮
- API コンテナで
printenvを見て、PORTとNODE_ENVを探す🔎 pwdとls -laで「コードが置かれてる場所」を特定する📁node -e fetch(...)でlocalhostに疎通してみる📡dns.lookup('db')を実行して、DBサービス名が解決できるか確認する🏷️- うまくいかなかったら、その出力をAIに貼って「次の一手」を出してもらう🤖✨
次の第55章は「ポート系トラブル(見えない/繋がらない)🚪❌」だから、今章の exec で集めた事実がそのまま武器になるよ💪😆