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 中,我们需要将各种后端/前端 ...
随机推荐
- SpringBoot系列(十)优雅的处理统一异常处理与统一结果返回
SpringBoot系列(十)统一异常处理与统一结果返回 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列 ...
- Python数据分析入门与实践 学习
pandas是一个Python语言的软件包,在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础编程库.本文是对它的一个入门教程.pandas提供了快速,灵活和富有表现力的数据结构 ...
- 微信jssdk遇到的一些问题汇总
1.用户手动去触发的接口可以直接调用比如wx.startRecord(); 但是写在页面加载完成里就无效,需要写在 wx.ready(function(){ wx.startRecord(); }); ...
- Dockerfle创建镜像
简介 Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行. 一般的,Dockerfile 分为四部分:基础镜像信息.维护者信息.镜像操作指令和容器启动时执行指令. # This ...
- 【集群实战】NFS服务常见故障排查和解决方法
NFS,全名叫Network File System,中文叫网络文件系统,是Linux.UNIX系统的分布式文件系统的一个组成部分,可实现在不同网络上共享远程文件系统. NFS由Sun公司开发,目前已 ...
- 【linux运维】rsync+inotify与sersync+rsync实时数据同步笔记
Rsync(remote sync)远程同步工具,通过rsync可以实现对远程服务器数据的增量备份通过,但rsync自身也有缺陷,同步数据时,rsync采用核心算法对远程服务器的目标文件进行对比,只进 ...
- ubuntu 14.04安装pycharm 社区版
https://blog.csdn.net/u013733432/article/details/54425831 转载于:https://www.cnblogs.com/liu-shiliu/p/1 ...
- linux下报错:error while loading shared libraries
linux执行bin程序报: error while loading shared libraries:libncurses.so.5: cannot open shared object file: ...
- CF思维联系–CodeForces - 222 C Reducing Fractions(数学+有技巧的枚举)
ACM思维题训练集合 To confuse the opponents, the Galactic Empire represents fractions in an unusual format. ...
- UVA352 The Seasonal War
本文为UserUnknown原创 题目本身不难理解,就是深搜(或广搜,有可能以后会加在这里). 但是洛谷的题目中没有截到输入输出的格式,下面是我从UVA复制下来的样例: Sample input 6 ...