专栏首页运维经验分享docker exec 与 docker attach 区别

docker exec 与 docker attach 区别

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,会导致容器的停止。

  1. [root@localhost temp]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 2327e7eab0ed busybox:buildroot-2014.02 "/bin/sh" About a minute ago Up About a minute bb2
  4. [root@localhost temp]# docker attach bb2
  5. / # ls
  6. bin dev etc home lib lib64 linuxrc media mnt opt proc root run sbin sys tmp usr var
  7. / # pwd
  8. /
  9. / #

Docker exec

关于-i、-t参数

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

  1. [root@localhost temp]# docker exec -i bb2 /bin/sh
  2. date
  3. Tue Jul 14 04:01:11 UTC 2015
  4. echo $?
  5. 0
  6. dir
  7. /bin/sh: dir: not found
  8. echo $?
  9. 127

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

  1. [root@localhost temp]# docker exec -it bb2 /bin/sh
  2. / # pwd
  3. /
  4. / # echo $?
  5. 0
  6. / # dir
  7. /bin/sh: dir: not found
  8. / # echo $?
  9. 127

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

  1. [root@localhost temp]# docker exec -t bb2 /bin/sh
  2. / # pwd
  3. hanging....
  4. [root@localhost temp]# docker exec -t bb2 pwd
  5. /
  6. [root@localhost temp]# echo $?
  7. 0
  8. [root@localhost temp]# docker exec -t bb2 dir
  9. 2015/07/14 04:03:57 docker-exec: failed to exec: exec: "dir": executable file not found in $PATH
  10. [root@localhost temp]# echo $?
  11. 0

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

  1. [root@localhost temp]# docker exec -it bb cat /a.sh
  2. echo "running a.sh"
  3. exit 10
  4. [root@localhost temp]# docker exec -t bb /a.sh
  5. running a.sh
  6. [root@localhost temp]# echo $?
  7. 10
  8. [root@localhost temp]# docker exec -it bb /a.sh
  9. running a.sh
  10. [root@localhost temp]# echo $?
  11. 10
  12. [root@localhost temp]# docker exec -i bb /a.sh
  13. running a.sh
  14. [root@localhost temp]# echo $?
  15. 10

关于-d参数

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

  1. [root@localhost temp]# docker exec -d bb2 /a.sh
  2. [root@localhost temp]# echo $?
  3. 0

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

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • zabbix报错cannot set resource limit: [13] Permission denied解决方法

    [root@localhost ~]# systemctl start zabbix-server

    拓荒者
  • CentOS 7.4 安装后优化配置 原

    1.网卡  [root@zhg1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens32  显示结果:   ...

    拓荒者
  • CentOS 7.4 安装Zabbix 3.4

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。

    拓荒者
  • Ubuntu16.04安装Mongodb教程

    创建/etc/apt/sources.list.d/mongodb-org-3.2.list文件并写入命令

    Debug客栈
  • 获取浏览器可视区域宽高

    ProsperLee
  • AC算法在美团上单系统的应用

    在美团,为了保证单子质量,需要对上单系统创建的每一个产品进行审核。为了提高效率,审核人员积累提炼出了一套关键词库,先基于该词库进行自动审核过滤,对于不包括这些关...

    Java架构师必看
  • 用Matplotlib制作动画

    动画是呈现各种现象的有趣方式。在描述像过去几年的股票价格、过去十年的气候变化、季节性和趋势等时间序列数据时,与静态图相比,动画更能说明问题。因为,从动画中,我们...

    昱良
  • CentOS 6 上mongodb安装与使用

    版权声明:本文为木偶人shaon原创文章,转载请注明原文地址,非常感谢。 https://b...

    shaonbean
  • Infor ERP LN中销售订单处理程序(流程)

    昨天介绍了《Infor ERP LN中销售订单状态说明》,按照计划今天要详细介绍销售订单的标准处理程序(流程),开始之前先通过今天工作中的一件小事,插播下一个小...

    崔文远TroyCui
  • Spring-AOP之aspectj注解方式

    一、简介 1、AOP用在哪些方面:AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理、日志管理、权限控制,异常处理等,封装起来,便于...

    java达人

扫码关注云+社区

领取腾讯云代金券