Dockerコンテナデバッグガイド:execコマンドで内部に入って問題を特定する正しい方法

金曜の午後3時、テスト環境のAPIが突然「502 Bad Gateway」を返し始めました。
慌てて docker ps を叩くと、コンテナのステータスは「Up 2 hours」。落ちてはいません。docker logs を見ても、冷たい「Connection refused」の文字だけ。
こういう時が一番焦りますよね。「外からは動いているように見えるのに、中身が死んでいる」。
設定ファイルが間違っているのか? プロセスが固まっているのか? そもそもポートが開いていないのか?
これを確認するには、コンテナというブラックボックスの**「中に入る」**しかありません。
正直に言うと、私がDockerを使い始めた頃は「入り方」が分からず、適当にググった docker attach を使ってコンテナを停止させてしまったり、中に vim がなくて途方に暮れたりしました。
この記事では、そんな失敗をしないための「正しいコンテナへの入り方(exec)」と、中で行うべき「プロのデバッグ手順」を解説します。
基礎:正しいコンテナの「入り方」
最もよく使うコマンド
コンテナに入る(ログインする)ための標準コマンドはこれです:
docker exec -it my-nginx bashパラメータ解説:
-it:-i(入力を受け付ける)と-t(ターミナルを割り当てる)の組み合わせ。「対話モードにする」という意味です。my-nginx:入りたいコンテナの名前(またはID)。bash:中で実行したいプログラム(シェル)。
実行するとプロンプトが root@abc123def456:/# のように変わり、コンテナ内部をLinuxサーバーのように操作できるようになります。
「bashがない」と言われたら?
Alpine Linuxベースの軽量イメージなどでは、以下のエラーが出ることがあります:
OCI runtime exec failed: ... executable file not foundこれは bash がインストールされていないためです。その場合は sh を使いましょう:
docker exec -it my-alpine sh私の経験上、とりあえず bash を試して、ダメなら sh。これで99%解決します。
安全な出方
作業が終わったら、以下のコマンドで抜けます:
exitまたはショートカット Ctrl + D。
重要:execで入っている場合、exitしてもコンテナは停止しません。 安心してください。
exec vs attach:絶対に間違えてはいけない違い
多くの初心者がここで躓きます。「attach」というコマンドもあるからです。
違いを一言で言うと:
- exec:新しい「別の入口」を作って入る(推奨)。
- attach:メインプロセスの「画面」を共有する(危険)。
なぜattachが危険なのか?docker attach my-nginx で入ると、あなたはNginxが動いているメインプロセスそのものに接続します。
ここでうっかり「終わったから出よう」として Ctrl + C を押すと……メインプロセスに終了信号が送られ、コンテナ自体が停止します。
本番環境でこれをやると大事故になります。
「デバッグには必ず exec を使う」。 これだけは覚えて帰ってください。
| 機能 | docker exec | docker attach |
|---|---|---|
| プロセス | 新しいプロセスを作る | メインプロセスに接続 |
| exitの影響 | 何も起きない(安全) | コンテナが停止する(危険) |
| 用途 | デバッグ、作業 | ログのリアルタイム監視(logs -f推奨) |
コンテナ内で「道具がない」問題の対処法
コンテナに入れた!設定ファイルを確認しよう……と思った矢先:
root@abc:/# vim /etc/nginx/nginx.conf
bash: vim: command not found
root@abc:/# ping google.com
bash: ping: command not found「何もねえ!」
Dockerイメージは軽量化のため、vimもpingもcurlも入っていないことが普通です。
解決策1:一時的にインストールする
開発環境や緊急時なら、その場で入れてしまいましょう。
Debian/Ubuntu系 (apt)
apt-get update
apt-get install -y vim curl iputils-ping net-toolsAlpine系 (apk)
apk update
apk add vim curl bashCentOS系 (yum)
yum install -y vim curl※注意:ここでインストールしたツールは、コンテナを再起動すると消えます。
解決策2:cat / sed で乗り切る(本番向け)
本番環境のコンテナに勝手にツールを入れるのは、セキュリティや汚染の観点から推奨されません。
あるもので戦いましょう。
ファイルを見る: vim がなくても cat や less、head はあります。
cat /etc/nginx/nginx.confファイルを編集する: sed や echo を使います。
# 設定を上書き追記
echo "debug_mode=on" >> config.ini
# 置換する(listen 80 -> 8080)
sed -i 's/listen 80/listen 8080/g' /etc/nginx/nginx.confユーザー権限のトラブルシュート
「Permission denied」でファイルが見れない/書けないことがあります。
コンテナはセキュリティのため、非rootユーザーで動いている場合があるからです。
そんな時は、強制的にrootで入る オプションを使います:
docker exec -it -u 0 my-app bash
# -u 0 は rootユーザー(UID 0)を指定または
docker exec -it --user root my-app bashこれで神の権限(root)が手に入ります。ただし、作成したファイルの所有権などが変わってしまうので、作業には注意が必要です。
プロのデバッグ・ワークフロー
トラブル発生時、私はいつもこの手順で調査します。
Step 1. 外からログを見る
まずは入らずにログ確認。
docker logs --tail 100 my-appStep 2. 中に入ってプロセス確認
ログで分からなければ侵入します。
docker exec -it my-app bash
ps aux「あるはずのプロセス(php-fpmなど)が死んでいないか?」を確認。
Step 3. 設定ファイルと環境変数の確認
設定ミスは最も多い原因です。
cat /app/config/settings.yaml
env | grep DB_PASSWORD「環境変数が渡っていない」「パスワードが間違っている」ことがよくあります。
Step 4. ネットワーク疎通確認
DBに繋がらない? curlで叩いてみます。
curl http://mysql:3306
# pingが入っていない事が多いので、curlやnc(netcat)が便利ですStep 5. 最後の手段:ファイル修正と再起動(reload)
設定ファイルを修正し、サービスをリロードします。
nginx -s reload
kill -HUP 1 # メインプロセスに設定再読み込みシグナルを送るまとめ
コンテナのデバッグは、黒魔術ではありません。正しいドア(exec)から入り、基本的なLinuxコマンドで調査するだけです。
docker exec -it <コンテナ> bashで入る(attachは禁止)。bashがなければsh。- ツールがなければ
apt-getかcatで代用。 - 権限がなければ
-u root。
これだけ覚えておけば、もう「Upしているのに繋がらない」ゾンビコンテナの前で立ち尽くすことはありません。さあ、自信を持ってブラックボックスの中へ飛び込みましょう!
Dockerコンテナデバッグ手順
execコマンドを使った安全なコンテナ侵入と問題特定のための5ステップ
⏱️ Estimated time: 15 min
- 1
Step1: ステップ1:安全にコンテナに入る
コマンド:docker exec -it <コンテナ名> bash
解説:attachは使わないでください。exitした時にコンテナが止まります。bashがない場合はshを試してください。 - 2
Step2: ステップ2:プロセスの確認
コマンド:ps aux
解説:NginxやPHP、Javaなどのメインプロセスが起動しているか確認します。PID 1が期待通りのプロセスかも重要です。 - 3
Step3: ステップ3:ネットワーク接続テスト
コマンド:curl localhost:8080 または telnet mysql 3306
解説:pingがない場合が多いので、curlやtelnet、ncコマンドでポートの疎通を確認します。 - 4
Step4: ステップ4:設定とログの確認
コマンド:cat /etc/config.ini や tail -f /var/log/app.log
解説:vimがない場合はcatで中身を確認します。envコマンドで環境変数が正しく渡っているかもチェックしましょう。 - 5
Step5: ステップ5:緊急時のツールインストール
コマンド:apt-get update && apt-get install -y vim net-tools
解説:どうしても必要なツールがない場合、一時的にインストールします(コンテナ再起動で消えます)。
FAQ
docker execとdocker attachの違いは何ですか?
コンテナに入ろうとすると、executable file not found と言われます。
コンテナ内でファイル編集したいのにvimがありません。
Permission deniedでファイルが見れません。
3 min read · 公開日: 2025年12月18日 · 更新日: 2026年1月22日
関連記事
Next.js ファイルアップロード完全ガイド:S3/Qiniu Cloud 署名付き URL 直接アップロード実践

Next.js ファイルアップロード完全ガイド:S3/Qiniu Cloud 署名付き URL 直接アップロード実践
Next.js Eコマース実践:カートと Stripe 決済の完全実装ガイド

Next.js Eコマース実践:カートと Stripe 決済の完全実装ガイド
Next.js ユニットテスト実践:Jest + React Testing Library 完全設定ガイド


コメント
GitHubアカウントでログインしてコメントできます