[DevOps翻译]如何在不停止Docker容器的情况下将其分离出来?

734 阅读5分钟

本文由 简悦SimpRead 转码,原文地址 www.howtogeek.com

Docker支持一个键盘组合来优雅地从容器中分离。按Ctrl-P,然后按......

Docker容器有一个交互式模式,让你把终端的输入和输出流附加到容器的进程中。按Ctrl-C通常会终止该
进程,导致容器停止。下面是在不停止容器的情况下从一个会话中分离的方法。

不停止地脱离

Docker支持一个键盘组合来优雅地从容器中分离。按Ctrl-P,然后按Ctrl-Q,就可以从你的连接中脱离。

你会被送回你的shell中,但是之前连接的进程会保持活力,保持你的容器运行。你可以通过使用docker ps来查看运行中的容器的列表。

按Ctrl-C或运行exit命令通常会杀死容器的前台进程,除非它被特别配置了。一个Docker容器需要有一个正在运行的前台进程;没有前台进程的容器将进入停止状态。

改变分离键盘的顺序

你可以改变分离顺序以符合你的偏好,或者避免与你的应用程序所使用的键盘快捷键发生冲突。在你的~/.docker/config.json文件中添加detachKeys属性来指定你要使用的按键。

Docker支持a-z字符和@^_等符号,以及左括号([])和两个反斜线(``)。这些都是与Ctrl-键结合使用的;字母也可以单独使用,不需要Ctrl

按键序列以逗号分隔的列表形式表示。

{
    "detachKeys": "Ctrl-d,d"
}

这个例子中,当你按下Ctrl-D后紧接着按d键时,就会从容器中分离出来。

在每个容器的基础上改变顺序

除了改变你的全局配置,Docker还接受在每个容器和每个附件的基础上重写detachKeys。将--detach-keys标志添加到可以附加到容器进程的命令中,以设置一个特定的序列。

支持这一功能的命令有

  • docker run
  • docker start
  • docker exec
  • docker attach

下面是如何附加到一个容器上,然后使用Ctrl-d,后面加一个下划线,来分离。

docker attach my-container --detach-keys="Ctrl-d,_"

--detach-keys标志使用与detachKeys配置选项相同的键序格式。该标志覆盖了你的docker.json设置;这又覆盖了Docker默认的Ctrl-P/Ctrl-Q序列。

当键盘序列不工作时分离

有时你可能会遇到一个容器进程拒绝分离的情况,即使你发出键盘序列。如果容器的输入流没有连接到你的终端(-i标志),或者没有分配到pseudo-TY(-t标志),就会发生这种情况。如果你的容器的进程处理分离键序列,而你在连接时没有覆盖它,你也可能遇到这个问题。

在这种情况下,仍有可能将你的终端从容器中分离出来。你需要临时打开另一个shell窗口,用它来杀死保持附件活动的docker.attach进程。

首先找到附件进程的进程ID。

ps -ef | grep attach

使用ps的输出来识别你需要杀死的docker.attach进程。CMD'栏中的命令应该能确定你要找的附件。记下相关的PID号码,并使用kill`命令来杀死这个进程。

kill -9 <PID>

你应该看到你的原始shell从Docker容器中分离出来,并恢复到正常的操作状态。现在你可以关闭第二个shell,继续使用原来的那个。

这种技术通过杀死将终端连接到容器的Docker CLI进程,而不是容器内保持其运行的进程来发挥作用。你原来的终端又可以使用了,而容器仍然在运行。

重新连接到你的容器上

你可以使用docker attach命令重新连接到容器。这将自动把你的终端的输入、输出、和错误流附加到指定的容器上。

docker attach my-container

所有三个流都是默认连接的。你可以通过传递--no-stdin标志来省略输入流。容器的输出将流向你的终端,但你将不能提供任何输入。

再次使用键盘序列来分离,或者Ctrl-C来停止进程和容器。如果你使用Ctrl-Cexitdocker attach将在你的shell中正确设置$?变量,这样你就可以检查容器的退出代码。

摘要

从Docker容器中分离的正确方法是一个相当隐蔽的键盘序列,它可以让你回到你的shell中。你可以自定义这个序列,以增加记忆性,并避免与容器的键盘处理发生任何冲突。

键盘分离序列在某些情况下可能是无效的。通过识别并杀死支持附件的进程,仍然可以从你的容器中分离出来。在这种情况下,应该使用常规的Unix命令,如pskill

最后,如果你想让你的容器永久脱离,用-d标志启动它(docker run -d my-image:latest)。这将直接把容器送入后台,并且不向你的shell发出任何输出。分离的容器总是可以通过docker ps命令看到,并且可以通过docker stop my-container停止。


www.deepl.com 翻译