正确的方法从容器分离而不停止它

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

例如,如果我试着:

  • docker run -i -t foo /bin/bash
  • docker attach foo(用于已经运行的容器)

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

exitCTR+C都停止容器。

394573 次浏览

更新:如下所述,Ctrl+pCtrl+现在将交互模式转换为守护模式。


好吧,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

(默认情况下会被分离)

输入Ctrl+p,然后Ctrl+。它将帮助您将交互模式转换为守护进程模式。

看到https://docs.docker.com/engine/reference/commandline/cli/#default-key-sequence-to-detach-from-containers:

一旦附加到容器,用户将使用using CTRL-p CTRL-q键序列从容器中分离并让它运行。这个分离键序列可以使用detachKeys属性自定义。[…]

我认为Ashwin的答案是最正确的,我的旧答案如下。
我想在这里添加另一个选项,即按如下方式运行容器

docker run -dti foo bash

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

docker exec -ti ID_of_foo bash

不需要安装sshd:)

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

从交互式容器分离的默认方法是Ctrl+P Ctrl+,但你可以在运行新容器或使用——detach-keys标志附加到现有容器时覆盖它。

尝试CTRL+PCTRL+将交互模式转换为守护模式。

如果这不起作用并且你通过docker attach附加,你可以通过终止docker attach进程分离。

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

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

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

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

  • 已分配TTY (-t)
  • (-i)

仅当使用-t-i启动容器时才使用^P^Q 工作,但是:

[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

当使用-t (没有 -i)启动容器时,才使用ctrl+c 工作,但是:

[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]$

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

当你运行docker attach时,你可以使用--detach-keys选项来覆盖默认的CTRL+PCTRL+ 序列(这并不总是有效)。

例如,当你运行docker attach --detach-keys="ctrl-a" test并按CTRL+一个时,你将退出容器,而不会杀死它。

其他的例子:

  • docker attach --detach-keys="ctrl-a,x" test -按CTRL+A,然后按X退出
  • docker attach --detach-keys="a,b,c" test -按A,然后按B,然后按C退出

官方文件摘录:

如果你愿意,你可以为分离配置一个覆盖Docker密钥序列。如果Docker默认序列与用于其他应用程序的密钥序列冲突,这是有用的。有两种方法定义自己的分离键序列,作为每个容器的覆盖或作为整个配置上的配置属性。

要覆盖单个容器的序列,可以使用--detach-keys="<sequence>"标志和docker attach命令。<sequence>的格式可以是一个字母[a-Z],也可以是ctrl-与以下任意值的组合:

  • a-z(一个小写字母)
  • @(@号)
  • [(左括号)
  • \(两个反斜杠)
  • _(下划线)
  • ^(脱字符号)

这些actrl-aXctrl-\\值都是有效键序列的示例。要为所有容器配置不同的配置默认密钥序列,请参见配置文件部分。

注意:从docker版本1.10+开始工作(在回答这个问题时,当前版本是18.03)

如果你只想看到在容器内运行的进程的输出,你可以做一个简单的docker container logs -f <container id>

-f标志使得容器的输出是followed并实时更新。对于调试或监视非常有用。

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

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

docker run -it 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,你可以“detach"它与

kill -9 1234

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

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

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

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

docker run -d <your_command>

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