Docker 1.1.2(最新)で、コンテナーを停止せずにコンテナーから切り離す正しい方法は何ですか?
たとえば、私が試した場合:
docker run -i -t foo /bin/bash
またはdocker attach foo
(すでに実行中のコンテナの場合)
どちらもコンテナーのターミナルに移動しますが、コンテナーのターミナルを停止せずに終了するにはどうすればよいですか?
exit
そしてCTR+C
両方のコンテナを停止します。
Docker 1.1.2(最新)で、コンテナーを停止せずにコンテナーから切り離す正しい方法は何ですか?
たとえば、私が試した場合:
docker run -i -t foo /bin/bash
またはdocker attach foo
(すでに実行中のコンテナの場合)どちらもコンテナーのターミナルに移動しますが、コンテナーのターミナルを停止せずに終了するにはどうすればよいですか?
exit
そしてCTR+C
両方のコンテナを停止します。
回答:
更新:以下で説明するようにCtrl+ p、Ctrl+ qはインタラクティブモードをデーモンモードに変更します。
まあCtrl+ C(またはCtrl+ \)はあなたをコンテナーから切り離すはずですが、メインプロセスがbashなのでコンテナーを強制終了します。
Dockerに関する少しのレッスン。コンテナは、実際のフル機能OSではありません。コンテナーを実行するとき、起動するプロセスはPID 1を取得し、init powerを想定します。そのため、そのプロセスが終了すると、新しいプロセスが起動されるまで(docker startを介して)デーモンがコンテナーを停止します(この問題に関する詳細な説明http://phusion.github.io/baseimage-docker/#intro)
常にデタッチモードで実行されるコンテナが必要な場合は、
docker run -d foo
コンテナーにsshサーバーを使用。(最も簡単な方法は、opensshのドッキングのチュートリアルhttps://docs.docker.com/engine/examples/running_ssh_service/に従うことです)
または、コンテナを再起動するだけで
docker start foo
(デフォルトでデタッチされます)
-ti -d
、で接続しdocker attach
、最初に ctrl + p 、次に ctrl + qで切断します。キーボードショートカットの1つだけを使用できると思いました。
入力Ctrl+ pその後、Ctrl+ q。対話モードをデーモンモードに切り替えるのに役立ちます。
https://docs.docker.com/v1.7/articles/basics/#running-an-interactive-shellを参照してください。
# To detach the tty without exiting the shell,
# use the escape sequence Ctrl-p + Ctrl-q
# note: This will continue to exist in a stopped state once exited (see "docker ps -a")
私はこれを掘り下げました、そして上記のすべての答えは部分的に正しいです。それはすべて、コンテナの起動方法に依存します。コンテナが起動されたとき、それは次のようになります。
-t
)-i
)^P^Q
作業を行いますが、場合にのみ、-t
および-i
コンテナを起動するために使用されます。[berto@g6]$ docker run -ti -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518
[berto@g6]$ docker attach test
# here I typed ^P^Q
read escape sequence
# i'm back to my prompt
[berto@g6]$ docker kill test; docker rm -v test
test
test
ctrl+c
機能しますが、コンテナを起動するために-t
(なしで -i
)使用された場合のみです:[berto@g6]$ docker run -t -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
018a228c96d6bf2e73cccaefcf656b02753905b9a859f32e60bdf343bcbe834d
[berto@g6]$ docker attach test
^C
[berto@g6]$
ただし、コンテナーを強制終了せずに切り離す方法があります。別のシェルが必要です。要約すると、これを別のシェルで実行すると、デタッチされてコンテナーが実行されたままになりますpkill -9 -f 'docker.*attach'
。
[berto@g6]$ docker run -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518
[berto@g6]$ docker attach test
# here I typed ^P^Q and doesn't work
^P
# ctrl+c doesn't work either
^C
# can't background either
^Z
# go to another shell and run the `pkill` command above
# i'm back to my prompt
[berto@g6]$
どうして?コンテナー自体ではなく、コンテナーに接続しているプロセスを強制終了しているためです。
kill -9
信号はしていません。プロセスは終了し、頼りになることはありません。私の推測では、他の信号はコンテナーにシャットダウンする機会を与えて-9
いますが、そうではありません。
"docker attach" container id "を実行すると、コンテナーに移動します。コンテナーを停止せずにコンテナーを終了するには、次のように入力する必要がありますCtrl+ P+Q
Error response from daemon: Container f560a0ad6806150b2775d0b6e6d5f7065a03775bae858fb4fb7df05a277976db is not running
私はアシュウィンの答えが最も正しいと考えています。私の古い答えは以下です。
docker run -dti foo bash
次に、コンテナーに入り、bashを実行します。
docker exec -ti ID_of_foo bash
sshdをインストールする必要はありません:)
docker attach
、最初のbash実行に再接続することで、より標準的なものになると思います。docker exec
ここでも機能しますが、最初のプロセスに加えて新しいbashプロセスが作成されます。もちろん、プロセスは最初のものと同じコンテキスト/環境/コンテナー内で作成されますが、それは別のものです(類似は、お気に入りのターミナルエミュレーターで新しいターミナルタブを開くことです)。
インタラクティブコンテナからのデタッチにデフォルトの方法ですCtrl+ P Ctrl+ Qが、新しいコンテナを実行しているか、使用して既存のコンテナに取り付けるとき、あなたはそれを上書きすることができ--detach-キーフラグを。
を介して接続した場合はdocker attach
、Dockerの接続プロセスを強制終了することで接続を解除できます。より良い方法はsig-proxyパラメータを使用してCtrl + Cをコンテナに渡さないようにすることです:
docker attach --sig-proxy=false [container-name]
docker run
コマンドに同じオプションを使用できます。
php:7.3-apache
--detach-keys
実行時にオプションを使用してdocker attach
、デフォルトのCTRL+ P、CTRL+ Qシーケンスをオーバーライドできます(これは常に機能するとは限りません)。
たとえば、実行docker attach --detach-keys="ctrl-a" test
してCTRL+ Aを押すと、コンテナを強制終了せずに終了します。
その他の例:
docker attach --detach-keys="ctrl-a,x" test
-押しCTRL+A
てX
から終了しますdocker attach --detach-keys="a,b,c" test
-プレスA
、そしてB
、その後、C
終了します公式ドキュメントからの抜粋:
必要に応じて、切り離し用のDockerキーシーケンスを上書きするように構成できます。これは、Dockerのデフォルトシーケンスが他のアプリケーションで使用するキーシーケンスと競合する場合に役立ちます。コンテナごとのオーバーライドとして、または構成全体の構成プロパティとして、独自の切り離しキーシーケンスを定義するには2つの方法があります。
個々のコンテナのシーケンスを上書きするに--detach-keys="<sequence>"
は、docker attachコマンドでフラグを使用します。の形式は、<sequence>
文字[a-Z]
、またはctrl-
次のいずれかと組み合わせたものです。
これらはa
、ctrl-a
、X
、またはctrl-\\
値が有効なキーシーケンスのすべての例です。すべてのコンテナーに対して異なる構成のデフォルトのキーシーケンスを構成するには、構成ファイルのセクションを参照してください。
注:これはdockerバージョン1.10以降で動作します(この回答の時点では、現在のバージョンは18.03です)