亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

docker exec 和 docker attach的區別?

docker exec 和 docker attach的區別?

一只萌萌小番薯 2018-09-04 10:07:56
docker exec 和 docker attach的區別
查看完整描述

1 回答

?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

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]#

查看完整回答
1 反對 回復 2018-09-18
  • 1 回答
  • 0 關注
  • 3726 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號