理解容器中超易混淆 Attach 和 Exec 的异同

公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

ecc86de626d94b1ea317842fb1f8f978.png

docker(或podman,或containerdattachexec命令之间的区别是一个常见的混淆源。这是可以理解的——这两个命令有相似的参数,乍一看也有相似的行为。但是,attachexec不可互换。它们旨在涵盖不同的用例,并且命令的实现也不同。但是,可能很难记住何时使用哪个命令。

容器管理 - 看看里面

首先,快速回顾一下docker 架构的样子:

01be6e5b888c1e1cb6a119f5a968c844.png

三个关键要点:

  • 容器管理架构是分层的

  • 一个容器是一个孤立受限的环境+一个进程

  • 在容器管理器和容器之间有一个 shim组件。

attach命令来做什么

在容器内部,有一个常规的Linux 进程。与每个正常进程一样,它具有stdio流 - stdinstdoutstderr。但是当容器以分离(即类似守护进程)模式启动时,这些流会发生什么:

$ docker run -d nginx

回到过去,当您将进程作为守护进程启动时(即,将其与启动进程分离),它将重新指向PID 1,并且它的 stdio 流将被简单地关闭。但是,我们都知道如今使用stdoutstderr流进行日志记录是多么方便,这要归功于容器!

Docker 提出了一个聪明的想法,即在容器和系统的其余部分之间放置一个额外的进程,称为容器运行时shim。在上面的示例中,容器管理器实际上启动了一个 shim 进程,该进程又使用 OCI 兼容的运行时(例如 runc)来启动实际的容器。

这是成为守护进程的 shim 进程 - 它重新指向PID 1,并且其stdio流已关闭:2b366fb281a9fa3ce8f3234215e814ad.png

然而,shim 控制了容器的stdio流!

守护程序的 shim 进程从容器的stdoutstderr读取并将读取的字节转储到日志驱动程序。默认情况下,shim关闭容器的stdin流,但如果-i传递给相应的docker run命令,它可以保持打开状态。

容器运行时 shim 实际上充当服务器!它提供了连接到它的 RPC 手段(例如,一个 UNIX 套接字)。当您这样做时,它开始将容器的stdoutstderr流式传输回套接字的末端。它还可以从此套接字读取并将数据转发到容器的stdin。因此,类似attach到容器的stdio流!

所以,最后,当你运行时docker attach <container>,你基本上创建了一个中继:

terminal <-> docker <-> dockerd <-> shim <-> container's stdio streams
5c9837b08ddb5e430870f275b14dc2cf.png
attach和logs之间的区别

在上图中,docker attach将容器的日志流式传输回终端。但是,该docker logs命令执行类似的操作。那么,有什么区别呢?

logs命令提供了各种选项来过滤日志,而attach在这方面则充当一个简单的tail. 但更重要的是,logs命令建立的流始终是单向的,并连接到容器的日志,而不是直接连接到容器的stdio流。

logs命令只是将容器日志的内容流式传输回您的终端,仅此而已。因此,无论您如何创建容器(交互式或非交互式,是否由伪终端控制),在使用logs命令时都不会意外影响容器。

但是,何时使用attach

  • 如果容器是在交互模式 ( -i)下创建的,则在attach-ing 到容器后在终端中键入的所有内容都将发送到其stdin

  • 您可以(有意或无意地)向容器发送信号 -例如,ctrl+cattach发送SIGINT到容器时击中您的一端。

exec命令来做什么

我希望attach命令现在已经解决了。所以,是时候解决exec对手了!

exec命令实际上是一个完全不同的故事。在attach的情况下,我们将终端连接到现有容器(读取、处理)。但是,该exec命令会启动一个全新的容器!换句话说,execrun命令的一种形式(它本身只是create+的快捷方式start)。

注:该OCI运行规格不具有runexec命令!查看#345#388以获取有关exec功能实际上是如何冗余的有趣讨论,并且可以在仅实现createstart命令的运行时中重现。

#345 https://github.com/opencontainers/runtime-spec/issues/345

#388 https://github.com/opencontainers/runtime-spec/pull/388

但为什么接着说docker exec --help:

Usage:  docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Run a command in a running container

这里的技巧是,exec命令创建的辅助容器共享目标容器的所有隔离边界!即,相同的netpidmount等命名空间、相同的cgroups层次结构等。因此,从外部看,感觉就像在现有容器内部运行命令。

attachexec命令的混淆是因为exec-uted 命令也是一个拥有自己的stdio流的进程。因此,您可以选择是否exec处于分离模式、是否保持标准输入打开、是否分配伪 TTY 等。此外,当exec-ing 时,中继看起来非常相似:

terminal <-> docker-cli <-> dockerd <-> shim <-> command's stdio streams
0e21ffcc6252788993cf1a30383c1409.png
其他实现

上面的图表和例子主要是关于docker的,但其他容器管理器,如containerdcrio,在运行、执行、attachlogs命令时表现类似。

Podman可能是无守护进程容器管理器最突出的例子。然而,即使是 podman 也使用容器运行时垫片。当您attach到达podman 的容器时,中继中的跳数就少了一跳。

不过,有趣的样本是 KubernetesKubernetes 不直接管理容器。相反,每个集群节点都有一个本地代理,称为kubelet,它又期望节点上存在兼容的容器运行时。但是,在最低级别上,仍然存在相同的垫片和流程:

d7a756630ed6daca0ad50752b4d92ea4.png

docker非常相似,Kubernetes的命令行客户端(kubectl)也提供了类似的UX执行、attachlogs命令。不同之处在于Kubernetes使用的是pod而不是容器。幸运的是,pod只是一组半熔合的容器,所以我们目前学到的所有东西仍然适用。

由于attahclogsexec工作在容器级别上,每个kubectl attachkubectl logskubectl exec都需要指定目标容器(-c <name>)以及pod名称。除非这个pod 用kubectl.kubernetes.io/default-container注释过。

e48b0b5fc5e6022dcb42e02c3ec27905.png
结论

所以,总结一下:

  • 容器是隔离且受限的执行环境。

  • 传统上,每个容器有一个主进程。

  • 容器通常以分离模式启动(即,像守护进程)。

  • 容器运行时 shim 包装容器进程并将其stdoutstderr流式传输到日志。

  • 运行时 shim 允许attach-ing 将终端与容器的stdio流连接起来。

  • 可以重用已运行容器的隔离方式来启动容器。

  • exec命令类似于run从另一个容器重用所有命名空间和 cgroup的命令。

  • 由于exec-ing 默认发生在attach模式下,它可能看起来与attach命令相似,但其目的和实现却大不相同。

参考资料


https://iximiuz.com/en/posts/containers-101-attach-vs-exec/

本文转载自:「云原生CTO」,原文:https://tinyurl.com/32etuh3s,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

44c3e02bd4ea5e6d69e7474295aa3abd.gif

c1cf6762523d04bafc368be1bd760893.png

你可能还喜欢

点击下方图片即可阅读

231d4ab32c955a3914e0b6189f6e6d02.png

5 张图带你搞懂容器网络的工作原理

11e8839d5f35fdb266d78d306a84206b.png
点击上方图片,『美团|饿了么』外卖红包天天免费领

9662751fb9a4d7f939965948791017ff.png

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

运维之美
关注 关注
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#提取网页中超链接link和text部分的方法
12-31
本文实例讲述了C#提取网页中超链接link和text部分的方法。分享给大家供大家参考,具体如下: string s = ..; Regex re = new Regex(@]*href=((?[^]*)|'(?[^']*)'|(?[^\s>]*))[^>]*>(?<text>.*?), RegexOptions....
Docker attachDocker exec的区别
zg
02-16 6041
容器启动并进入后台后,这个时候进入容器进行操作,可以使用Docker attach命令或Docker exec命令。 1. attach命令 attachDocker自带的命令,命令的格式为: docker attach [OPTIONS] CONTAINER 2. exec命令 从Docker的1.3版本起,Docker提供了更加方便的工具exec命令,可以在运行容器内直接执行任意命令。命令格式为: docker exec [OPTIONS] CONTAINER COMMAND [ARG…] 3.
docker execdocker attach 的区别(attach过时,别用)
Dontla的博客
05-24 2000
官方解释:attach Attach local standard input, output, and error streams to a running container 谷歌翻译:attach 附加将本地标准输入,输出和错误流附加到正在运行的容器 通俗解释:将终端依附到容器上(其实就是进入容器) 可以认为这是一个过时的命令,更多的docker用户会考虑使用docker exec来实现相同的功能 参考文章:Docker命令之一:docker attach docker attach 进入容器,再退
containerd常用命令
最新发布
chililopp的博客
07-09 2911
上回书说到k8s1.24版本为什么弃用docker而选择containerd作为容器运行时,这回我就来深入学习一下containerd,先从常用命令开始;
Docker attach VS exec
RAB
06-05 1006
Docker attachexec 的主要区别。
docker run、execattach使用和区别
顺其自然~专栏
02-01 2624
在已运行的容器中,执行命令(只是进入容器执行命令,退出后,容器继续运行)(attach容器的输入输出附加到本机的输入输出中,类似于线程的附加,退出后,容器结束运行)
docker入门(三)——容器
midnight_DJ的博客
11-23 939
本章介绍容器的各种操作、容器状态之间的转换以及实现容器的底层技术。
2020年中超联赛行业调研分析报告【调研】
04-26
2020年中超联赛行业调研分析报告【调研】
大气中超高斯和高斯涡旋光束传输特性比较
01-26
为比较两种不同类型涡旋光束在...结果表明:传输距离、拓扑荷数和湍流强度都会对涡旋光束光束质量产生影响。其中,传输距离对超高斯涡旋光束的光束质量的影响更大,而拓扑荷数则对高斯涡旋光束的光束质量的影响更明显。
html中超链接样式
01-08
能够设置超链接样式的属性有很多种(如color,font-size,font-family,background等)。 超链接有4种状态,具体在代码中讲解。 (1)HTML中的超链接... 马子日 ...(2)编写css代码,设置超链接的样式,代码如下 ...li
Docker中进入容器execattach的区别
weixin_44656636的博客
04-16 3398
execattach 都是进入当前运行容器的命令 exec(为较为常用的):使用exec进入容器后,是开启一个新的终端,在里面操作 attach:使用attach是直接在当前容器正在执行的终端里进行操作 例子:我们分别使用2种不同命令进入容器,然后退出容器,再观察容器的状态 先使用exec进入容器 进入正在运行的centos容器 docker exec -it 6ebaa1bd0f6e /bin/bash 然后退出容器 再查看容器的状态,这个时候容器还是运行着的 再来使用attac.
docker attachdocker exec
ustbbsy的博客
06-15 1217
docker attachdocker exec 先创建一个交互式容器 可以进入执行交互操作:pwd,ls -l 然后ctrl + p + q退出交互式 docker ps可以看出是不停止退出 现在不是退出了吗?又有点事,需要和容器交互,怎么重新进去呢? docker start是从停止的重启 docker restart 从新启动容器,好像也可以,试一试 虽然容器重启了,但并没有进行入交互式环境。 这个时候docker attach就隆重登场了 docker exe...
docker进入当前正在运行容器的两种方式(execattach的区别)
热门推荐
Starrysky_LTL的博客
11-08 6万+
一、docker exec 相当于进入容器并开启一个新的终端,可以在里面操作。 如果使用exit退出,容器也不会停止。 帮助信息: 注意:因为exec是开始一个新终端,所以COMMAND是必填项,不能省略。
attachexec进入容器空间的区别
qq_40977791的博客
03-24 99
attach exec
Docker execDocker attach
zhuchunyan_aijia的博客
09-03 3376
Docker attach Docker attach可以attach到一个已经运行的容器的stdin,然后进行命令执行的动作。  但是需要注意的是,如果从这个stdin中exit,会导致容器的停止。 例如 :docker attach containId  Docker exec 关于-i、-t参数 可以看出只用-i时,由于没有分配伪终端,看起来像pipe执行一样。但是执行结果、命令 ...
docker 命令execattach
Cloud-Future的博客
03-08 490
docker exec 执行docker exec --help,查看用法: gyb@gengyb:~$ docker exec --help Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...] Run a command in a running container Options: -d, --detach Detached mode: run command in the background
Kubectl常用命令详解
ss810540895的博客
05-17 2万+
原文 Kubectl常用命令详解 本文介绍k8s集群管理命令Kubectl分类和命令详解。 内容 1. kubectl命令列表分类 (1)Basic Commands(Beginner)基础命令(初级) kubectl create 通过yaml/json 文件或者标准输入创建一个资源对象,支持很多子命令 例如namespace pod deployment service等 kubectl expose 将json/yaml文件中定义的资源对象的端口暴露给新的service资源对象 kubectl
k8s中的资源类型
sfakh的博客
12-09 2562
k8s中的资源类型pod利用yaml文件创建pod资源nodedeploymentserviceReplicationControllerReplicationController的三个主要部分利用yaml文件创建一个rc管理器ReplicaSet利用yaml文件创建ReplicaSet资源 K8s中有很多资源类型,如pod、node、service、replicationController等 资源 作用 所在api 1.pod pod是K8s中资源调度的最小单元 v1 2.node
散射介质中超短脉冲传播:时间和空间特性分析
这项研究提供了深入理解超短脉冲在散射环境中的传播行为的基础,这对于优化超快光学设备的设计,改进光学成像和通信技术,尤其是在生物组织内的应用,具有重要的理论和实践价值。通过调整散射介质的参数,可以有效地...
写文章

热门文章

  • 史上最全的黑苹果系统「MacOS」安装教程,小白也能秒掌握! 619702
  • ChatGPT for Google :将 ChatGPT 整合到搜索引擎,ChatGPT 和谷歌不必二选一 77620
  • Tailscale 开源版中文部署指南(支持无限设备数、自定义多网段 、自建中继等高级特性)... 55849
  • 推荐一个在线测试服务器延迟和丢包的工具 Ping.pe 51055
  • 史上最全的后端技术大全,你都了解哪些技术呢? 32933

最新评论

  • Tailscale 开源版中文部署指南(支持无限设备数、自定义多网段 、自建中继等高级特性)...

    cheetah_747: 找了好久。。。终于找到一篇讲离线安装包来安装tailscale的文章了。。感谢感谢!!!用官方的curl -fsSL根本拉不下来。

  • 世界最著名的 16 个开源软件基金会,你认识哪几个呢?

    儿创社ErChaungClub: 抱一丝,我引用了您的博文。 如有侵权,我会修改并删除我的那篇博文。 https://blog.csdn.net/2301_81185531/article/details/141999338

  • 一文带你搞懂公网、私网、内网、外网的区别

    m0_52458064: 没说实质的一级NAT,二级NAT,还有子网掩码,还有个人和企业购买或开通公网IP后的具体应用和网络设置。要说就说一个专辑,或推荐一些好书

  • Grafana 中文入门教程 | 构建你的第一个仪表盘

    缓缓掉落的枫叶: 全是干货哥

  • Phantun: 一款突破运营商 QoS 封锁的高性能 UDP 流量伪装工具,支持 WireGuard 协议...

    残存的影子: 感觉略微有一点点麻烦。

大家在看

  • 3.6 第四行之__ipipe_init_proc()
  • 网络安全:构建数字世界的坚固防线
  • 10B左右多模态模型,可本地食用,模型真的在越来越小型化 629
  • 基于stm32测量按键按下时长---输入捕获及程序案例分析 577
  • YOLOv1-v3理论合集

最新文章

  • 万字实践教程,全面入门 Coze 工作流|用 Coze 打造 AI 精读专家,复刻 10 万粉公众号的创作生产力...
  • 如何在 Cilium CNI 集群上运行 vCluster 虚拟集群
  • 如何优雅的用 Prompt 提示词助力 AI 写作
2024
09月 12篇
08月 23篇
07月 21篇
06月 21篇
05月 26篇
04月 18篇
03月 11篇
02月 16篇
01月 21篇
2023年359篇
2022年326篇
2021年253篇
2020年178篇
2019年194篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家玻璃钢雕塑的流程玻璃钢滑梯雕塑淮安玻璃钢雕塑定制上海玻璃钢卡通雕塑厂家直销石岩商场美陈装饰商场自动拍照美陈商场服装店铺秋季美陈玻璃钢人物喷泉雕塑定做河北户外商场美陈供货商发光小品玻璃钢雕塑供应商博物馆玻璃钢雕塑卡通人物美杜莎玻璃钢雕塑建邺百货商场美陈太原商场创意美陈玻璃钢云彩浮雕雕塑图片象山玻璃钢花盆花器广西玻璃钢泡沫雕塑厂家供应重庆红橘玻璃钢雕塑成品玻璃钢花盆报价萍乡玻璃钢雕塑优势北京朝阳玻璃钢雕塑加工厂家海口玻璃钢雕塑产品厂家广州玻璃钢小黄人卡通雕塑上海室内商场美陈报价玻璃钢人物雕塑厂家电话长治玻璃钢仿真水果雕塑价格浙江商场美陈研发鹤壁水景玻璃钢雕塑定做湖州欧式玻璃钢雕塑多少钱商场中庭开业美陈香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化