基本的なことですが、なんか見覚えがないと思ったらコマンド確認の記事で漏れていたので備忘録。
事象
osコンテナにattach接続してもコマンドを実行できない
Dockerfileでcentosのイメージにnginxをインストール。nginxをデーモン起動したコンテナを立ち上げた。
までは良かったのですが、コンテナ(centos)の中身を見ようと思いattachコマンドでコンテナに接続してみるもコマンドが打てない??
docker container attach webserver
解決
execコマンドで接続する
知っていれば単純だし当たり前だと思いますが、このような場合には「docker container exec」コマンドを使用します。
・例
docker container exec -it webserver /bin/bash
execコマンドを使用すれば接続後、普通にコマンドが使用できます。
もう少し詳しく見ておく
なぜattachでコマンドが実行できなかったか
そもそもなんでattachで接続しようとしたかと言えば、centosのイメージをそのままコンテナ起動したときには接続後、そのままコマンド実行できたんですね。
比較は以下の二つのコンテナです。
一つ目のtestosがベースイメージをそのままコンテナ起動したもので、
二つ目のwebserverがDockerfileで生成したnginxをインストールしたコンテナです。
COMMAND部分に表示されているものが「PID=1」で起動しているプロセスであり、
attachコマンドでは「PID=1」のプロセスに接続していたので、コマンドが実行できなかったのです。
webserverの起動プロセス。
PID TTY TIME CMD 1 ? 00:00:00 nginx 6 ? 00:00:00 nginx 63 pts/0 00:00:00 bash 79 pts/0 00:00:00 ps
attachで接続していたのは「PID=1」のプロセス。
execで接続しているのは「PID=63」のプロセス。
testosの起動プロセス。
PID TTY TIME CMD 1 pts/0 00:00:00 bash 14 pts/1 00:00:00 bash 27 pts/1 00:00:00 ps
attachで接続していたのは「PID=1」のプロセス。
execで接続しているのは「PID=14」のプロセス。
docker containerにおける attach と execの違い
最後に違いを確認しておきます。
docker container attach
「PID=1」で起動しているプロセスに接続する。
exitコマンドでシェルを終了するとコンテナが停止する。
docker container exec
プロセスを新たに生成して接続する。
※/bin/bash など
exitコマンドでシェルを終了するとコンテナが停止しない。
以上、詰まったところは細々確認してまとめていきましょう。