docker コンテナを操作する基本コマンドで、attach と exec があります。
実際に使用してもよく分からない方のために、attach と exec の違いについてまとめています。
attach と exec の違い
attach も exec も、実行中のコンテナに接続するコマンドです。
attach | exec |
コンテナ内で動作しているシェルに接続 (シェルが動作していないと接続できない) |
指定のコマンド(シェル等)をコンテナ内で実行 (コンテナ内でシェルが動作している必要がない) |
exit コマンドで終了するとコンテナが停止 | exit でコマンドを終了してもコンテナは動作継続 |
docker attach
docker attach の構文は以下です。
構文
$ docker attach [オプション] <コンテナ名>
コンテナ内で実行中のシェル(PID=1)にアタッチするため、
コンテナ内でシェルが動作していないと接続できません。
例えば、以下で紹介した docker コンテナの場合で考えます。
参考
docker コンテナの紹介:「docker を使って OpenGrok を簡単に設置」
docker ps で確認すると、/scripts/start.sh がコマンドとして実行されていることが分かります。
/bin/bash 経由でスクリプトが実行されますが、attach で接続する先はスクリプトを実行しているシェルになるため、任意のコマンドを入力して操作することはできません。
コンテナ内で実行されているコマンド
user@myserver:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND
4371ba15999c scue/docker-opengrok "/scripts/start.sh"
ポイント
docker attach でコンテナに接続する場合、コンテナ内でシェルが実行されている必要がある。
docker exec
docker exec の構文は以下です。
構文
$ docker exec -it [オプション] <コンテナ名> <コマンド> [引数]
docker exec では、実行中のコンテナ内で新しいコマンドを実行します。
実行するコマンドでシェルを指定すると、そのシェル(PID=1以外)に接続することができます。
先ほどの例で、以下のコマンドを実行してみましょう。
docker exec の例
$ sudo docker exec -it opengrok /bin/bash
コマンドを実行すると、プロンプトがコンテナ内に切り替わり、各種コマンドを入力できます。
入力したコマンドをコンテナ内で実行することができます。
違いのまとめ
exec を実行した後、ps -ef を入力して docker attach と exec の違いについて理解を深めましょう。
command
root@4371ba15999c:/usr/local/tomcat# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 07:57 ? 00:00:00 /bin/bash /scripts/start.sh
root 10 1 0 07:57 ? 00:00:20 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.prope
root 2815 0 0 09:00 pts/0 00:00:00 /bin/bash
root 2820 2815 0 09:00 pts/0 00:00:00 ps -ef
PID=1 に接続するのが attach で、
追加で実行したシェル PID=2815 に接続するのが exec です。
つまり、PID=1 に接続する attach は、exit で終了するとコンテナが終了し、
exec では追加で実行したコマンドが終了することになります。