###環境
・windows 10
・Docker version 19.03.5
#目的とゴール
・attachとexecの違いが分かるようになる
・起動中のコンテナのシェルに入れるようになる
#attachとexecの違い
###attach
稼働中のコンテナに入るコマンド。
コンテナで実行中のプロセスが開始される。
つまり、docker ps
で表示されるCOMMAND
のコマンドが実行される。
###exec
現在稼働しているコンテナで新たなプロセスを開始できるコマンド。
シェルに入りたい場合は下記コマンドを実行する。
docker exec -it XXXXXXXXXX /bin/bash
つまり稼働中のシェルに入りたい場合は、
①docker psでCOMMANDが/bin/bash
の場合
②それ以外の場合
の2パターンに分かれることになります。
#パターン1:docker psでCOMMANDが/bin/bashの場合
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
72a12e05690c ubuntu "/bin/bash" 29 hours ago Up 8 seconds hungry_bassi
実行中のプロセスは/bin/bash
となります。
こういう時はattach
してあげればシェルに入れます。
> docker attach 72a12e05690c
root@72a12e05690c:/#
ちなみにSTATUSがExited
の場合は、docker start -ai XXXXXXXX
で入れますね。
attachはあくまで稼働中のコンテナのプロセスに入るものであって、止まっているものについては再度スタートしてあげる必要があります。
#パターン2:それ以外の場合
docker psでCOMMANDが/bin/bash
以外の場合はどうでしょうか。
>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
205974b714d2 httpd "httpd-foreground" 20 hours ago Up 5 seconds 0.0.0.0:80->80/tcp nostalgic_maxwell
この場合、attachしてもダメです。
稼働中のコンテナのコマンドは"httpd-foreground"
であって、シェルではないからです。
こういう時はexec
コマンドを使って新たにプロセスを開始します。
/bin/bashを指定してあげるわけです!
>docker exec -it 205974b714d2 /bin/bash
#おまけ:稼働中"ではない"コンテナのシェルに入るには
###パターン1 そもそもコンテナがない場合
docker run -it 【コンテナID】/bin/bash
/bin/bash
を指定して、イメージから新たに立ち上げてあげればいいですね。
###パターン2 コンテナがあるが、Exitedの場合
docker start -ai 【コンテナID】
スタートしてあげる必要がありますね。
もちろんCOMMAND
が/bin/bash
であることが前提となります。
COMMAND
が/bin/bash
以外の場合には、一旦スタートしてその後
docker exec -it XXXXXXXXXX /bin/bash
でシェルに入りましょう!