在Docker 1.1.2(最新版本)中,从容器中分离而不停止容器的正确方法是什么?

例如,如果我试着:

Docker运行-i -t foo /bin/bash或 Docker附加foo(用于已经运行的容器)

两者都把我带到集装箱中的一个终端,我如何在不停止它的情况下退出集装箱的终端?

exit和CTR+C都停止容器。


当前回答

我认为Ashwin的答案是最正确的,我以前的答案如下。 我想在这里添加另一个选项,即如下所示运行容器

docker run -dti foo bash

然后可以进入容器并运行bash

docker exec -ti ID_of_foo bash

不需要安装sshd:)

其他回答

我认为Ashwin的答案是最正确的,我以前的答案如下。 我想在这里添加另一个选项,即如下所示运行容器

docker run -dti foo bash

然后可以进入容器并运行bash

docker exec -ti ID_of_foo bash

不需要安装sshd:)

如果你在windows上使用docker,你可以使用组合'CTRL + D'

如果你使用“docker attach”container id,你就进入了容器。 要在不停止容器的情况下退出容器,需要输入Ctrl+P+Q

你可以通过发送SEGKILL来杀死docker cli进程。如果容器以

Docker运行- some/container

你可以得到它的pid

Ps -aux | grep docker

user   1234  0.3  0.6 1357948 54684 pts/2   Sl+  15:09   0:00 docker run -it some/container

假设它是1234,你可以用它“分离”

杀死-9 1234

这是一个hack,但它的工作!

我深入研究了这个问题,上面所有的答案都部分正确。这完全取决于容器是如何启动的。当容器启动时,可以归结为:

分配了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]$    

第三种方法

但是有一种方法可以在不杀死容器的情况下分离;你需要另一个外壳。总而言之,在另一个shell中运行这个命令会分离并让容器运行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]$

为什么?因为您正在杀死连接到容器的进程,而不是容器本身。