Docker 无需停止即可从容器上分离的正确方法

Docker 无需停止即可从容器上分离的正确方法,docker,Docker,在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 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的一课。 容器不是真正的全功能操作系统。当您运行一个容器时,您启动的进程采用PID 1并假定init power。因此,当该进程终止时,守护进程将停止容器,直到新进程启动(通过docker start)(关于此问题的更多解释)

如果您想要一个始终以分离模式运行的容器,我建议您使用

docker run -d foo
使用容器上的ssh服务器。(最简单的方法是遵循dockerizing openssh教程)

或者您可以通过以下方式重新启动您的容器:

docker start foo
(默认情况下将分离)

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


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

docker run -dti foo bash
然后,您可以输入容器并使用运行bash

docker exec -ti ID_of_foo bash
无需安装sshd:)

如果您使用“docker attach”容器id,则可以进入容器。
要退出容器而不停止容器,您需要输入Ctrl+P+Q

从交互式容器分离的默认方式是Ctrl+P Ctrl+Q,但您可以在运行新容器或使用附加到现有容器时覆盖它。

尝试Ctrl+P,Ctrl+Q将交互式模式转为守护程序

如果这不起作用,并且您通过
docker attach
进行了连接,您可以通过终止
docker attach
进程来分离

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

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

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

我深入研究了这一点,上面的所有答案部分正确。这完全取决于容器的启动方式。当容器启动时,它归结为以下几点:

  • 是否分配了TTY(
    -t
  • stdin是否保持打开状态(
    -i
^P^Q
确实有效,但仅当使用
-t
-i
启动容器时:
ctrl+c
确实有效,但仅当使用
-t
(不含
-i
)启动容器时: 分离的第三种方法 不过,有一种方法可以在不终止容器的情况下分离;您需要另一个shell。总之,在另一个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+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 key=“a,b,c”test
    -按
    a
    ,然后按
    b
    ,然后按
    c
    退出
官方文件摘录:

如果需要,可以为分离配置重写Docker密钥序列。如果Docker默认序列与用于其他应用程序的密钥序列冲突,这将非常有用。有两种方法可以定义您自己的分离密钥序列,即每个容器重写或整个配置上的配置属性

要覆盖单个容器的顺序,请在docker attach命令中使用
--detach keys=“
标志。
的格式可以是字母
[a-Z]
,也可以是
ctrl-
与以下任何一种组合:

  • a-z(单个小写字母字符)
  • @(签名处)
  • [(左括号)
  • \(两条后斜线)
  • _(下划线)
  • ^(插入符号)
这些
a
ctrl-a
X
ctrl-\\\
值都是有效键序列的示例。要为所有容器配置不同的配置默认键序列,请参阅文件部分


注意:docker版本1.10+(在回答此问题时,当前版本为18.03)之后,此功能就可以使用了。

如果您只想查看从容器中运行的进程的输出,可以执行一个简单的
docker容器日志-f


-f
标志使容器的输出可以
跟踪
并实时更新。这对于调试或监视非常有用。

旧帖子,但只需退出,然后重新启动它…问题是如果您在windows机器上,Ctrl p或Ctrl p绑定到打印…退出启动容器不应urt anything

您可以通过发送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,你可以用

[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]$    
[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]$
user   1234  0.3  0.6 1357948 54684 pts/2   Sl+  15:09   0:00 docker run -it some/container
docker run -d -i -t f63181f19b2f /bin/bash
docker attach  b1a0873a8647
docker attach --detach-keys="ctrl-s" b1a0873a8647