在Docker 1.1.2(最新版)中,从容器分离而不停止容器的正确方法是什么?
因此,例如,如果我尝试:
docker run -i -t foo /bin/bash
要么docker attach foo
(对于已经运行的容器)
两者都将我带到集装箱中的码头,如何在不停止的情况下退出集装箱的码头?
exit
并且CTR+C
都停止了容器。
在Docker 1.1.2(最新版)中,从容器分离而不停止容器的正确方法是什么?
因此,例如,如果我尝试:
docker run -i -t foo /bin/bash
要么docker attach foo
(对于已经运行的容器)两者都将我带到集装箱中的码头,如何在不停止的情况下退出集装箱的码头?
exit
并且CTR+C
都停止了容器。
Answers:
更新:如下面的答案中所述,Ctrl+ p,Ctrl+ q现在将交互方式转换为守护程序方式。
那么Ctrl+ C(或Ctrl+ \)应分开你从容器中,但它会杀死容器,因为你的主要过程是一个bash。
关于Docker的一些课程。容器不是真正的全功能操作系统。运行容器时,启动的过程将使用PID 1并假定具有初始化电源。因此,当该进程终止时,守护进程将停止容器,直到启动一个新进程(通过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
(默认情况下它将被分离)
-ti -d
,然后用连接docker attach
,然后用分离第一 Ctrl + P键,然后按Ctrl + Q。我以为,我只能使用一种键盘快捷键。
键入Ctrl+ p然后Ctrl+ q。它将帮助您将交互模式转换为守护程序模式。
请参阅https://docs.docker.com/v1.7/articles/basics/#running-an-interactive-shell。
# To detach the tty without exiting the shell,
# use the escape sequence Ctrl-p + Ctrl-q
# note: This will continue to exist in a stopped state once exited (see "docker ps -a")
我对此进行了深入研究,以上所有答案部分都是正确的。这完全取决于容器的启动方式。容器启动时归结为以下内容:
-t
)-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]$
有一种方法可以在不杀死容器的情况下进行分离;您需要另一个外壳。总而言之,在另一个脱壳的外壳中运行它,并使容器继续运行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]$
为什么?因为您要杀死将您连接到容器的过程,而不是容器本身。
kill -9
信号不。该过程已终止,无法追索。我的猜测是其他信号使容器有机会关闭,而-9
实际上没有。
我认为Ashwin的答案是最正确的,下面是我的旧答案。
docker run -dti foo bash
然后,您可以进入容器并使用以下命令运行bash
docker exec -ti ID_of_foo bash
无需安装sshd :)
docker attach
通过重新附加到第一个bash运行会更加标准。docker exec
在这里也可以使用,但是除了第一个过程外,它还创建了一个新的bash过程。当然,该过程是在与第一个相同的上下文/环境/容器中创建的,但是过程是不同的(类比是在您喜欢的终端仿真器中打开一个新的终端选项卡)。
从交互式容器分离的默认方式是Ctrl+ P Ctrl+ Q,但是您可以在运行新容器或使用--detach-keys标志附加到现有容器时覆盖它。
如果通过进行附加docker attach
,则可以通过终止Docker附加过程来分离。更好的方法是使用sig-proxy参数,以避免将Ctrl + C传递到您的容器:
docker attach --sig-proxy=false [container-name]
相同的选项可用于docker run
命令。
php:7.3-apache
您可以--detach-keys
在运行时使用该选项docker attach
以覆盖默认的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-keys="a,b,c" test
-按A
,然后B
,然后C
退出摘自官方文档:
如果需要,您可以配置覆盖Docker密钥序列以进行分离。如果Docker默认序列与您用于其他应用程序的密钥序列冲突,这将很有用。定义您自己的分离键序列的方法有两种,一种是按容器覆盖,另一种是整个配置中的配置属性。
要覆盖单个容器的序列,请将该--detach-keys="<sequence>"
标志与docker attach命令一起使用。的格式为<sequence>
letter [a-Z]
或ctrl-
以下任意一项的组合:
这些a
,ctrl-a
,X
,或ctrl-\\
的值是有效的密钥序列的所有实施例。要为所有容器配置不同的配置默认键序列,请参阅“ 配置文件”部分。
注意:此功能自docker版本1.10+起有效(在回答此问题时,当前版本为18.03)