環境
・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
でシェルに入りましょう!