便利ツール

docker attach と exec の違い

docker コンテナを操作する基本コマンドで、attachexec があります。
実際に使用してもよく分からない方のために、attachexec の違いについてまとめています。

 

attach と exec の違い

attachexec も、実行中のコンテナに接続するコマンドです。

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 attachexec の違いについて理解を深めましょう。

 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 では追加で実行したコマンドが終了することになります。

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-便利ツール
-, ,