Dockerのiオプション、tオプションについてのメモ。
下記はdocker exec
の説明だが、d
、t
、i
オプションは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 run
でt
オプションを付与することでPID:1のbashに擬似ttyが接続されて、プロセスが稼働し続けるので(ルートプロセスが終了しないので)コンテナは終了しない。
(3) docker run
でi
オプションを付与することで標準入力(STDIN)が開いたままになる。
※ 例えばhttpdなどはCMDでデーモンを起動している。PID:1にデーモン割り当てられるのでt
オプションを付与しなくてもコンテナは終了しない。
以下、ubuntu:latest
を例にしてdocker run
のオプションによる挙動の違いを確認する。
オプションを付与しない場合は、コンテナが直ちに終了する。
$ 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オプションのみを付与しているが、現実的に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
オプションを付与する(分かりやすさのためにt
オプションも付与する)。
疑似ttyが入力を受け付ける。
$ docker run -it ubuntu:latest
root@299f5cfdbbe0:/# echo 'Hello'
Hello
docker attach
とdocker exec
の違いでtオプションを理解する。
ubuntu:latest
を例に挙動を確認する。
$ docker run -dit ubuntu:latest
44d6eef272553820e3aac6ef900c89bc84d49e20a139e9e2b45d1ca477fc1334
$ 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 -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は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
httpd:latestのPIDが1のプロセスはhttpdデーモンが稼働する。
よって以下はエラーにはならないが、bashに接続されるわけではない。
$ docker attach bb5c45b3c386
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
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。