2.4 docker run -it とは?インタラクティブモードを完全解説|コンテナに入る方法

【第2章】イメージとコンテナの基本操作

「コンテナの中に入って直接操作したい」——そのために使うのが -it オプションです。docker run -it ubuntu bash とすると、まるで新しいLinuxマシンにSSHで入ったかのようなシェル環境が開きます。

この記事では -i-t がそれぞれ何をしているのかから始まり、exec -it との違い、安全な抜け方(デタッチ)まで詳しく解説します。


目次

  1. なぜ -it が必要なのか
  2. -i とは:標準入力を開き続ける
  3. -t とは:擬似TTYを割り当てる
  4. -it を組み合わせる
  5. docker run -it の使い方
  6. docker exec -it の使い方
  7. docker run -it vs docker exec -it の違い
  8. exit と Ctrl+P+Q の違い
  9. イメージごとのシェル選択
  10. シミュレータで体験する
  11. よくあるトラブルと対処法
  12. まとめ

1. なぜ -it が必要なのか

Dockerコンテナは通常「ある1つのコマンドを実行して終了する」ものです。しかしデバッグや環境調査ではコンテナの中に入って直接操作したいことがあります。

例えば次のコマンドは失敗します:

# NG: -it なしで bash を起動しようとすると即座に終了する
docker run ubuntu bash
# → bash が起動するが、入力を受け付けないため何もせず終了
# → docker ps -a で Exited (0) になっている

# OK: -it を付けると対話シェルが開く
docker run -it ubuntu bash
# → root@a1b2c3d4:/# プロンプトが表示されてシェル操作できる

-it なしで bash を起動しても、標準入力が接続されていないため bash は「何も入力がない」と判断して即座に終了してしまいます。

💡 -it は2つのオプションの組み合わせ
-it-i--interactive)と -t--tty)を短縮してまとめたものです。-ti と書いても同じ意味です。

2. -i とは:標準入力を開き続ける

-i--interactive)は、コンテナの標準入力(stdin)を開いたまま保持するオプションです。

Dockerはデフォルトで、コンテナの stdin を /dev/null(何も返さないデバイス)に接続します。これはバックグラウンドで動かすサービスには都合がよいですが、対話シェルは stdin からコマンドを読み込むため、接続がないと即座に終了してしまいます。

-i なし(デフォルト):
  ホスト端末 ─────╳────── コンテナ stdin(/dev/null)
  →「入力なし」と bash が判断 → 即終了

-i あり:
  ホスト端末 ─────────── コンテナ stdin
  → キー入力がコンテナの bash に届く → 対話可能

-i だけ付けた場合でもコマンドを入力できますが、プロンプト(root@...:/# )が表示されず、カーソルの位置や入力の可視化もされないため、実用上は -t との組み合わせが必要です。

3. -t とは:擬似TTYを割り当てる

-t--tty)は、コンテナ内に擬似TTY(Pseudo-Terminal / PTY)を割り当てるオプションです。

TTY とは何か

TTY(TeleTYpewriter)は元々テレタイプ端末を指す言葉ですが、現代では「ターミナル機器」を抽象化した Linux のインターフェースです。TTY があることで:

  • プロンプト(root@id:/# )が表示される
  • 入力したコマンドが画面にエコーバックされる
  • カーソル移動・バックスペースが機能する
  • 色付き出力(ANSI エスケープシーケンス)が有効になる
  • Ctrl+C でシグナル(SIGINT)が送れる
オプション組み合わせ 動作 プロンプト表示 主な用途
なし stdin が /dev/null。即終了 × バックグラウンドサービス
-i のみ stdin が繋がる。入力可能 ×(生の stdio) パイプによる入力(echo "cmd" | docker run -i ubuntu bash
-t のみ TTY は割り当てられるが stdin は閉じている ○(表示のみ) ほぼ使わない
-it stdin が繋がり、TTY も割り当て 対話シェル(最も一般的)

4. -it を組み合わせる

-i-t を組み合わせることで、ホストのターミナルとコンテナ内のシェルがフル機能で双方向接続されます。

-it あり:
ホスト端末
$ docker run -it ubuntu bash
 
root@a1b2c3:/# ← コンテナ内のプロンプトが表示
root@a1b2c3:/# ls        ← 入力がコンテナへ送られる
bin  dev  etc  …     ← 出力がホストに返ってくる

stdin/stdout/stderr + TTY
コンテナ(ubuntu)
PID 1: bash
  ← キー入力を受け取り、コマンドを実行
  ← 結果を stdout に出力

5. docker run -it の使い方

docker run [オプション] -it イメージ名 シェルコマンド

基本的な使用例

# Ubuntu に bash で入る
docker run -it ubuntu bash

# Alpine に sh で入る(bash がないため sh を使う)
docker run -it alpine sh

# 特定バージョンの Ubuntu
docker run -it ubuntu:22.04 bash

# コンテナ名を指定(再接続しやすくなる)
docker run -it --name sandbox ubuntu bash

# 終了後に自動削除(使い捨て環境に便利)
docker run --rm -it ubuntu bash

# ポートやボリュームを組み合わせる
docker run -it --rm -v "$(pwd)":/work -w /work ubuntu bash

コンテナ内でできること

# パッケージのインストール(Ubuntu)
root@a1b2c3:/# apt-get update && apt-get install -y curl

# ファイルシステムの確認
root@a1b2c3:/# ls /etc/
root@a1b2c3:/# cat /etc/os-release

# プロセスの確認
root@a1b2c3:/# ps aux

# ネットワークの確認
root@a1b2c3:/# ip addr show
root@a1b2c3:/# cat /etc/hosts

# 環境変数の確認
root@a1b2c3:/# env

# コンテナを抜ける
root@a1b2c3:/# exit
⚠️ exit するとコンテナが停止する
docker run -it ubuntu bash で起動した場合、bash が PID 1(メインプロセス)です。exit で bash を終了させると、PID 1 が終了してコンテナが exited 状態に移行します。--rm を付けていればそのまま削除されます(第2章 2-3 参照)。

6. docker exec -it の使い方

docker exec -it コンテナ名orID シェルコマンド

docker exec -it は、すでに実行中(running)のコンテナに後から接続するコマンドです。コンテナを起動しなおすことなく、サイドドアから中に入るイメージです。

# バックグラウンドで nginx を起動
docker run -d --name web nginx

# 実行中の nginx コンテナに bash で入る
docker exec -it web bash

# コンテナ内でファイル確認
root@a1b2c3:/# cat /etc/nginx/nginx.conf
root@a1b2c3:/# ls /var/log/nginx/

# exit しても nginx コンテナは停止しない
root@a1b2c3:/# exit
# → まだ nginx は running のまま

# Alpine ベースのコンテナには sh を使う
docker exec -it myalpine sh

# ワンライナー実行(-it なしでも可)
docker exec web nginx -t    # 設定ファイルのテスト
docker exec web env         # 環境変数の一覧
💡 exec -it はコンテナを停止させない
exec はコンテナの PID 1 とは別の新しいプロセスを起動します。そのため exit しても PID 1(nginx など)は生き続け、コンテナは running のままです。これが run -it との最大の違いです。

7. docker run -it vs docker exec -it の違い

比較項目 docker run -it docker exec -it
コンテナ 新しいコンテナを作成して入る 既存の実行中コンテナに接続する
プロセス 入力したシェルが PID 1 になる PID 1 とは別の新プロセスとして起動
exit の影響 コンテナが停止(exited)する コンテナは停止しない(running 継続)
前提条件 イメージがあれば実行できる コンテナが running 状態でないと使えない
主な用途 新しい環境をインタラクティブに試す
使い捨てデバッグ環境(–rm と組み合わせ)
動いているサービスのデバッグ
設定ファイルの確認・編集
docker run -it ubuntu bash
新コンテナ
PID 1: bash ← あなた

exit → コンテナ停止

docker exec -it web bash
既存コンテナ(web)
PID 1: nginx (動作中)
PID N: bash  ← あなた

exit → bash のみ終了、nginx は継続

8. exit と Ctrl+P+Q の違い

docker run -it で入ったコンテナから抜ける方法は2つあります:

操作 コンテナへの影響 書き込みレイヤーへの影響
exit または Ctrl+D 停止(exited)する 残る(--rm なら削除)
Ctrl+P → Ctrl+Q(デタッチ) 実行継続(running)のまま 残る

Ctrl+P+Q でデタッチする

# コンテナに入る
docker run -it --name myubuntu ubuntu bash

# コンテナ内で作業...
root@a1b2c3:/# apt-get install -y curl   # インストール中

# インストールを続けたままコンテナを抜ける
# → Ctrl+P を押した後、素早く Ctrl+Q を押す
# → "read escape sequence" と表示されてホストに戻る

# ホストに戻ってもコンテナは running のまま
$ docker ps
# CONTAINER ID   IMAGE    STATUS       NAMES
# a1b2c3d4e5f6   ubuntu   Up 2 min     myubuntu

# 再接続する
$ docker attach myubuntu    # または
$ docker exec -it myubuntu bash
💡 docker attach と docker exec -it の違い
docker attach は PID 1 の stdin/stdout に直接接続します(Ctrl+P+Q で抜ける前の状態に戻る)。docker exec -it bash は新しいシェルプロセスを追加します。attach は PID 1 が bash のときだけ使いやすく、nginx などのサービスに attach すると Ctrl+C でサービスが止まる危険があるため、通常は exec -it が推奨です。

9. イメージごとのシェル選択

イメージによって利用できるシェルが異なります。間違ったシェルを指定すると OCI runtime exec failed エラーになります。

イメージ 利用できるシェル 推奨
ubuntu / debian bash, sh, dash bash
alpine sh(ash)のみ(bash はない) sh
centos / fedora / amazonlinux bash, sh bash
nginx(Debian ベース) bash, sh bash
node / python(Debian/Alpine ベース) ベースによる(bash or sh) 不明なら sh
distroless イメージ シェルなし exec で直接バイナリを呼ぶ
# Alpine で bash を指定するとエラー
docker run -it alpine bash
# OCI runtime exec failed: ... no such file or directory

# Alpine では sh を使う
docker run -it alpine sh

# bash が入っているか確認する方法
docker run --rm alpine which bash   # 何も表示されなければ bash はない

# Alpine に bash を後からインストールして使う
docker run -it alpine sh -c "apk add bash && bash"
💡 シェルが分からないときは sh
POSIX 準拠の sh はほぼすべての Linux イメージに存在します。イメージのシェルが不明なときはまず sh を試してください。入れたら which bash で bash の有無を確認できます。

10. シミュレータで体験する

下のシミュレータで -it の動作を体験してみましょう。ホストのプロンプト(青い $)とコンテナ内のプロンプト(緑の root@id:/#)が切り替わることに注目してください。

💡 試してみよう
docker run -it ubuntu bash → プロンプトが root@.../# に変化
② コンテナ内で cat /etc/os-releaselswhoami を実行
exit → ホストに戻り、コンテナが停止することを確認(docker ps -a
docker run -d nginxdocker exec -it <ID> bashexit 後もnginxが継続することを確認
⑤ 「Ctrl+P+Q」ボタンでデタッチを試す

11. よくあるトラブルと対処法

症状 原因 対処法
コンテナが即終了する -it なしでシェルを起動した -it を追加する
bash: no such file or directory Alpine など bash がないイメージに bash を指定 sh を使う
Error: Container is not running docker exec を stopped コンテナに使った docker start してから exec
Ctrl+C でコンテナが止まる docker attach 後に Ctrl+C を押した(SIGINT がPID 1 へ送られる) attach ではなく exec -it bash で接続する
カラー表示されない・プロンプトが崩れる -t がない(TTY なし) -it を付ける。または TERM=xterm-256color を設定
CI/CDパイプラインで -t エラー CI 環境には TTY がないため -t が使えない CI では -t を除き -i のみ(またはなし)にする
⚠️ CI/CD では -t を外す
GitHub Actions などの CI 環境には擬似TTYがありません。-t を使うと the input device is not a TTY エラーが発生します。CI では -i のみか、オプションを外して使います。
docker run -i myapp ./test.sh(CI 環境用)
docker run -it myapp ./test.sh(ローカル用)

12. まとめ

コマンド 目的 exit の影響
docker run -it IMAGE bash 新コンテナを作成してシェルに入る コンテナが停止(exited)
docker run --rm -it IMAGE bash 使い捨て環境(終了時に自動削除) コンテナが自動削除
docker exec -it NAME bash 実行中コンテナにシェルで接続 コンテナは停止しない
docker attach NAME PID 1 の stdin/stdout に接続 PID 1 次第(bash なら停止)

「コンテナに入る」ベストプラクティス

  • 動いているサービスをデバッグするには docker exec -it
  • 一時的な環境を試すには docker run --rm -it
  • alpine / distroless に bash がなければ sh を使う
  • CI/CD では -t を外す
  • Ctrl+P+Q でコンテナを維持したまま抜ける
✅ 次のステップ
次の記事「2-5. デタッチモード(-d)とバックグラウンド実行」では、-d でサービスを継続起動する方法と、ログ・状態の管理方法を解説します。
2-6. ポートマッピング(-p)とボリュームマウント(-v)」では、コンテナと外部をつなぐ2つの仕組みを詳しく扱います。

参考リンク

Dockerの基礎を動画で体系的に学びませんか?

実務で使う基礎だけを3時間に凝縮。環境構築から丁寧に解説しています。

Udemy Docker入門講座 クーポン割引で講座を見る →

コメント

タイトルとURLをコピーしました