Dockerのiオプション、tオプションについてのメモ

Pocket

Dockerのiオプション、tオプションについてのメモ。

Docker itオプション

おもなオプション

下記はdocker execの説明だが、dtiオプションはdocker runにも当てはまる。

-d, –detach=false デタッチド・モード: コマンドをバックグラウンドで実行
-i, –interactive=false アタッチしていなくても STDIN をオープンにし続ける
-t, –tty=false 疑似ターミナル (pseudo-TTY) の割り当て

http://docs.docker.jp/engine/reference/commandline/exec.html

※ tty:teletypewriter

概要

ubuntu:latestを例に挙動を確認する。

(1) Dockerコンテナはルートプロセス(PID:1)が終了したらコンテナが終了する。
(2) docker runtオプションを付与することでPID:1のbashに擬似ttyが接続されて、プロセスが稼働し続けるので(ルートプロセスが終了しないので)コンテナは終了しない。
(3) docker runiオプションを付与することで標準入力(STDIN)が開いたままになる。

※ 例えばhttpdなどはCMDでデーモンを起動している。PID:1にデーモン割り当てられるのでtオプションを付与しなくてもコンテナは終了しない。

以下、ubuntu:latestを例にしてdocker runのオプションによる挙動の違いを確認する。

itオプションを付与しない

オプションを付与しない場合は、コンテナが直ちに終了する。

$ docker run ubuntu:latest

$ docker ps --all

# コンテナのSTATUSはExited
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS                     PORTS     NAMES
7b7ca3ef3875   ubuntu    "bash"    5 seconds ago   Exited (0) 4 seconds ago             competent_keller

tオプションを付与する

tオプションを付与した場合は、コンテナは終了しない。
(挙動を確認するためにtオプションのみを付与しているが、現実的にiオプションを付与しないで、tオプションのみを付与するユースケースは思いつかない)

# 分かりやすさのためにデタッチする
$ docker run -dt ubuntu:latest

$ docker ps --all

# コンテナのSTAUSはUp
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
e8fe0d1b6fd7   ubuntu    "bash"    27 seconds ago   Up 26 seconds             strange_shamir

参考までにデタッチをしない場合も記載する。

# デタッチしない場合は疑似ttyが立ち上がった状態になる
# iオプションを指定しないので、入力はコンテナに渡らない
$ docker run -t ubuntu:latest
root@cbfb393cff94:/# echo HELLO
// 応答がない
// 入力を受け付けないのexitやCtrl + Cなども受け付けない

iオプションを付与する

iオプションを付与する(分かりやすさのためにtオプションも付与する)。
疑似ttyが入力を受け付ける。

$ docker run -it ubuntu:latest
root@299f5cfdbbe0:/# echo 'Hello'
Hello

docker attachとdocker exec

docker attachdocker execの違いでtオプションを理解する。
ubuntu:latestを例に挙動を確認する。

$ docker run -dit ubuntu:latest
44d6eef272553820e3aac6ef900c89bc84d49e20a139e9e2b45d1ca477fc1334

docker attach

$ docker attach 44d6eef2725
root@44d6eef27255:/# ps auxf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.2  0.1   4488  3732 pts/0    Ss   06:03   0:00 bash
root         8  0.0  0.0   7056  1608 pts/0    R+   06:03   0:00 ps aux
root@44d6eef27255:/# exit
exit

上記のようにPIDが1のbashに標準入出力が接続されている。
よってexitコマンドを発行した場合は、PIDが1のプロセス(ルートプロセス)が終了するのでコンテナも終了する。

$ docker ps --all

# コンテナSTATUSはExited
CONTAINER ID   IMAGE     COMMAND   CREATED              STATUS                     PORTS     NAMES
44d6eef27255   ubuntu    "bash"    About a minute ago   Exited (0) 9 seconds ago             objective_elgamal

docker exec

$ docker exec -it 44d6eef27255 /bin/bash
root@44d6eef27255:/# ps auxf
# 標準入出力はPIDが16の/bin/bashに接続されている。
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        16  0.6  0.1   4488  3720 pts/1    Ss   06:11   0:00 /bin/bash
root        24  0.0  0.0   7056  1556 pts/1    R+   06:11   0:00  \_ ps auxf
root         1  0.0  0.1   4488  3520 pts/0    Ss+  06:10   0:00 bash
root@44d6eef27255:/# exit
exit

上記のように標準入出力はPIDが16の/bin/bashに接続される。
exitコマンドを発行した場合、PIDが16のプロセスが終了して、PIDが1のプロセス(ルートプロセス)は終了しないのでコンテナは稼働したままになる。

$ docker ps --all
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS         PORTS     NAMES
44d6eef27255   ubuntu    "bash"    10 minutes ago   Up 3 minutes             objective_elgamal

httpd

httpdはPIDが1のプロセスでhttpdデーモンが稼働する(httpd -DFOREGROUND)。
よってオプションを付与しなくてもコンテナは終了しない。

$ docker run -d httpd:latest
bb5c45b3c38671265e5e96c71aee415981b45034f7e6dd5901a5ea1b7c8a5306
$ docker ps --all
CONTAINER ID   IMAGE     COMMAND              CREATED              STATUS              PORTS     NAMES
bb5c45b3c386   httpd     "httpd-foreground"   About a minute ago   Up About a minute   80/tcp    competent_curie

docker attach

httpd:latestのPIDが1のプロセスはhttpdデーモンが稼働する。
よって以下はエラーにはならないが、bashに接続されるわけではない。

$ docker attach bb5c45b3c386

docker exec

docker execでログインする。psを見るためにprocps`をインストールする。

$ docker exec -it bb5c45b3c386 /bin/bash
root@bb5c45b3c386:/usr/local/apache2# apt -y update && apt install -y procps
.....
.....
.....
root@bb5c45b3c386:/usr/local/apache# ps auxf
ps auxf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        92  0.0  0.1   3964  3300 pts/0    Ss   06:54   0:00 /bin/bash
root       423  0.0  0.1   6696  3040 pts/0    R+   06:56   0:00  \_ ps auxf
root         1  0.0  0.2   5932  4524 ?        Ss   06:54   0:00 httpd -DFOREGROUND
www-data     8  0.0  0.1 1210608 3492 ?        Sl   06:54   0:00 httpd -DFOREGROUND
www-data     9  0.0  0.1 1210608 3560 ?        Sl   06:54   0:00 httpd -DFOREGROUND
www-data    10  0.0  0.1 1210608 3492 ?        Sl   06:54   0:00 httpd -DFOREGROUND
root@bb5c45b3c386:/usr/local/apache# exit
$ docker ps --all
CONTAINER ID   IMAGE     COMMAND              CREATED         STATUS         PORTS     NAMES
bb5c45b3c386   httpd     "httpd-foreground"   3 minutes ago   Up 3 minutes   80/tcp    youthful_rubin

Ref

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。