docer run 、docker attach 与 docker exec的区别
进入容器的方式有以下三种:
- 使用ssh登陆进容器
 - 使用nsenter、nsinit等第三方工具
 - 使用Docker本身提供的工具
 
最佳方案为使用Docker本身提供的工具
- docker run;创建和启动一个新的容器实例,操作对象是镜像,选项较多,如果你要创建和启动一个容器,只能用run;
 - docker exec: 在已运行的容器中,执行命令,操作对象是容器,如果你要进入已运行的容器,并且执行命令,用exec;
 - docker attach: 同样操作的是已运行的容器,可以将本机标准输入(键盘输入)输到容器中,也可以将容器的输出显示在本机的屏幕上,如果你想查看容器运行过程中产生的标准输入输出,用attach;
 
1) docker run
官方命令解释:Run a command in a new container,翻译过来是在一个新的容器中中运行命令,所以主要作用有两点:一是创建和启动一个新的容器,二是启动时通过加选项和参数在容器运行命令;
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    IMAGE: 镜像名称,run操作的是镜像images
    COMMAND:命令,可选
# docker run -p 80:80 -d  --name=nginx-1 nginx    // 在后台创建和启动容器nginx-1,不执行命令
# docker run -p 81:80 -d  --name=nginx-2 nginx bash -c 'ls & tail -f /dev/null'  // 在后台创建和启动容器nginx-2,同时执行组合命令
# docker logs nginx-2  // 查看命令输出,可以看到ls执行的结果
2) docker exec
docker exec [options] CONTAINER COMMAND [ARG...]
    CONTAINER:容器名称或ID,必选,看出exec操作的对象是容器
    COMMAND:命令,必选
官方命令解释:Run a command in a running container,翻译过来就是在一个正在运行的容器中执行命令,exec是针对已运行的容器实例进行操作,在已运行的容器中执行命令,不创建和启动新的容器。
# docker run -p 82:80 -d  --name=nginx-3 nginx
# docker exec -it nginx-3 /bin/bash  // 直接进入容器nginx-3,执行bash
# docker exec nginx-3 bash -c "ls"   // 在容器中执行命令 ls,输出结果
如果只使用-t参数,则可以看到一个console窗口,但是执行命令会发现由于没有获得stdin
的输出,无法看到命令执行情况。
[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
可以看出只用-i时,由于没有分配伪终端,看起来像pipe执行一样。但是执行结果、命令
返回值都可以正确获取。
[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
使用-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
3) docker attach
docker attach [OPTIONS] CONTAINER
    CONTAINER:容器名称或ID,必选,attach的操作对象也是容器
官方命令解释:Attach local standard input, output, and error streams to a running container,翻译过来,将本机的标准输入(键盘)、标准输出(屏幕)、错误输出(屏幕)附加到一个运行的容器,也就是说本机的输入直接输到容器中,容器的输出会直接显示在本机的屏幕上。
    # docker run -p 83:80 -d  --name=nginx-4 nginx
    # docker attach nginx-4
    // 本机上再打开一个终端,输入以下命令,观察上面终端的输出
    # curl localhost:83   // nginx输出正常访问记录
    # curl localhost:84/index  // nginx输出访问错误记录
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
/
/ #
常用参数说明
这三个参数(-i, -t, -d)是啥意思
Options Mean
-i 以交互模式运行容器,通常与 -t 同时使用;
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-d 后台运行容器,并返回容器ID;
-v 挂载宿主机一个目录至容器目录
--restart=always 创建容器时添加参数 --restart=always 后,当 docker 重启时,容器自动启动。(若一开始没有加上,可以执行:docker container update --restart=always 容器名字 进行变更)
--name 容器名称
-p 宿主机器服务端口:容器机器服务端口
譬如我要启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定:
# docker run -it -v /test:/soft centos /bin/bash
冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。
docer run 、docker attach 与 docker exec的区别的更多相关文章
- docker attach 和 docker exec
		
docker attach docker attach -- Attach to a running container. 常用选项: --sig-proxy=true:Proxy all recei ...
 - Docker学习之Docker容器基本使用
		
Docker学习之Docker容器基本使用 新建容器并启动 命令格式:docker run --options repository:tag 后台运行 命令格式:-d 已存在的容器相关操作 启动:do ...
 - docker学习:docker命令
		
帮助命令 自验证 docker version 详情信息 docker info 获取帮助 docker --help 镜像命令 列出本例主机上的镜像 docker images [OPTIONS] ...
 - Ubuntu下安装Docker,及Docker的一些常用命令操作
		
1.什么是 Docker Docker 是一个开源项目,Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案. Docker 的基础是 Linux 容器(LXC ...
 - Docker exec与Docker attach
		
转载博客地址:http://blog.csdn.net/halcyonbaby 新浪微博:@寻觅神迹 内容系本人学习.研究和总结,如有雷同,实属荣幸! ================== Docke ...
 - docker  attach 和  exec 用法区别
		
attach 用法 $ sudo docker attach 665b4a1e17b6 #by IDor$ sudo docker attach loving_heisenberg #by Name$ ...
 - 安装Docker时错误提示 "could not change group /var/run/docker.sock to docker: group docker not found"的解决方案
		
安装Dock服务,主要命令是 yum install docker. 但是在启动的时候报错:warning msg="could not change group /var/run/doc ...
 - Docker attach
		
Description Attach local standard input, output, and error streams to a running container Usage dock ...
 - Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock
		
在 Docker 容器里面使用 docker run/docker build? Docker 容器技术目前是微服务/持续集成/持续交付领域的第一选择.而在 DevOps 中,我们需要将各种后端/前端 ...
 
随机推荐
- Netty 中的心跳检测机制
			
心跳检测一般存在于建立长连接 或者 需要保活的场景. 心跳的使用场景 长连接的应用场景非常的广泛,比如监控系统,IM系统,即时报价系统,推送服务等等.像这些场景都是比较注重实时性,如果每次发送数据都要 ...
 - GOLANG 闭包和普通函数的区别
			
闭包和匿名函数是一回事 闭包使用完毕之后不会自动释放,值依然存在 普通函数调用完毕后,值会自动释放
 - css3 文本控制自动换行
			
text-overflow:ellipsis; white-space:nowrap; overflow:hidden;
 - JAVA企业级应用TOMCAT实战(二)
			
使用普通用户运行 使用普通用户来部署服务是比较安全的做法 [root@tomcat application]# useradd -u tomcat [root@tomcat application]# ...
 - 矩阵类的代码(C++)
			
The Codes of Matrix Class Matrix.h:#ifndef MATRIX_H#define MATRIX_H #include<iostream> #includ ...
 - Element UI表格组件技巧:如何简洁实现跨页勾选、跨页统计功能
			
业务场景 在使用Element UI的Table组件时,常常面对这样的业务需求: 表格数据的每一项都要提供勾选框,当切换分页时,能够记忆所有页面勾选的数据,以实现批量提交不同页面勾选数据的功能.并且, ...
 - MySQL - Show Global Status 整理
			
2019独角兽企业重金招聘Python工程师标准>>> MySQL - Show Global Status 整理 原文来源:MySQL 5.5 Reference Manual 部 ...
 - 打造livecd的注意事项
			
一:在CentOS.ks的定制脚本中,删除syslinux组件:出错提示: /usr/lib/python2.6/site-packages/imgcreate/errors.py:45: Depre ...
 - PHP字符串全排列算法
			
<?php /** * PHP字符串全排列算法 */ $results = []; $arr = []; function bfs($start) { global $arr; global $ ...
 - bzoj4318 OSU!和bzoj 3450 Tyvj1952 Easy
			
这俩题太像了 bzoj 3450 Tyvj1952 Easy Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有n次点 ...