博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
docker exec 与 docker attach 区别
阅读量:6314 次
发布时间:2019-06-22

本文共 2311 字,大约阅读时间需要 7 分钟。

hot3.png

docker exec 与 docker attach 区别

2016年05月17日 10:21:38 阅读数:2463更多

个人分类: 

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zongyimin/article/details/51434072

Docker exec与Docker attach

不论是开发者是运维人员,都经常有需要进入容器的诉求。 

目前看,主要的方法不外乎以下几种: 
1. 使用ssh登陆进容器 
2. 使用nsenter、nsinit等第三方工具 
3. 使用本身提供的工具

方法1需要在容器中启动sshd,存在开销和攻击面增大的问题。同时也违反了Docker所倡导 

的一个容器一个进程的原则。 
方法2需要额外学习使用第三方工具。 
所以大多数情况最好还是使用Docker原生方法,Docker目前主要提供了Docker exec和 
Docker attach两个命令。

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

Docker attach

Docker attach可以attach到一个已经运行的容器的stdin,然后进行命令执行的动作。 

但是需要注意的是,如果从这个stdin中exit,会导致容器的停止。

 
  1.  
  2. [root temp]# docker ps

  3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

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

  5. [root temp]# docker attach bb2

  6. / # ls

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

  8. / # pwd

  9. /

  10. / #

Docker exec

关于-i、-t参数

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

返回值都可以正确获取。

 
  1.  
  2. [root temp]# docker exec -i bb2 /bin/sh

  3. date

  4. Tue Jul 14 04:01:11 UTC 2015

  5. echo $?

  6. 0

  7. dir

  8. /bin/sh: dir: not found

  9. echo $?

  10. 127

使用-it时,则和我们平常操作console界面类似。而且也不会像attach方式因为退出,导致 

整个容器退出。 
这种方式可以替代ssh或者nsenter、nsinit方式,在容器内进行操作。

 
  1.  
  2. [root temp]# docker exec -it bb2 /bin/sh

  3. / # pwd

  4. /

  5. / # echo $?

  6. 0

  7. / # dir

  8. /bin/sh: dir: not found

  9. / # echo $?

  10. 127

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

的输出,无法看到命令执行情况。

 
  1.  
  2. [root temp]# docker exec -t bb2 /bin/sh

  3. / # pwd

  4.  
  5. hanging....

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

  7. /

  8. [root@localhost temp]# echo $?

  9. 0

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

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

  12. [root@localhost temp]# echo $?

  13. 0

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

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

  3. echo "running a.sh"

  4. exit 10

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

  6. running a.sh

  7. [root@localhost temp]# echo $?

  8. 10

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

  10. running a.sh

  11. [root@localhost temp]# echo $?

  12. 10

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

  14. running a.sh

  15. [root@localhost temp]# echo $?

  16. 10

关于-d参数

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

程序在后台运行。

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

  3. [root@localhost temp]# echo $?

  4. 0

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

才返回。

转载于:https://my.oschina.net/u/3367404/blog/1934455

你可能感兴趣的文章
O2O、C2C、B2B、B2C
查看>>
List接口实现类及其区别
查看>>
CCF201503-4 网络延时(100分)
查看>>
php密码对称encrypt加密
查看>>
OO5-7总结
查看>>
libqxt编译
查看>>
postgresql支持sys_guid()
查看>>
Oracle数据库,数据的增、删、改、查
查看>>
写题记录+一句话题解:2019
查看>>
键盘上每个键作用!!!
查看>>
捷连导航
查看>>
cocos2d-x按钮CCControlButton的用法
查看>>
【按住你的心】——Android开发在Linux下IDE环境的配置
查看>>
chartControl绑定数据源
查看>>
使用Random随机生成[min,max]之间的整数:
查看>>
ThinkPHP中使用PHPMailer邮件类
查看>>
linux远程win7教程
查看>>
薪资那么高的Web前端,你该怎么学?
查看>>
SaltStack安装redis
查看>>
JVM 内存模型与垃圾回收机制
查看>>