Docker exec與Docker attach


轉載博客地址:http://blog.csdn.net/halcyonbaby
新浪微博:@尋覓神跡

內容系本人學習、研究和總結,如有雷同,實屬榮幸!

==================

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM