1 回答

TA貢獻(xiàn)1835條經(jīng)驗(yàn) 獲得超7個(gè)贊
Docker exec與Docker attach
不論是開發(fā)者是運(yùn)維人員,都經(jīng)常有需要進(jìn)入容器的訴求。
目前看,主要的方法不外乎以下幾種:
1. 使用ssh登陸進(jìn)容器
2. 使用nsenter、nsinit等第三方工具
3. 使用docker本身提供的工具
方法1需要在容器中啟動(dòng)sshd,存在開銷和攻擊面增大的問題。同時(shí)也違反了Docker所倡導(dǎo)
的一個(gè)容器一個(gè)進(jìn)程的原則。
方法2需要額外學(xué)習(xí)使用第三方工具。
所以大多數(shù)情況最好還是使用Docker原生方法,Docker目前主要提供了Docker exec和
Docker attach兩個(gè)命令。
以下在fedora21,docker1.7上驗(yàn)證。
Docker attach
Docker attach可以attach到一個(gè)已經(jīng)運(yùn)行的容器的stdin,然后進(jìn)行命令執(zhí)行的動(dòng)作。
但是需要注意的是,如果從這個(gè)stdin中exit,會(huì)導(dǎo)致容器的停止。
[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
關(guān)于-i、-t參數(shù)
可以看出只用-i時(shí),由于沒有分配偽終端,看起來像pipe執(zhí)行一樣。但是執(zhí)行結(jié)果、命令
返回值都可以正確獲取。
[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時(shí),則和我們平常操作console界面類似。而且也不會(huì)像attach方式因?yàn)橥顺?,?dǎo)致
整個(gè)容器退出。
這種方式可以替代ssh或者nsenter、nsinit方式,在容器內(nèi)進(jìn)行操作。
[root@localhost temp]# docker exec -it bb2 /bin/sh
/ # pwd
/
/ # echo $?
0
/ # dir
/bin/sh: dir: not found
/ # echo $?
127
如果只使用-t參數(shù),則可以看到一個(gè)console窗口,但是執(zhí)行命令會(huì)發(fā)現(xiàn)由于沒有獲得stdin
的輸出,無法看到命令執(zhí)行情況。
[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執(zhí)行后,會(huì)命令執(zhí)行返回值。(備注Docker1.3似乎有Bug,不能正確返回命令執(zhí)行結(jié)果)
[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
關(guān)于-d參數(shù)
在后臺(tái)執(zhí)行一個(gè)進(jìn)程??梢钥闯觯绻粋€(gè)命令需要長時(shí)間進(jìn)程,使用-d參數(shù)會(huì)很快返回。
程序在后臺(tái)運(yùn)行。
[root@localhost temp]# docker exec -d bb2 /a.sh
[root@localhost temp]# echo $?
0
如果不使用-d參數(shù),由于命令需要長時(shí)間執(zhí)行,docker exec會(huì)卡住,一直等命令執(zhí)行完成
才返回。
[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 回答
- 0 關(guān)注
- 3757 瀏覽
添加回答
舉報(bào)