Docker exec与Docker attach
转载博客地址:http://blog.csdn.net/halcyonbaby
新浪微博:@寻觅神迹
内容系本人学习、研究和总结,如有雷同,实属荣幸!
==================
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 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会卡住,一直等命令执行完成
才返回。
[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]#
Docker exec与Docker attach的更多相关文章
- docker cp 和docker exec 查看docker 运行的容器信息
1. 使用docker 运行 redis 和 postgresql docker run -d -p : -v /redis/data/:/data redis docker run -d -p : ...
- docker run VS docker exec 的区别
“docker run”和“docker exec”都是 Docker 容器中用于执行的命令.然而,在不同的情况下,它们的使用有着本质上的区别. “docker run”命令 “docker run” ...
- Docker系列01—Docker 基础入门
一.初识Docker和容器 1.1 什么是docker 容纳其他物品的工具,可以部分或完全封闭,被用于容纳.存储.运输物品.物体可以被放置在容器中,而容器则可以保护内容物. 容器? 容器就是在隔离的环 ...
- docker attach 和 docker exec
docker attach docker attach -- Attach to a running container. 常用选项: --sig-proxy=true:Proxy all recei ...
- docer run 、docker attach 与 docker exec的区别
进入容器的方式有以下三种: 使用ssh登陆进容器 使用nsenter.nsinit等第三方工具 使用Docker本身提供的工具 最佳方案为使用Docker本身提供的工具 docker run:创建和启 ...
- Docker exec 宿主对容器执行命令 - 五
Docker 下 exec 从宿主机对容器执行命名操作 docker exec -it # 交互可以进入容器 ; exec 也可以在宿主机对容器执行命令: docker attach # 也是可 ...
- 使用docker exec 就可以进入container,例如:docker exec -it <container_id> /bin/bash
使用docker exec 就可以进入container,例如:docker exec -it <container_id> /bin/bash
- docker exec 运行命令
docker:/root/sbin# docker exec -it 17aaf60ee3a1 /sbin/ifconfig -a eth1 Link encap:Ethernet HWaddr 22 ...
- docker exec 系统找不到指定的路径。
相关问题和答案 >docker exec -it a1 echo "hello..." > /var/www/html/index.html 系统找不到指定的路径. & ...
随机推荐
- 排序小记【2】对 struct 的排序
有了前面的内容,对于一般的排序已经没有问题了,但是有时候排序的要求可能会有点刁... 举个简单的例子,应该是NOIP2009的分数线划定,差不多算是一个比较高级的排序(吧). 多关键字排序(?) 我一 ...
- UML整体概括
UML (Unified Modeling Language)为面向对象软件设计提供统一的.标准的.可视化的建模语言.适用于描述以用例为驱动,以体系结构为中心的软件设计的全过程. UML的定义包括UM ...
- noip 2008 传纸条
题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...
- [BZOJ 1901] Dynamic Rankings
Link: BZOJ 1901 传送门 Solution: 带修改主席树的模板题 对于静态区间第$k$大直接上主席树就行了 但加上修改后会发现修改时复杂度不满足要求了: 去掉/增加第$i$位上的值时要 ...
- 【推导】Codeforces Round #411 (Div. 1) A. Find Amir
1 2 3 4 5 6 7 4-5-3-6-2-7-1 答案是(n-1)/2 #include<cstdio> using namespace std; int n; int main() ...
- 【概率DP】BZOJ4318-OSU!
[题目大意] 一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的01串.在这个串中连续的 X个1可以贡献X^3 的分数,这x个1不能被其他连续的1所包含( ...
- 搭建vsftpd
安装完软件以后 1.建立用户 adduser ftp passwd 密码 2.修改vsftp.conf文件 anonymous_enable改为NO,阻止匿名上传 Anon_mkdir_write_e ...
- [转]Spring Security 可动态授权RBAC权限模块实践
RBAC:基于角色的访问控制(Role-Based Access Control) 先在web.xml 中配置一个过滤器(必须在Struts的过滤器之前) <filter> <fil ...
- Codeforces Beta Round #1 B. Spreadsheets 模拟
B. Spreadsheets 题目连接: http://www.codeforces.com/contest/1/problem/B Description In the popular sprea ...
- Ubuntu中APache+mod_pyhon
安装apache 1.sudo apt-get install Apache2 Apxs(Apache extension tool既apache扩展模块的工具)的安装: 1.sudo apt-get ...