Dockerコンテナへのアタッチとデタッチ
1. 概要
Dockerコンテナーを操作している間、インタラクティブモードで実行する必要があることがよくあります。 これは、ターミナルの標準の入力、出力、またはエラーストリームをコンテナにアタッチする場所です。
多くの場合、コンテナをバックグラウンドで実行することを好みます。 ただし、後で接続して出力やエラーを確認したり、セッションを切断したりすることもできます。
この短い記事では、これらを実現するためのいくつかの便利なコマンドを学習します。 また、コンテナを停止せずにセッションからデタッチするさまざまな方法についても説明します。
2. アタッチ/デタッチモードでコンテナを実行する
アタッチまたはデタッチモードでコンテナを実行する方法を見てみましょう。
2.1. デフォルトモード
デフォルトでは、Dockerはフォアグラウンドでコンテナーを実行します。
$ docker run --name test_redis -p 6379:6379 redis
これは、プロセスが終了するまでシェルプロンプトに戻ることができないことを意味します。
上記のコマンドは、標準出力( stdout )と標準エラー( stderr )ストリームを端末にリンクします。 したがって、ターミナルでコンテナのコンソール出力を確認できます。
–name オプションは、コンテナーに名前を付けます。 後で同じ名前を使用して、他のコマンドでこのコンテナを参照できます。 または、 dockerpsコマンドを実行して取得したコンテナーIDで参照することもできます。
-a オプションを使用して、接続するstdin、stdout、およびstderrから特定のストリームを選択することもできます。
$ docker run --name test_redis -a STDERR -p 6379:6379 redis
上記のコマンドは、コンテナからのエラーメッセージのみが表示されることを意味します。
2.2. インタラクティブモード
-iおよび-t オプションを一緒に使用して、インタラクティブモードでコンテナーを開始します:
$ docker run -it ubuntu /bin/bash
ここで、-iオプションは、コンテナー内のbashシェルの標準入力ストリーム( stdin )を接続し、-tオプションは疑似端末をに割り当てます。プロセス。 これにより、はターミナルからコンテナと対話できます。
2.3. 分離モード
-d オプションを使用して、デタッチモードでコンテナを実行します。
$ docker run -d --name test_redis -p 6379:6379 redis
このコマンドは、コンテナを起動し、そのIDを出力してから、シェルプロンプトに戻ります。 したがって、コンテナがバックグラウンドで実行されている間、他のタスクを続行できます。
このコンテナには、名前またはコンテナIDを使用して後で接続できます。
3. 実行中のコンテナと対話する
3.1. コマンドを実行する
executeコマンドを使用すると、すでに実行されているコンテナ内でコマンドを実行できます:
$ docker exec -it test_redis redis-cli
このコマンドは、すでに実行されているtest_redisという名前のRedisコンテナーでredis-cliセッションを開きます。 名前の代わりにコンテナIDを使用することもできます。 オプション-itは、セクション2.2で説明されているように、インタラクティブモードを有効にします。
ただし、キーに対する値のみを取得したい場合があります。
$ docker exec test_redis redis-cli get mykey
これにより、 redis-cliでgetコマンドが実行され、はキー mykey の値を返し、セッションを閉じます。
バックグラウンドでコマンドを実行することもできます。
$ docker exec -d test_redis redis-cli set anotherkey 100
ここでは、この目的のために-dを使用します。 キーanotherKeyに対して値100を設定しますが、コマンドの出力は表示しません。
3.2. セッションの添付
attachコマンドは、端末を実行中のコンテナに接続します:
$ docker attach test_redis
デフォルトでは、コマンドは標準の入力、出力、またはエラーストリームをホストシェルにバインドします。
出力メッセージとエラーメッセージのみを表示するには、 –no-stdinオプションを使用してstdinを省略できます。
$ docker attach --no-stdin test_redis
4. コンテナから切り離す
Dockerコンテナーからデタッチする方法は、その実行モードによって異なります。
4.1. デフォルトモード
CTRL-cを押すことは、セッションを終了する通常の方法です。 ただし、-dまたは-itオプションなしでコンテナーを起動した場合、CTRL-cコマンドはコンテナーから切断する代わりにコンテナーを停止します。 セッションはCTRL-c、つまり SIGINT シグナルをコンテナーに伝播し、そのメインプロセスを強制終了します。
–sig-proxy =falseを渡す動作をオーバーライドしてみましょう。
$ docker run --name test_redis --sig-proxy=false -p 6379:6379 redis
これで、 CTRL-c を押して、コンテナがバックグラウンドで実行されている間、現在のセッションのみを切り離すことができます。
4.2. インタラクティブモード
このモードでは、 CTRL-c は対話型セッションへのコマンドとして機能するため、デタッチキーとしては機能しません。 ここで、CTRL-pCTRL-qを使用してセッションを終了する必要があります。
4.3. バックグラウンドモード
この場合、セッションをアタッチするときに –sig-proxy値をオーバーライドする必要があります:
$ docker attach --sig-proxy=false test_redis
–detach-keysオプションで別のキーを定義することもできます。
$ docker attach --detach-keys="ctrl-x" test_redis
これにより、コンテナが切り離され、CTRL-xを押すとプロンプトが返されます。
5. 結論
この記事では、アタッチモードとデタッチモードの両方でDockerコンテナーを起動する方法を説明しました。
次に、アクティブなコンテナとのセッションを開始または終了するためのいくつかのコマンドを確認しました。