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

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

转载博客地址:

新浪微博:@寻觅神迹

内容系本人学习、研究和总结,如有雷同,实属荣幸!

==================

Docker exec与Docker attach

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

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

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

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

以下在fedora21,docker1.7上验证。

Docker attach

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

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

[root@localhost temp]# docker psCONTAINER ID        IMAGE                       COMMAND             CREATED              STATUS              PORTS               NAMES2327e7eab0ed        busybox:buildroot-2014.02   "/bin/sh"           About a minute ago   Up About a minute                       bb2[root@localhost temp]# docker attach bb2/ # lsbin      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/shdateTue Jul 14 04:01:11 UTC 2015echo $?0dir/bin/sh: dir: not foundecho $?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/ # pwdhanging....[root@localhost temp]# docker exec -t bb2 pwd/[root@localhost temp]# echo $?0[root@localhost temp]# docker exec -t bb2 dir2015/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.shecho "running a.sh"exit 10[root@localhost temp]# docker exec -t bb /a.shrunning a.sh[root@localhost temp]# echo $?10[root@localhost temp]# docker exec -it bb /a.shrunning a.sh[root@localhost temp]# echo $?10[root@localhost temp]# docker exec -i bb /a.shrunning 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会卡住,一直等命令执行完成

才返回。

[root@localhost temp]# docker exec  bb2 /a.sh^C[root@localhost temp]#[root@localhost temp]#[root@localhost temp]# docker exec -it  bb2 /a.sh^C[root@localhost temp]#[root@localhost temp]# docker exec -i  bb2 /a.sh^C[root@localhost temp]# docker exec -t  bb2 /a.sh^C[root@localhost temp]#

转载于:https://www.cnblogs.com/zhengah/p/4949322.html

你可能感兴趣的文章
80后创业的经验谈(转,朴实但实用!推荐)
查看>>
让Windows图片查看器和windows资源管理器显示WebP格式
查看>>
我的友情链接
查看>>
vim使用点滴
查看>>
embedded linux学习中几个需要明确的概念
查看>>
mysql常用语法
查看>>
Morris ajax
查看>>
【Docker学习笔记(四)】通过Nginx镜像快速搭建静态网站
查看>>
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
查看>>
<转>云主机配置OpenStack使用spice的方法
查看>>
java jvm GC 各个区内存参数设置
查看>>
[使用帮助] PHPCMS V9内容模块PC标签调用说明
查看>>
关于FreeBSD的CVSROOT的配置
查看>>
基于RBAC权限管理
查看>>
数学公式的英语读法
查看>>
留德十年
查看>>
迷人的卡耐基说话术
查看>>
PHP导出table为xls出现乱码解决方法
查看>>
PHP问题 —— 丢失SESSION
查看>>
Java中Object类的equals()和hashCode()方法深入解析
查看>>