実行中のコンテナに入る - docker exec
実行中のコンテナに追加プロセスを起動するコマンド。多くは `-it` でシェルに入り、ログやファイルシステム、プロセス状態を調査するために使う。
概念図
構文
bash
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]実例
実行中の api コンテナに bash で接続
bash
docker exec -it api bashコンテナ内のプロセス一覧を一度だけ取得
bash
docker exec api ps auxroot ユーザーかつ環境変数付きで実行
bash
docker exec -e DEBUG=1 -u root api printenvコンテナに入って調査
docker exec -it CONTAINER bash は最頻出の組み合わせ。
-i で stdin をつなぎ、-t で TTY を割り当てる。
これでカーソル移動や Ctrl+C が効く対話シェルになる。
用途は、設定ファイルの確認、権限の検証、アプリが吐いたファイルの中身を見る、DNS 解決が通るか試す、などさまざま。
ただし docker exec は一時的な調査用途に限定し、永続的な変更はイメージに戻すこと。
コンテナ内で apt-get install しても次回起動では消えるし、再現性もない。
調査で得た知見は Dockerfile か compose の設定として恒久化するのが原則。
bash
docker exec -it api bash
# inside the container
ps -ef
cat /etc/nginx/nginx.conf
exitよく使うコマンド(bash / sh / apk)
ベースイメージごとに使えるシェルとパッケージマネージャが違う。
docker exec -it alpine-container bash でエラーになるのはこれが原因。
| ベース | シェル | パッケージマネージャ | デバッグツール追加例 |
|---|---|---|---|
| debian / ubuntu | bash |
apt-get |
apt-get update && apt-get install -y procps curl |
| alpine | sh(bash なし) |
apk |
apk add --no-cache procps curl |
| distroless / scratch | なし | なし | kubectl debug / docker run --pid=container:TARGET で別コンテナを隣接 |
distroless イメージは意図的にシェルを外しているので、シェル経由の調査は別コンテナを隣接させる手法に切り替える。
bash
# Alpine
docker exec -it web sh
apk add --no-cache curl
# Debian
docker exec -it web bash
apt-get update && apt-get install -y curlalpine と debian の違い
サイズ差はそのまま pull 時間、ストレージ、脆弱性スキャン対象ファイル数に影響する。
| 項目 | Alpine | Debian slim | Debian (full) |
|---|---|---|---|
| libc | musl | glibc | glibc |
| 基本ユーティリティ | BusyBox | GNU coreutils | GNU coreutils |
| イメージサイズ目安 | 約 5MB | 70〜80MB | 約 120MB |
| パッケージマネージャ | apk |
apt-get |
apt-get |
向き・不向き(用途別の判断)
- Node.js や Go の静的バイナリ中心のアプリ: Alpine が実用的
- Python アプリ: manylinux wheel が musl 上でそのまま動かずソースビルドで遅くなるため、Debian ベースを選ぶケースが多い
- Node.js のネイティブモジュール / glibc 前提の Python ホイール / TZ データ: musl 起因の互換性問題でハマりやすい
関連トピック
docker run- イメージから新しいコンテナを起動するコマンド。`-d` でバックグラウンド化、`-p` でポート公開、`-v` でボリュームマウント、`--name` で名前付けなど、日常的に使うオプションを押さえておく。 docker ps / docker logs- 実行中コンテナの一覧表示とログ確認のコマンド。`docker ps -a` で停止済みも含めて表示、`docker logs -f` で追跡、`--since` / `--tail` で範囲を絞る。 docker images / docker system prune- ローカルのイメージ一覧と、使われていないリソースの一括削除。ビルドを繰り返していると数十 GB に膨らむので、定期的に掃除する。 