docker runの「-itオプション」とは?意味・-iと-tの違いを解説!

Dockerコンテナ内でBashを操作したいとき、Dockerコンテナを起動するときのdocker container rundocker run)コマンドに-itオプションを付けて実行します。

でもこのような疑問を思ったことないでしょうか?

  • そもそも-itとは何をしているのか?
  • -i-tは何が違うのか?

この記事では、docker container run-itオプションが何を意味するのかを解説した上で、

  1. 何も付けずにdocker run ubuntu:20.04を実行した場合
  2. -iオプションだけ付けた場合
  3. -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)オプションを付けていないので、疑似端末が割り当てられず、画面表示はとても簡素になります。そのため、普段のターミナルのような見やすい表示や操作感にはなりません。

-i(--interactive)オプションを付けた場合

-t(--tty)オプションも付けた場合

-t--tty)は疑似端末(TTY)を割り当てるオプションです。-iオプションとセットで使うことで、

  • 入力できる(-i
  • 見た目が整う(-t

という状態が成立します。以下のコマンドを実行してみましょう。

docker run -it ubuntu:20.04

疑似端末(TTY)を割り当てることで、普通のターミナルと同じように快適に操作できます。例えば、lsを実行した場合の結果を以下に示します。-iオプションのみの場合に比べると、画面表示が綺麗になっていることがわかります。

-t(--tty)オプションも付けた場合

本記事のまとめ

この記事ではdocker container rundocker run)コマンドの-itオプションについて説明しました。

Dockerの-i-tは、コンテナの「入力」と「見た目」を整えるためのとても重要なオプションです。

特に-itを組み合わせることで、普段のターミナルと同じ感覚でDockerコンテナを操作できるようになります。

この記事が、コンテナの挙動をより深く理解する助けになれば幸いです。

お読みいただきありがとうございました。

スポンサーリンク