質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

2371閲覧

docker run -itのオプションについて

ttoo

総合スコア126

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

1クリップ

投稿2020/05/10 04:39

http://www.tohoho-web.com/docker/docker_run.html

docker run -it
のiとtのオプションについて

-i (--interactive) オプションは、コンテナプロセスの標準入力を開いたままにします。

-t (--tty) オプションは、コンテナプロセスに擬似TTYを割り当てます。

これらの意味が全く分からないため、より分かりやすい説明をしていただきたいです。
また、何か初心者にわかりやすいドキュメントがございましたら、教えていただきたいです。

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2020/05/10 04:44 編集

「標準入力」「tty」それぞれについてググってください。 ネット上に膨大にある解説と同じことを回答しても無駄でしかないので、その説明のなかでわからない箇所を具体的に質問されることをおすすめします。
guest

回答1

0

ベストアンサー

これらの意味が全く分からないため、より分かりやすい説明をしていただきたいです。

話は長くなりますし、後半は少し難しい内容になります。

-i (--interactive) オプションは、コンテナプロセスの標準入力を開いたままにします。

一般的に、コマンドラインからプログラムを起動すると、その標準入力ではキーボードからの入力を受け付け、その標準出力と標準エラー出力は端末に表示されます。ここで標準入力、標準出力というのはプログラムが入出力を行う際のデフォルトの入力元、出力先だと思ってください。

しかし、 Web サーバやデータベースサーバのようなデーモン型のプログラムを起動したときは、キーボードから入力を読み取ったり、端末に出力を表示されても困ります。デーモン型のプログラムはキーボードからの入力は受け取らず、出力はログファイルに吐きます。

前者をファオグラウンド起動、後者をバックグラウンド起動と呼ぶことにします。

docker はその設計思想からバックグラウンド起動がデフォルトとなっています。これに対して、-i オプションを指定するとフォアグラウンド起動になるわけです。
シェルなどのような会話的なプログラムを操作する場合はフォアグラウンド起動することになります。

-t (--tty) オプションは、コンテナプロセスに擬似TTYを割り当てます。

フォアグラウンドのプログラムの中には単純に文字列の入出力をするだけでなく、複雑なキーボード操作を受け付けるものがあります。たとえば、エディタなどは入力がバックスペースや矢印キーが場合は入力されたキーの内容を表示するのでなく、カーソルを移動したり、画面を書き換えたたりします。これを端末制御機能と呼びます。

端末制御機能を実現するためには標準入力、標準出力で表示可能な文字だけでなく、制御コードを処理する必要があります。しかし、相手が端末でなければ、それを実現することはできません。また、標準出力がファイルとかネットワークにつながっている場合は制御コードを送ってはいけない場合もあります。

そこで、端末制御機能を実現するプログラムは標準入力、標準出力が端末かどうかを調べてから端末制御機能を実現するのが常套手段となっています。これには ioctl という特殊なシステムコールが使われます。この ioctl に対して、「私は端末ですよー」と答えたり、プログラムと端末との入出力をそれとして仲介するのが擬似TTYという仕組みです。擬似TTYを挟むことで、プログラムは標準入出力を端末としてあつかい、 docker はそれをそのまま端末に受け渡すことができるわけです。

実は、この ioctl は Unix の大きな発明の一つなのです。ファイルディスクリプタという一種類のオブジェクトでファイル、ネットワーク、端末、プリンタなどのデバイスを同じように操作できる多様性(ポルモフィズム)を実装しています。オブジェクト指向が流行る前に多様性を発明していたのです。ファイルディスクリプタは相手がファイルか、ネットワークか、端末か、プリンタかに関係なく read, write, close というシステムコールが使えます。

docker を使える環境があれば、以下を試してください。

$ docker run -i --rm centos:7 /bin/tty not a tty $ docker run -it --rm centos:7 /bin/tty /dev/pts/0

このtty というプログラムは単純に ioctl で標準入力が端末がどうかを調べるプログラムです。
-t オプションがなければ、「not a tty」と表示されて、端末ではないことを認識していることがわかります。
bash や vi を -t なしで起動すると極端に動作が変わり、ほとんど使い物になりません。

で、短く言うと、フォアグラウンドプログラムを起動するときは何も考えずに -it オプションを付けるのがいいでしょう。

投稿2020/05/10 07:40

mit0223

総合スコア3401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問