Dockerコンテナ内でBashを操作したいとき、Dockerコンテナを起動するときのdocker container run(docker run)コマンドに-itオプションを付けて実行します。
でもこのような疑問を思ったことないでしょうか?
- そもそも
-itとは何をしているのか? -iと-tは何が違うのか?
この記事では、docker container runの-itオプションが何を意味するのかを解説した上で、
- 何も付けずに
docker run ubuntu:20.04を実行した場合 -iオプションだけ付けた場合-itを付けて実行した場合
の3つのケースでコンテナの動作がどう変わるのかを、実際の挙動を見ながらわかりやすく解説します。
-itオプションは「-i」と「-t」の指定
Dockerの-itオプションは、次の2つのオプションを組み合わせたものです。そのため、docker run -it …とdocker run -i -t …の2つは同じ動作になります。
| オプション | 意味 | 役割 |
|---|---|---|
-i--interactive | 標準入力(stdin)を閉じずに開いたままにする | こちらからキー入力を送れるようにする |
-t--tty | 疑似端末(TTY)を割り当てる | ターミナル画面(見た目)を整える |
TTYは「TeleTYpewriter」の略で、古い端末機器の名称です。Dockerにおいて-tオプションを付けるというのは、「Dockerコンテナに疑似端末を割り当てる」という意味になります。
-iオプションだけでもDockerコンテナ内のBashにコマンドを送って実行することはできます。ただし、-tオプションがないと疑似端末が割り当てられないため、表示が崩れたり、対話操作がしづらくなります。-iと-tの両方が揃うことで、初めて「普段のターミナルと同じ操作感」でコンテナの中に入れるようになります。
ここまでで-iオプションと-tオプションの役割を説明しました。では、実際の挙動がどう変わるのかをわかりやすくまとめた表をご覧ください。このあと、それぞれのオプションを付けた場合の動作を、実際の例を使いながら詳しく解説していきます。
| オプション | 動作 |
|---|---|
| 何も付けない | Dockerコンテナはすぐに終了。 |
-i | 標準入力が開いているので、コマンドが実行できる。 疑似端末が割り当てられてないので、表示が簡素。 |
-it(-i + -t) | 標準入力が開いているので、コマンドが実行できる。 疑似端末が割り当てられているので、普通のターミナルと同じように快適に操作できる。 |
何もオプションを付けずに実行する場合
まず、-iオプションも-tオプションもつけずに以下のコマンドを実行してみましょう。
docker run ubuntu:20.04オプションを何もつけずに実行すると、Dockerコンテナはすぐに終了してしまいます。docker container ls -aコマンドで確認してみると、以下に示すように、Exit(終了)の状態になっていることが確認できます。
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
76d2cf68692e ubuntu:20.04 "/bin/bash" 21 seconds ago Exited (0) 20 seconds ago youthful_boydコンテナがすぐに終了した理由
Dockerコンテナは「中で動いているプロセスが終了したらコンテナも終了する」仕様だからです。UbuntuイメージのデフォルトCMDは以下のようになっています。
CMD ["bash"]つまり、「Bashを起動しようとする」のですが、Dockerコンテナ側の標準入力が開いていない状態ですので、Bashに対して何も入力できず、すぐにBashが終了してしまいます。その結果、Dockerコンテナも終了してしまいます。
-i(--interactive)オプションを付けた場合
-i(--interactive)は、標準入力(stdin)を閉じずに開いたままにするオプションです。標準入力が開いている状態だと、ターミナルからコマンドを入力できるようになります。また、Bashが「入力を待ってくれる」のですぐに終了しなくなります。以下のコマンドを実行してみましょう。
docker run -i ubuntu:20.04別のターミナルでdocker container ls -aコマンドで確認してみると、以下に示すように、Up(起動中)の状態になっていることが確認できます。標準入力が開いたままのため、Bashが終了せず、その結果Dockerコンテナも終了しないからです。
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
74596627e601 ubuntu:20.04 "/bin/bash" 8 seconds ago Up 7 seconds competent_northcuttこの状態では、Bashコマンドを実行できるようになっているので、実際にBashコマンドを入力してみましょう。例えば、lsを実行するとbinとかbootとかlinuxでよくあるディレクトリの一覧が表示されています。ただし、-t(--tty)オプションを付けていないので、疑似端末が割り当てられず、画面表示はとても簡素になります。そのため、普段のターミナルのような見やすい表示や操作感にはなりません。

-t(--tty)オプションも付けた場合
-t(--tty)は疑似端末(TTY)を割り当てるオプションです。-iオプションとセットで使うことで、
- 入力できる(
-i) - 見た目が整う(
-t)
という状態が成立します。以下のコマンドを実行してみましょう。
docker run -it ubuntu:20.04疑似端末(TTY)を割り当てることで、普通のターミナルと同じように快適に操作できます。例えば、lsを実行した場合の結果を以下に示します。-iオプションのみの場合に比べると、画面表示が綺麗になっていることがわかります。

本記事のまとめ
この記事ではdocker container run(docker run)コマンドの-itオプションについて説明しました。
Dockerの-iと-tは、コンテナの「入力」と「見た目」を整えるためのとても重要なオプションです。
特に-itを組み合わせることで、普段のターミナルと同じ感覚でDockerコンテナを操作できるようになります。
この記事が、コンテナの挙動をより深く理解する助けになれば幸いです。
お読みいただきありがとうございました。