51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1944|回复: 1
打印 上一主题 下一主题

docker exec 与 docker attach 区别

[复制链接]
  • TA的每日心情
    无聊
    2022-8-5 09:01
  • 签到天数: 2 天

    连续签到: 2 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2019-2-28 15:19:53 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
    Docker exec与Docker attach

    不论是开发者是运维人员,都经常有需要进入容器的诉求。
    目前看,主要的方法不外乎以下几种:
    1. 使用ssh登陆进容器
    2. 使用nsenter、nsinit等第三方工具
    3. 使用Docker本身提供的工具


    方法1需要在容器中启动sshd,存在开销和攻击面增大的问题。同时也违反了Docker所倡导
    的一个容器一个进程的原则。
    方法2需要额外学习使用第三方工具。
    所以大多数情况最好还是使用Docker原生方法,Docker目前主要提供了Docker exec和
    Docker attach两个命令。

    以下在docker1.1上及以上验证。


    Docker attach

    Docker attach可以attach到一个已经运行的容器的stdin,然后进行命令执行的动作。
    但是需要注意的是,如果从这个stdin中exit,会导致容器的停止。

    • [root@localhost temp]# docker ps

    • CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

    • 2327e7eab0ed busybox:buildroot-2014.02 "/bin/sh" About a minute ago Up About a minute bb2

    • [root@localhost temp]# docker attach bb2

    • / # ls

    • bin dev etc home lib lib64 linuxrc media mnt opt proc root run sbin sys tmp usr var

    • / # pwd

    • /

    • / #



    Docker exec

    关于-i、-t参数

    可以看出只用-i时,由于没有分配伪终端,看起来像pipe执行一样。但是执行结果、命令
    返回值都可以正确获取。

    • [root@localhost temp]# docker exec -i bb2 /bin/sh

    • date

    • Tue Jul 14 04:01:11 UTC 2015

    • echo $?

    • 0

    • dir

    • /bin/sh: dir: not found

    • echo $?

    • 127



    使用-it时,则和我们平常操作console界面类似。而且也不会像attach方式因为退出,导致
    整个容器退出。
    这种方式可以替代ssh或者nsenter、nsinit方式,在容器内进行操作。

    • [root@localhost temp]# docker exec -it bb2 /bin/sh

    • / # pwd

    • /

    • / # echo $?

    • 0

    • / # dir

    • /bin/sh: dir: not found

    • / # echo $?

    • 127



    如果只使用-t参数,则可以看到一个console窗口,但是执行命令会发现由于没有获得stdin
    的输出,无法看到命令执行情况。

    • [root@localhost temp]# docker exec -t bb2 /bin/sh

    • / # pwd

    • hanging....

    • [root@localhost temp]# docker exec -t bb2 pwd

    • /

    • [root@localhost temp]# echo $?

    • 0

    • [root@localhost temp]# docker exec -t bb2 dir

    • 2015/07/14 04:03:57 docker-exec: failed to exec: exec: "dir": executable file not found in $PATH

    • [root@localhost temp]# echo $?

    • 0



    docker exec执行后,会命令执行返回值。(备注Docker1.3似乎有Bug,不能正确返回命令执行结果)

    • [root@localhost temp]# docker exec -it bb cat /a.sh

    • echo "running a.sh"

    • exit 10

    • [root@localhost temp]# docker exec -t bb /a.sh

    • running a.sh

    • [root@localhost temp]# echo $?

    • 10

    • [root@localhost temp]# docker exec -it bb /a.sh

    • running a.sh

    • [root@localhost temp]# echo $?

    • 10

    • [root@localhost temp]# docker exec -i bb /a.sh

    • running a.sh

    • [root@localhost temp]# echo $?

    • 10



    关于-d参数

    在后台执行一个进程。可以看出,如果一个命令需要长时间进程,使用-d参数会很快返回。 程序在后台运行.

    • [root@localhost temp]# docker exec -d bb2 /a.sh

    • [root@localhost temp]# echo $?

    • 0


    如果不使用-d参数,由于命令需要长时间执行,docker exec会卡住,一直等命令执行完成 才返回。





    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-27 10:33 , Processed in 0.067095 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表