Docker 无需停止即可从容器上分离的正确方法
在Docker 1.1.2(最新版本)中,不停止容器的正确方法是什么 例如,如果我尝试: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 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
--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