コンテナーを停止せずに切り離す正しい方法


313

Docker 1.1.2(最新)で、コンテナーを停止せずにコンテナーから切り離す正しい方法は何ですか?

たとえば、私が試した場合:

  • docker run -i -t foo /bin/bash または
  • docker attach foo (すでに実行中のコンテナの場合)

どちらもコンテナーのターミナルに移動しますが、コンテナーのターミナルを停止せずに終了するにはどうすればよいですか?

exitそしてCTR+C両方のコンテナを停止します。


「コンテナー」は、プロセスが実行できる制限された名前空間(プロセス名前空間、ファイルシステム名前空間など)のセットです。名前空間内にプロセスがない場合、その名前空間は本当に存在しますか?これは、カーネル応答クロック割り込み&cがある仮想マシンのようなものではありません。とにかく。
Charles Duffy

回答:


166

更新:以下で説明するようにCtrl+ pCtrl+ 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

(デフォルトでデタッチされます)


3
baseimage-dockerの場合は+1。Dockerの難しい部分についてのアドバイスが記載されたテンプレートがあることを知るのは素晴らしいことです。
mtmacdonald 14

sshは厳密には必要ではないことに注意してください:blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker
エイドリアンMouat

1
-dモードでの包含の実行は非常に役に立ちました。また、Dockerfileを介してsshを開始するリンクは、私の人生を楽にしてくれました。
Ravi

56
Ctrl-p、Ctrl-qを使用して切り離します。この回答のアドバイスはコンテナを殺すでしょう。
taranaki 2017

4
これは私のために働きました(以下の答えから取得):で開始し-ti -d、で接続しdocker attach最初に ctrl + p 、次に ctrl + qで切断します。キーボードショートカットの1つだけを使用できると思いました。
CGFoX 2018

526

入力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")

4
(接続されたWekanコンテナーを終了しようとする)では機能しないようです。
danger89

7
このキーの組み合わせを正確に思い出せなかったので、何度もこのページにアクセスしました。:-D
Thamme Gowda 2016

10
@ danger89 ctrl-p、ctrl-qは、コンテナをインタラクティブモード(-it)で起動した場合にのみ機能します。デーモンモード(-d)で起動してアタッチした場合は、終了するだけでバックグラウンドで実行できます。
Riscie 2016年

1
@SlimShadyは、Ctrl + Pを押してからCtrl + Qを押して終了します。どちらかではなく、両方の順序で終了します。
Mohyaddin Alaoddin

160

私はこれを掘り下げました、そして上記のすべての答えは部分的に正しいです。それはすべて、コンテナの起動方法に依存します。コンテナが起動されたとき、それは次のようになります。

  • TTYが割り当てられました(-t
  • stdinは開いたままにしました(-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]$    

デタッチする3番目の方法

ただし、コンテナーを強制終了せずに切り離す方法があります。別のシェルが必要です。要約すると、これを別のシェルで実行すると、デタッチされてコンテナーが実行されたままになります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]$

どうして?コンテナー自体ではなく、コンテナーに接続しているプロセスを強制終了しているためです。


2
第三の方法は私のために働きます。ありがとう。複数のインスタンスにアタッチしていて、1つのインスタンスからのみデタッチしたい場合。特定のプロセスを強制終了できます:ps -ef | grep attach-> get pid。その後、kill -9 <pid>
phanhuy152

ドッカーのアタッチ後にpkillが私のために機能した唯一のもの
sm4rk0

なぜ-9が必要なのですか。-9を使用しないと、コンテナーがシャットダウンすることに気付きました。
アンジェロ

その他の信号は、信号です。彼らはプロセスにどのタイプの信号を伝え、行動して何かをする機会を与えます。kill -9信号はしていません。プロセスは終了し、頼りになることはありません。私の推測では、他の信号はコンテナーにシャットダウンする機会を与えて-9いますが、そうではありません。
ベルト

1
これはとても役に立ちました。ありがとう!
Evan Zamir

40

"docker attach" container id "を実行すると、コンテナーに移動します。コンテナーを停止せずにコンテナーを終了するには、次のように入力する必要がありますCtrl+ P+Q


6
Ctrl + PとCtrl + Qの方がよい
sib10

4
Ctrl + P、Q(Ctrlを押したまま);)
dimpiax

それは私を返します:Error response from daemon: Container f560a0ad6806150b2775d0b6e6d5f7065a03775bae858fb4fb7df05a277976db is not running
Webwoman

31

私はアシュウィンの答えが最も正しいと考えています。私の古い答えは以下です。


次のようにコンテナを実行するオプションをここに追加したいと思います

docker run -dti foo bash

次に、コンテナーに入り、bashを実行します。

docker exec -ti ID_of_foo bash

sshdをインストールする必要はありません:)


2番目のコマンドでは、fooをfooのコンテナーIDに置き換える必要があると思います
Nehal J Wani

このコンテキストではdocker attach、最初のbash実行に再接続することで、より標準的なものになると思います。docker execここでも機能しますが、最初のプロセスに加えて新しいbashプロセスが作成されます。もちろん、プロセスは最初のものと同じコンテキスト/環境/コンテナー内で作成されますが、それは別のものです(類似は、お気に入りのターミナルエミュレーターで新しいターミナルタブを開くことです)。
thiagowfx 2017

20

インタラクティブコンテナからのデタッチにデフォルトの方法ですCtrl+ P Ctrl+ Qが、新しいコンテナを実行しているか、使用して既存のコンテナに取り付けるとき、あなたはそれを上書きすることができ--detach-キーフラグを


16

を介して接続した場合はdocker attach、Dockerの接続プロセスを強制終了することで接続を解除できます。より良い方法はsig-proxyパラメータを使用してCtrl + Cをコンテナに渡さないようにすることです:

docker attach --sig-proxy=false [container-name]

docker runコマンドに同じオプションを使用できます。


6
けれども--sigプロキシ= falseを極めて有用である、それが指定されなかったため、すでに付コンテナは機能しません。問題は、接続後、「Docker接続プロセスの強制終了」など、プロセスを強制終了せずに切り離す方法がないようです。Cp、Cqはアタッチされたコンテナーでは機能せず、インタラクティブなコンテナー(質問が使用するような)でのみ機能します。
taranaki 2017

1
これは、@ taranakiのコメントを含む、受け入れられた回答であるはずです。Ctrl+ P、Qは機能しませんphp:7.3-apache
MKaama

10

コンテナー内から実行されているプロセスの出力を表示するだけの場合は、単純なを実行できますdocker container logs -f <container id>

-fコンテナの出力になるようにフラグがそれを作るfollowedとリアルタイムで更新します。デバッグまたは監視に非常に役立ちます。


8

--detach-keys実行時にオプションを使用してdocker attach、デフォルトのCTRL+ PCTRL+ Qシーケンスをオーバーライドできます(これは常に機能するとは限りません)。

たとえば、実行docker attach --detach-keys="ctrl-a" testしてCTRL+ Aを押すと、コンテナを強制終了せずに終了します。

その他の例:

  • docker attach --detach-keys="ctrl-a,x" test-押しCTRL+AXから終了します
  • docker attach --detach-keys="a,b,c" test-プレスA、そしてB、その後、C終了します

公式ドキュメントからの抜粋:

必要に応じて、切り離し用のDockerキーシーケンスを上書きするように構成できます。これは、Dockerのデフォルトシーケンスが他のアプリケーションで使用するキーシーケンスと競合する場合に役立ちます。コンテナごとのオーバーライドとして、または構成全体の構成プロパティとして、独自の切り離しキーシーケンスを定義するには2つの方法があります。

個々のコンテナのシーケンスを上書きするに--detach-keys="<sequence>"は、docker attachコマンドでフラグを使用します。の形式は、<sequence>文字[a-Z]、またはctrl-次のいずれかと組み合わせたものです。

  • az(単一の小文字の英字)
  • @ (アットマーク)
  • [(左括弧)
  • \(2つのバックスラッシュ)
  • _(アンダースコア)
  • ^(キャレット)

これらはactrl-aX、またはctrl-\\値が有効なキーシーケンスのすべての例です。すべてのコンテナーに対して異なる構成のデフォルトのキーシーケンスを構成するには、構成ファイルのセクションを参照してください。

注:これはdockerバージョン1.10以降で動作します(この回答の時点では、現在のバージョンは18.03です)


0

古い投稿ですが、終了してから再起動します...問題は、Windowsマシンを使用している場合ですCtrl pまたはCtrl Pが印刷に関連付けられています...開始時にコンテナーを終了しても、何も問題ありません

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.