docker run、exec和attach使用和区别
admin
2024-05-22 05:52:30
0

结论

  • docker run:创建和启动一个新的容器实例操作对象是镜像,选项较多,如果你要创建和启动一个容器,只能用run;
  • docker exec:在已运行的容器中,执行命令,操作对象是容器,如果你要进入已运行的容器,并且执行命令,用exec;(只是进入容器执行命令,退出后,容器继续运行)
  • docker attach:同样操作的是已运行的容器,可以将本机标准输入(键盘输入)输到容器中,也可以将容器的输出显示在本机的屏幕上,如果你想查看容器运行过程中产生的标准输入输出,用attach;(attach将容器的输入输出附加到本机的输入输出中,类似于线程的附加,退出后,容器结束运行)

docker run

官方命令解释:Run a command in a new container,翻译过来是在一个新的容器中中运行命令,所以主要作用有两点:一是创建和启动一个新的容器,二是启动时通过加选项和参数在容器运行命令;

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]IMAGE: 镜像名称,run操作的是镜像imagesCOMMAND:命令,可选
# 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执行的结果

以上可以看出,docker run成功执行一次,必然产生一个新的容器实例。

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,输出结果

关于-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
/ # pwdhanging....
[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 attach

docker attach [OPTIONS] CONTAINERCONTAINER:容器名称或ID,必选,attach的操作对象也是容器

官方命令解释:Attach local standard input, output, and error streams to a running container,翻译过来,将本机的标准输入(键盘)、标准输出(屏幕)、错误输出(屏幕)附加到一个运行的容器,也就是说本机的输入直接输到容器中,容器的输出会直接显示在本机的屏幕上。

Docker attach可以attach到一个已经运行的容器的stdin,然后进行命令执行的动作。
但是需要注意的是,如果从这个stdin中exit,会导致容器的停止。 

    # docker run -p 83:80 -d  --name=nginx-4 nginx # docker attach nginx-4// 本机上再打开一个终端,输入以下命令,观察上面终端的输出# curl localhost:83   // nginx输出正常访问记录# curl localhost:84/index  // nginx输出访问错误记录

参考:小知识:docker run、exec和attach使用和区别_壹零Boy的博客-CSDN博客_docker run attach 

https://huaweicloud.csdn.net/63311509d3efff3090b51abc.html?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Eactivity-1-46884605-blog-124710298.pc_relevant_vip_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Eactivity-1-46884605-blog-124710298.pc_relevant_vip_default&utm_relevant_index=2

相关内容

热门资讯

疑似新模型海外惊艳!智谱再度飙... 格隆汇2月10日|延续昨日强势,港股市场AI概念股今日再度集体走强,其中,“全球大模型第一股”智谱(...
原创 特... 特朗普上任已逾一年,他推行的关税政策像一阵狂风,搅动了全球的经贸秩序。对于美国经济的未来走向,诺贝尔...
原创 一... 2026年2月9日晚的美股市场,上演了一场让很多投资者既兴奋又意外的行情。 本以为大涨之后总要歇一歇...
电商领域侵权问题获关注,知识产... 2月10日,知识产权保护概念持续拉升,截至发稿,成分股读客文化(301025.SZ)、中文在线(30...
原创 1... 12艘满载着俄罗斯乌拉尔原油的超级油轮,正像一群迷路的巨鲸,散落在从马六甲海峡到中国南海的广阔水域里...
凯思凯迪完成近5亿融资:中平资... 雷递网 乐天 2月10日 凯思凯迪宣布近期完成近5亿元新一轮融资,本轮融资由中平资本领投,国寿资本、...
美国出现小米YU7测试车?雷军... 近日,网上传出小米YU7 MAX测试车出现在美国道路的消息,难不成小米汽车要进军美国市场了? 事实...
2026-2032年中国食糖行... 共研网发布的《2026-2032年中国食糖行业深度调研与市场调查预测报告》共十二章。首先介绍了食糖行...
原创 美... 特朗普上台后不久,便对进口产品挥起了关税大棒。从钢铝到汽车零部件,一系列严苛的关税政策自2025年春...
盘中必读|字节旗下Seedan... 2月10日,AI短剧概念延续强势,荣信文化(301231)、捷成股份(300182)、欢瑞世纪(00...
2月25日起预约!申请退税别错... 近日,国家税务总局发布通告,明确2025年度个人所得税综合所得汇算清缴办理时间为2026年3月1日至...
再迎反弹!现货黄金重回5000... 贵金属再迎反弹。 2月9日,黄金、白银价格同步拉升。现货黄金再次突破关键阻力位,重回5000美元/盎...
YU7现身加州高速,小米会不会... 2月10日,雷军发文: 前段时间,一辆YU7行驶在美国加州的高速公路上,挂着当地的测试车牌。 很多人...
宁波迎来开年第一股!爱芯元智港... 转自:东南财金 2月10日,爱芯元智(0600.HK)正式于港交所主板挂牌上市,成为港股边缘计算AI...
2026年春节档新片预售票房已... 2月10日,市场早盘窄幅震荡,三大指数小幅下跌,北证50指数盘中跌超1%。沪深两市半日成交额1.39...
原创 俄... 俄罗斯黄金大量涌入中国,这背后究竟隐藏了怎样的玄机?根据2025年海关的数据,单单实物净进口量就高达...
亚太药业:聘任邱中勋为公司总经... 每经AI快讯,亚太药业2月9日晚间发布公告称,因公司控制权已发生变更,根据《股份转让协议》约定等相关...
原创 中... 我们中国的女富豪中,不乏靠着刻苦努力一步步爬上顶端的典型,也有不少依靠精准眼光与幸运投资一跃而成的成...
黄金交易提醒:美元疲软+央行“... 汇通财经APP讯——2026年2月的第二个星期,全球金融市场的心脏,似乎正随着那剧烈跳动。金价在50...
多措并举推动投资止跌回稳 国家统计局数据显示,2025年,全国固定资产投资同比下降3.8%。分领域看,基础设施投资下降2.2%...