はじめに
この実験では、実行中のコンテナと対話するためにdocker container attachコマンドを使用する方法を学びます。デタッチモードでコンテナを起動し、それらにアタッチして出力を確認し、デフォルトのキーシーケンスを使用してデタッチします。
また、TTY(Teletypewriter)が有効なコンテナにアタッチする方法を探求し、Docker コンテナと対話する際の柔軟性を高めるために、デフォルトのデタッチキーシーケンスを上書きする方法を学びます。
シンプルなコマンドを実行するデタッチドコンテナを起動
このステップでは、Docker コンテナをデタッチドモードで起動する方法を学びます。コンテナがデタッチドモードで実行されると、バックグラウンドで動作し、Docker CLI はコンテナの標準入力・出力・エラーストリームにアタッチしません。これは長時間実行されるサービスやアプリケーションを実行する際に便利です。
ubuntuイメージを使用して、メッセージを表示して終了するシンプルなコマンドを実行します。まず、ubuntuイメージをローカルに用意するためにプルします。
docker pull ubuntu
次に、docker runコマンドに-dフラグを指定してデタッチドモードでコンテナを起動します。"Hello from detached container!"というメッセージを表示して終了するシンプルなechoコマンドを実行します。
docker run -d ubuntu echo "Hello from detached container!"
コマンド実行後、Docker はコンテナ ID を表示します。これはコンテナがデタッチドモードで起動されたことを示しています。docker ps -aコマンドを使用して、コンテナが実行中か(またはタスクを完了したか)を確認できます。このコマンドは終了したコンテナも含めてすべてのコンテナを表示します。
docker ps -a
起動したコンテナのエントリが表示されるはずです。STATUS列には、コンテナがまだ実行中か終了したかが表示されます。今回のコマンドは非常に短いため、docker ps -aを実行する頃にはコンテナはすでに終了している可能性が高いです。
実行中のコンテナにアタッチして出力を確認
前のステップでは、デタッチドモードでコンテナを起動しました。コンテナはシンプルなコマンドを実行してすぐに終了した可能性がありますが、それでもアタッチして出力を確認できます。docker attachコマンドを使用すると、実行中または終了したコンテナの標準入力・出力・エラーストリームに接続できます。
まず、前のステップで起動したコンテナの ID を取得します。docker ps -aコマンドを使用して、echoコマンドを実行したコンテナを探し、コンテナ ID をコピーしてください。
docker ps -a
次に、docker attachコマンドの後にコンテナ ID を指定してコンテナにアタッチします。
docker attach <container_id>
<container_id>を実際のコンテナ ID に置き換えてください。コンテナはシンプルなechoコマンドを実行して終了しているため、すぐに出力が表示されないか、出力がまだバッファリングされている場合は"Hello from detached container!"というメッセージが表示される可能性があります。attachコマンドはコンテナのストリームに接続しますが、コンテナはすでにタスクを終了しているため、接続後すぐにコマンドが終了する可能性が高いです。
実行中のコンテナにアタッチするデモンストレーションとして、数秒間実行を維持する新しいデタッチドコンテナを起動しましょう。再びubuntuイメージを使用し、sleep 10を実行します。
docker run -d ubuntu sleep 10
docker psを使用してこの新しいコンテナの ID を取得します。今回はコンテナがUp状態になっているはずです。
docker ps
この実行中のコンテナに ID を指定してアタッチします。
docker attach <new_container_id>
<new_container_id>をsleep 10を実行しているコンテナの ID に置き換えてください。コンテナの標準ストリームにアタッチされますが、sleepコマンドは出力を生成しないため何も表示されません。ターミナルは待機状態のように見えます。コンテナは 10 秒間実行された後終了します。コンテナが終了すると、attachコマンドも終了し、ターミナルプロンプトに戻ります。
デフォルトのキーシーケンスでコンテナからデタッチ
前のステップでは、実行中のコンテナにアタッチしました。コンテナにアタッチしている状態では、その標準入力・出力・エラーストリームに接続されています。コンテナを停止せずにデタッチするには、特別なキーシーケンスを使用します。デフォルトではCTRL+pに続けてCTRL+qを押します。
デタッチの練習ができるよう、より長い時間実行される新しいデタッチドコンテナを起動しましょう。ubuntuイメージを使用し、sleep 60を実行します。
docker run -d ubuntu sleep 60
docker psを使用してこの新しいコンテナの ID を取得します。
docker ps
この実行中のコンテナに ID を指定してアタッチします。
docker attach <container_id>
<container_id>をsleep 60を実行しているコンテナの ID に置き換えてください。これでコンテナにアタッチされました。コンテナを停止せずにターミナルプロンプトに戻るには、次のキーシーケンスを押します:
CTRLキーを押したままpキーを押し、両方のキーを離しますCTRLキーを押したままqキーを押し、両方のキーを離します
CTRL+pに続けてCTRL+qを押すと、ターミナルプロンプトに戻ります。コンテナはバックグラウンドで実行を継続します。docker psを使用してコンテナがまだ実行中か確認できます。
docker ps
sleep 60を実行中のコンテナがUpステータスで表示されるはずです。
TTY 有効で別のデタッチドコンテナを起動
このステップでは、別のデタッチドコンテナを起動しますが、今回はコンテナに疑似 TTY(Terminal)を割り当てます。TTY の有効化は、コンテナのシェルと対話したり、ターミナルを必要とするコマンドを実行する場合に必要となることがよくあります。
docker runコマンドを使用し、デタッチドモードの-dフラグと疑似 TTY を割り当てる-tフラグを指定します。sleep 60のようにコンテナを実行状態に保つシンプルなコマンドを実行します。
docker run -d -t ubuntu sleep 60
-tフラグは疑似 TTY を割り当てます。これは仮想ターミナルで、物理ターミナルに接続しているかのようにコンテナと対話できます。コンテナがデタッチドモード (-d) で実行されている場合でも、TTY を有効にすることは、対話型プロセスや後でコンテナにアタッチしてターミナル環境が必要な場合に重要です。
コマンドを実行すると、Docker は再びコンテナ ID を表示し、TTY 付きのデタッチドモードでコンテナが起動したことを示します。docker psを使用してコンテナが実行中か確認できます。
docker ps
新しいコンテナがUpステータスで表示されるはずです。次のステップでこのコンテナにアタッチする際に必要となるため、コンテナ ID をメモしておいてください。
TTY 有効コンテナにアタッチしデフォルトキーシーケンスでデタッチ
前のステップでは、TTY を有効化したデタッチドコンテナを起動しました。ここでは、このコンテナにアタッチし、デフォルトのキーシーケンス (CTRL+pに続けてCTRL+q) を使用したデタッチを練習します。TTY 有効のコンテナにアタッチすると、初期コマンドが対話を必要としない場合でも、対話型セッションが可能になります。
まず、前のステップで起動したsleep 60を実行中の TTY 有効コンテナの ID を取得します。
docker ps
sleep 60を実行中のubuntuコンテナの ID を確認してください。
次に、docker attachコマンドとコンテナ ID を使用してこのコンテナにアタッチします。
docker attach <container_id>
<container_id>を実際のコンテナ ID に置き換えてください。これでコンテナの標準ストリームにアタッチされ、TTY が有効なためターミナルライクなインターフェースが利用可能です。sleepコマンド自体は対話を必要としませんが、コンテナの仮想ターミナルに接続されています。
コンテナを停止せずにデタッチするには、デフォルトのデタッチキーシーケンスを使用します:
CTRLキーを押したままpキーを押し、両キーを離しますCTRLキーを押したままqキーを押し、両キーを離します
ターミナルプロンプトに戻ります。コンテナはsleep 60コマンドが完了するまでバックグラウンドで実行を継続します。docker psでコンテナが実行中か確認できます。
docker ps
sleep 60を実行中のコンテナがUpステータスで表示されるはずです。
コンテナにアタッチしデタッチキーシーケンスを上書き
この最終ステップでは、コンテナにアタッチする際にデフォルトのデタッチキーシーケンスを上書きする方法を学びます。これは、デフォルトのシーケンスが他のアプリケーションと競合する場合や、別のキーコンビネーションを好む場合に便利です。
docker attachコマンドに--detach-keysフラグを指定して、異なるキーシーケンスを設定します。--detach-keysフラグのフォーマットはsequenceで、sequenceはカンマ区切りのキーコンビネーション文字列です。例えば、ctrl-a,ctrl-dと指定すると、デタッチシーケンスはCTRL+aに続けてCTRL+dになります。
まず、TTY を有効にした新しいデタッチドコンテナを起動します。このコンテナはしばらく実行されます。
docker run -d -t ubuntu sleep 60
docker psを使用してこの新しいコンテナの ID を取得します。
docker ps
次に、このコンテナにアタッチしますが、今回は--detach-keysフラグを使用して異なるデタッチキーシーケンスを指定します。新しいシーケンスとしてctrl-a,dを使用します。これは、CTRL+aに続けてdを押すことでデタッチすることを意味します。
docker attach --detach-keys="ctrl-a,d" <container_id>
<container_id>を実際のコンテナ ID に置き換えてください。これでコンテナにアタッチされました。新しいシーケンスでデタッチするには:
CTRLキーを押したままaキーを押し、両キーを離しますdキーを押します
ターミナルプロンプトに戻ります。コンテナはバックグラウンドで実行を継続します。docker psでコンテナが実行中か確認できます。
docker ps
sleep 60を実行中のコンテナがUpステータスで表示されるはずです。
まとめ
この実験では、docker run -dコマンドを使用して Docker コンテナをデタッチドモードで起動する方法を学びました。これにより、ターミナルにアタッチせずにコンテナをバックグラウンドで実行できるようになります。また、docker attachコマンドを使用して実行中または終了したコンテナの標準ストリームに接続し、その出力を観察する練習を行いました。
さらに、デフォルトのキーシーケンス (CTRL+p CTRL+q) を使用してアタッチしたコンテナからデタッチする方法と、TTY を有効にして (-t) コンテナを起動した場合のdocker attachの動作の変化について検討しました。最後に、コンテナにアタッチする際にデフォルトのデタッチキーシーケンスを上書きする方法を学び、コンテナ操作の柔軟性を高める方法を習得しました。



