在现今容器化技术被广泛运用的当下 , Docker attach 命令乃是跟正在运行着的容器开展交互的一种基本途径 。 其准许用户径直连接至容器的主进程 ( 一般是PID 1 ) ,去查看该进程的输出docker attachlinux系统装win7, 并且向该进程发送输入 。 弄明白其工作道理以及适用情形 , 对于日常的容器调试以及所进行的交互而言是极其关键的 。
Docker attach 命令的主要用途是什么
Docker“attach”命令的首要关键用途,在于去连接至那正在运行着的容器的主要进程。在你施行“docker attach” 。这时,你的终端会跟该容器的标准输入相连,也就是stdin,同时会连接到其输出,即stdout,还会连接到错误,也就是stderr。这恰似一个用于观察以及干预的窗口。

最常碰到的情况是实时去查看处于容器之内的应用程序的日志输出,这种情况很常见。比如说呢有一种后台运行着的Web服务容器,借助 attach 命令能够快速查看它的访问日志或者错误讯息,并不需要进入到容器内部去执行 tail -f 命令。这样子对于立刻诊断问题是非常有帮助作用的。
Docker attach 与 docker exec 之间存在着怎样的区别呢 ,这两者的差异究竟体现在何处呢 ? 。
attach与exec属于两种不一样的交互方式,有误的选择兴许会造成困扰。docker attach会连接至容器启动之际运行的主进程,你的输入会径直发送给此进程。要是主进程是一个Shell,那你就如同进入了这个Shell;要是主进程是Nginx,那你的输入对Nginx或许没效果。

然而,docker exec 这一操作,是于容器的内部环境之中,开启启动一个全新的进程 。譬如,会产生 docker exec -it 这样的举动 。如下这般/bin/bash,此操作会在容器之内开启一个全新进程的会话来运行bash,并且是与主进程以并行的方式来运行。这就表明了,当退出这个bash的时候并不会致使容器停止运作,原因在于主进程依旧处于运行的状态。而exec则更适宜于去开展额外的诊断处置行为,像是对文件予以检查、或者是安装临时性的工具等等。
使用 Docker attach 的典型操作步骤
第一步是经由确保目标容器处于正在运行的状态来使用 attach 命令,你能够借由 docker ps 命令去列出所有处于运行中的容器,然后记下需要进行连接的容器ID或者名称,接下来,在终端里面直接输入 docker attach [容器标识] 便可 。

当连接成功达成之后,你的终端会将容器主进程后续的输出予以显示。要是存在向进程发送输入这样的需求,诸如给一个交互式Python脚本传送参数,便能够直接进行键入。在此存在着一个关键之处:在默认情形下,所有的输入都会被发送至容器进程之中。若意欲断开连接然而却不致使容器停止运行,那就需要运用默认的退出序列,也就是 Ctrl-p 紧接着 Ctrl-q。
Docker attach 有哪些需要注意的限制和风险
attach命令存在一个主要限制之处,并且在于它仅仅是连接到主进程。要是你的容器运用了复杂的分层启动脚本,或者是进程管理器,像supervisord这样的,那么attach有可能没办法让你瞧见所有子进程的完整输出。另外,它并不具备exec命令所拥有的灵活性之特点,所以没办法在容器内去执行额外的独立命令。
最严重的风险存在于退出途径,要是错误地运用 Ctrl-c 想去断开连接,那么这个中断信号(SIGINT)会发送至容器的主进程内,极有可能致使那个进程中止,进而让整个容器停止运作,这对于生产环境里的容器而言是具有灾难性的,所以,务必要牢记采用 Ctrl-p, Ctrl-q 组合按键去安全分离 。

如何安全地从 Docker attach 会话中分离
安全实现分离乃运用 attach 之际务必熟练掌握的一项技能,之前已然提及,正确的用于分离的键的序列是 Ctrl-p 随后是 Ctrl-q,就实际进行操作之时,先是需按住 Ctrl 键使其不松开,紧接着按一下 p 键,在松开这两个键之后,然后要迅速按下 Ctrl 和 q 键。
这般操作序列的设计,旨在防止与常用的终止信号 Ctrl-c 产生冲突。成功分离之后,你会返回至宿主机的命令行,并且容器及其主进程会持续于后台运行。建议在并非至关紧要的容器上多次操练这个操作,从而形成肌肉记忆,避免在生产环境里因错误操作致使服务中断。
Docker attach 在真实场景中如何应用

于实际开发里,attach 常常是被用于调试交互式应用的,比如说,在您运行了一个针对数据处理的Python脚本容器之后,此脚本是会等待用户去输入参数的,依靠 attach 连接至容器,您能够看见脚本的提示信息docker attach,并且能够直接去输入所需参数,进而观察处理过程以及结果 。
较常出现的另一种场景,是对遗留系统或者特定镜像实施维护有的官方镜像像是某些旧版本的Alpine Linux会把/bin/sh当作主进程来启动对于这样的容器docker attach拿到的就是跟操作docker exec类似的直接的Shell只是要留意其退出机制存在不同掌握镜像的入口点也就是Entrypoint是预判attach行为的关键之处 。
于日常工作里头red hat linux,你是更偏向运用 docker attach ,还是更偏好运用 docker exec 去跟容器进行交互?在哪些特定的场景当中,你认为 attach 是根本无从取代的?欢迎于评论区去分享你的经验以及看法,要是觉着本文设有帮助的话,请点赞并且分享给更多的开发者。
