SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【Docker】コンテナ接続におけるattach と exec(番外編)

基本的なことですが、なんか見覚えがないと思ったらコマンド確認の記事で漏れていたので備忘録。

事象

osコンテナにattach接続してもコマンドを実行できない

Dockerfileでcentosのイメージにnginxをインストール。nginxをデーモン起動したコンテナを立ち上げた。

までは良かったのですが、コンテナ(centos)の中身を見ようと思いattachコマンドでコンテナに接続してみるもコマンドが打てない??

docker container attach webserver

f:id:wantanBlog:20200309225758p:plain

解決

execコマンドで接続する

知っていれば単純だし当たり前だと思いますが、このような場合には「docker container exec」コマンドを使用します。

・例

docker container exec -it webserver /bin/bash

execコマンドを使用すれば接続後、普通にコマンドが使用できます。

f:id:wantanBlog:20200309231016p:plain

もう少し詳しく見ておく

なぜattachでコマンドが実行できなかったか

そもそもなんでattachで接続しようとしたかと言えば、centosのイメージをそのままコンテナ起動したときには接続後、そのままコマンド実行できたんですね。

比較は以下の二つのコンテナです。

f:id:wantanBlog:20200309233013p:plain

一つ目の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コマンドでシェルを終了するとコンテナが停止しない


以上、詰まったところは細々確認してまとめていきましょう。