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,会导致容器的停止。
-
[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会卡住,一直等命令执行完成 才返回。
(adsbygoogle = window.adsbygoogle || []).push({});
- SQL学习之使用常用函数处理数据
- Javascript快速入门(上篇)
- SQL练习之不反复执行相同的计算
- SQL练习之求解填字游戏
- 快速入门系列--WCF--08扩展与新特性
- SQL练习之两个列值的交换
- Parcel,零配置开发 React 应用!
- 像 React Native 开发 APP 一样,用wn-cli 开发 weapp (微信小程序)
- 正则表达式快速入门
- JavaScript之<script>标签简介
- 数控机床数控系统选择4大关键要素
- Python快速入门
- Jquer学习之jQuery(function(){})与(function(){})(jQuery)之间的区别
- 服务端常见性能隐患分享
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浅析Linux下利用coredump技术追查进程崩溃原因
- Linux下rpm、yum和源码三种安装方式详细介绍
- linux(center OS7)安装JDK、tomcat、mysql 搭建java web项目运行环境
- 帮助你排序文本文件的 Awk 命令行或脚本(推荐)
- Centos7备份文件时备份文件加入备件日期
- Linux traceroute命令使用详解
- Linux 添加开机启动方法(服务/脚本)
- 概述Linux TTY/PTS的区别
- 在 Linux 命令行发送邮件的 5 种方法(推荐)
- Linux下Jenkins忘记密码的操作步骤
- Linux系统下Tomcat使用80端口的方法
- python 虚拟环境安装与卸载方法及遇到问题
- keras训练浅层卷积网络并保存和加载模型实例
- Python分析最近大火的网剧《隐秘的角落》
- PHP使用PDO操作sqlite数据库应用案例