1. ホーム
  2. ドッカー

docker runコマンドの-i -t -dオプションでできること

2022-03-15 07:24:02
<パス

私が初めてdockerに出会ったとき、チュートリアルにこう書いてあったのを覚えています。 docker run -it とかいうのがよくわからなくて、この -it のオプションは半分理解されているとして、この記事では3つのオプションを分析し、私のブログの目的である、できるだけわかりやすくすることを目指します。

I. オプションの説明

公式のドキュメントです。 https://docs.docker.com/engine/reference/commandline/run/

<テーブル オプション オプションの略語 説明 -デタッチ -d コンテナをバックグラウンドで実行し、コンテナIDを表示する。 -インタラクティブ -i 接続がない場合でも、標準入力を開き続けます。一般に、-t と一緒に使用します。 -tty -t 擬似ttyを割り当てます。通常、-iと一緒に使用します。

と"-"の違いについては、こちらをご覧ください。 Linuxのプログラミング。コマンドラインオプションの一重水平線 "-" と二重水平線 "-" の違いについて。



II. it オプション

を使用します。 ubuntu:19.10 という名前の新しいマシンを作成し、実行します。 ubuntu1910 という名前のコンテナ -i オプションは、コンテナ上で標準入力インターフェイスを開くよう docker に指示します。 -t は、コンテナの標準入力インターフェースに接続する擬似 tty 端末を作成するよう docker に指示し、その後ユーザーはその端末を通じて文字を入力できるようになります。そのため docker run [OPTIONS] IMAGE [COMMAND] [ARG...] コマンドのデフォルトの COMMAND /bin/bash ということで、ユーザーの入力は bash shell が実行されます。

この例では、端末に入力されるのは exit 13 キャリッジリターンでコマンドを実行し、ターミナルを終了します。コマンドは docker run の呼び出し元でログが記録され、コンテナの metadata をコンテナ内で実行する。

[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker run --name ubuntu1910 -it ubuntu:19.10
root@cd83bc3b0d3b:/# exit 13
exit


を渡す。 docker ps -a コマンドを使用すると、コンテナを表示するために Exited (13) 35 seconds ago は書き戻されたものです。

[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker ps -a | grep ubuntu1910
cd83bc3b0d3b ubuntu:19.10 "/bin/bash" 46 seconds ago Exited (13) 35 seconds ago ubuntu1910
[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# 


のコンテナです。 metadata を /var/lib/docker/containers/containerId/ ディレクトリに配置し、ここで containerId-json.log ファイルには、ライトバックのログが記録されます。

[root@iZ2ze6ogddtzz4dzyy00xwZ cd83bc3b0d3bb76fc9fc5df326235b3554c15455891d3b3aa0921fb16796322d]# cat cd83bc3b0d3bb76fc9fc5df326235b3554c15455891d3b3aa0921fb16796322d-json.log 
{"log":"\u001b]0;root@cd83bc3b0d3b: /\u0007root@cd83bc3b0d3b:/# exit 13\r\n","stream":"stdout" ;,"time":"2020-02-08T14:35:22.509224333Z"}
{"log":"exit\r\n","stream":"stdout","time":"2020-02-08T14:35:22.509286061Z& quot;}
[root@iZ2ze6ogddtzz4dzyy00xwZ cd83bc3b0d3bb76fc9fc5df326235b3554c15455891d3b3aa0921fb16796322d]# 


iii. -d オプション

を使用します。 docker run -d という名前でバックエンドを作成し、起動します。 ubuntu1 という名前のコンテナ docker ps コマンドで実行状態のコンテナが見つからなかった場合は docker ps -a コマンドを使用して、実行されなくなったコンテナを検索します。 ubuntu1 のコンテナです。

[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker run -d --name ubuntu1 ubuntu:19.10
315cc38afc2f06abb5a2fbb075ebca16455367b2de685cf0c5ba828ab62dd5a1
[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c04afe750081 mysql:5.7 "docker-entrypoint.s..." 26 hours ago Up 26 hours 0.0.0.0:3306->3306/tcp, 33060/tcp mysql5.7
[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker ps -a | grep ubuntu1
315cc38afc2f ubuntu:19.10 "/bin/bash" 35 seconds ago Exited (0) 34 seconds ago ubuntu1
cd83bc3b0d3b ubuntu:19.10 "/bin/bash" 18 minutes ago Exited (13) 18 minutes ago ubuntu1910
[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# 


という疑念が生じるわけです。 -d は、コンテナがバックグラウンドで実行されていることを確認しています。では、なぜ私のコンテナは実行を停止したのでしょうか?

前述したように docker run [OPTIONS] IMAGE [COMMAND] [ARG...] そこには COMMAND パラメータを指定すると、コンテナは起動し COMMAND コマンドで、デフォルトは /bin/bash . これは、コンテナがバックグラウンドで正常に起動された後に COMMAND コマンドを実行した後、直接シャットダウンします。

dockerのコマンドは、以下を参照してください。 https://blog.csdn.net/claram/article/details/103301942

この原理を理解した上で、問題の真相を知るために、新しいコードを docker run -d その後、長時間プロセスに常駐するコマンドを追加することで、コンテナがシャットダウンしないようにします。

[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker run -d --name ubuntu2 ubuntu:19.10 tail -f /dev/null 
a0d3c58fc68b139f63355594dd91c2d047b84a3d56880418eedcd8fedb6307b6
[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0d3c58fc68b ubuntu:19.10 "tail -f /dev/null" 5 seconds ago Up 4 seconds ubuntu2
c04afe750081 mysql:5.7 "docker-entrypoint.s..." 26 hours ago Up 26 hours 0.0.0.0:3306->3306/tcp, 33060/tcp mysql5.7
[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# 


この記事の内容は、あくまでも私個人の意見です。もし間違っているところがあれば、遠慮なく批判や訂正をしてください、ありがとうございます。