在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:)

其他回答

为了防止有日志,您应该使用-d标志在分离模式下运行

docker run -d <your_command>

如果你已经卡住了,你可以在你的终端上打开一个新的窗口/标签,然后关闭第一个。它不会停止正在运行的作业的进程

在Docker容器中至少必须运行一个进程,然后只有容器将运行Docker映像(ubuntu,httd..等等,不管它是什么)在后台没有退出

例如,在ubuntu docker image中,

要创建一个带有分离模式的新容器(至少在进程上运行后台),

docker run -d -i -t f63181f19b2f /bin/bash

它将为这个映像(ubuntu)创建一个id为f63181f19b2f的新包含。容器将以分离模式运行(在后台运行),同时一个小进程tty bash shell将在后台运行。因此,容器将继续运行,直到bash shell进程被杀死。

若要附加到运行的后台容器,请使用

docker attach  b1a0873a8647

如果您想从容器中分离而不退出(不杀死bash shell), 默认情况下,您可以使用ctrl-p,q。它将从容器中出来而不退出容器(运行后台。这意味着不杀死bash shell)。

您可以在附加到容器时传递自定义命令,

docker attach --detach-keys="ctrl-s" b1a0873a8647

这一次,ctrl-p,q转义序列不起作用。相反,ctrl-s将用于从容器中退出。您可以传递任何键,例如,(ctrl-*)

尝试按CTRL+P,CTRL+Q将交互模式转换为守护模式。

如果这不起作用,你通过docker attach附加,你可以通过杀死docker attach进程来分离。

更好的方法是使用sig-proxy参数来避免将CTRL+C传递给容器:

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

同样的选项可用于docker run命令。

旧帖子,但只是退出,然后重新开始…问题是,如果你是在windows机器上,Ctrl p或Ctrl p绑定打印…退出启动容器应该不会造成任何伤害

更新:如下所述,回答Ctrl+p, Ctrl+q现在将交互模式转变为守护模式。


好吧,Ctrl+C(或Ctrl+\)应该从容器分离,但它会杀死容器,因为你的主进程是一个bash。

关于docker的一个小教训。 容器并不是一个真正的全功能操作系统。当你运行一个容器时,你启动的进程取PID 1并假设init功率。因此,当该进程终止时,守护进程将停止容器,直到启动一个新进程(通过docker start)(关于此事的更多解释http://phusion.github.io/baseimage-docker/#intro)

如果你想要一个容器一直以分离模式运行,我建议你使用

docker run -d foo

使用容器上的ssh服务器。(最简单的方法是使用dockerizing openssh教程https://docs.docker.com/engine/examples/running_ssh_service/)

或者你可以通过

docker start foo

(默认情况下会被分离)