目次:
実行中のDockerコンテナーに接続すると、コンテナー内で何が起こっているかを確認したい場合に役立ちます。 Dockerコンテナーが期待どおりに機能しない場合は、コンテナーにアタッチするか、コンテナーにシェルを取得して
ps
や
top
などのコマンドを実行します。 コンテナを入力して、新しいパッケージをインストールし、そこから新しいDockerイメージを構築することもできます。
このチュートリアルでは、コンテナのメイン実行プロセスにアタッチする方法と、実行中のコンテナにシェルを取得する方法について説明します。
コンテナに接続する
コンテナで複数のプロセスを実行することは可能ですが、ほとんどのdockerコンテナは単一のプロセスのみを実行しています。 コンテナの起動時に実行されるコマンドは、
ENTRYPOINT
および/または
RUN
命令を使用して指定されます。
docker attach
コマンドを使用すると、実行中のコンテナに端末を接続できます。 これは、標準出力に書き込まれている内容をリアルタイムで確認したい場合や、プロセスを対話式に制御したい場合に便利です。
attach
コマンドの動作を理解するために、公式のNginxイメージを使用して、新しい分離されたNginxコンテナーを実行してみましょう。
docker container run --name my_nginx -d -p 8080:80 nginx
-p 8080:80
オプションは、コンテナのポート8080をホストマシンのポート80にバインドするようにDockerに指示します。
コンテナをリストして、「my_nginx」コンテナが実行されていることを確認します。
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8e1c4974a8d8 nginx "nginx -g 'daemon of…" 3 minutes ago Up 2 seconds 0.0.0.0:8080->80/tcp my_nginx
コンテナのIDまたは名前を使用してコンテナに接続します。
docker container attach my_nginx
コンテナの実行時に実行されるnginxイメージのデフォルトコマンドは
CMD
設定されます。
attach
コマンドを実行すると、端末は
nginx
プロセスに接続します。
ブラウザで
127.0.0.1:8080
を開くと、nginxプロセスの出力をリアルタイムで見ることができます。
192.168.33.1 - - "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-" 192.168.33.1 - - "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.33.71:8080/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-"
コンテナログにアクセスするには、
docker logs
コマンドを使用することをお勧めします。
コンテナを停止せずにデタッチするには、
CTRL-p
CTRL-q
キーの組み合わせを使用します。
CTRL-c
押すと、コンテナが停止します。
接続している実行中のプロセスが入力を受け入れる場合、指示を送信できます。
コンテナーへのシェルを取得する
docker exec
コマンドを使用すると、実行中のコンテナー内でコマンドを実行できます。
exec
コマンドがどのように機能し、どのように使用してコンテナシェルに入ることができるかを確認するには、最初に新しいコンテナを起動します。 公式のMySQLイメージを使用します。
docker container run --name my_mysql -d mysql
これにより、「my_mysql」という名前のコンテナが作成されます。
コンテナ内でコマンドを実行するには、次のコマンドを実行します。
docker container exec -it my_mysql ls /var
-i
オプションはインタラクティブを表し、
-t
はDockerに疑似TTYデバイスを割り当てるように指示します。
ls
コマンドは、コンテナの
/var
ディレクトリ内のすべてのファイルとディレクトリをリストします。
backups cache lib local lock log mail opt run spool tmp
コンテナにシェルを取得する、つまり、コンテナの内部に入るには、シェルバイナリを実行して新しいシェルセッションを開始します。
sh
、
bash
、またはイメージに含まれている他のシェルを使用できます。
以下のコマンドは、コンテナ内に新しいBashセッションを作成します。
docker container exec -it my_mysql /bin/bash
コマンドプロンプトが変わり、コンテナシェルで作業していることが示されます。
ここから、他のLinuxサーバーで実行するのと同じ方法でコマンドを実行できます。 たとえば、現在の環境変数のリストを取得するには、
env
ます。
env
出力は次のようになります。
HOSTNAME=e0214d97e0fe MYSQL_ROOT_PASSWORD=my-secret-pw PWD=/ HOME=/root MYSQL_MAJOR=8.0 GOSU_VERSION=1.7 MYSQL_VERSION=8.0.17-1debian9 TERM=xterm SHLVL=1 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin _=/usr/bin/env
結論
docker exec
および
docker attach
コマンドを使用すると、実行中のコンテナーに接続できます。 コンテナへの対話型シェルを取得するには、
exec
コマンドを使用して新しいシェルセッションを開始します。
attach
コマンドは、実行中のコンテナに端末を接続します。