docker exec 與 docker attach 區別

docker exec 與 docker attach 區別

2016年05月17日 10:21:38 閱讀數:2463更多linux

我的分類: Docker/k8s/mesos日誌docker

版權聲明:本文爲博主原創文章,未經博主容許不得轉載。 https://blog.csdn.net/zongyimin/article/details/51434072運維

Docker exec與Docker attach

不管是開發者是運維人員,都常常有須要進入容器的訴求。 
目前看,主要的方法不外乎如下幾種: 
1. 使用ssh登錄進容器 
2. 使用nsenter、nsinit等第三方工具 
3. 使用Docker自己提供的工具ssh

方法1須要在容器中啓動sshd,存在開銷和攻擊面增大的問題。同時也違反了Docker所倡導 
的一個容器一個進程的原則。 
方法2須要額外學習使用第三方工具。 
因此大多數狀況最好仍是使用Docker原生方法,Docker目前主要提供了Docker exec和 
Docker attach兩個命令。工具

如下在docker1.1上及以上驗證。學習

Docker attach

Docker attach能夠attach到一個已經運行的容器的stdin,而後進行命令執行的動做。 
可是須要注意的是,若是從這個stdin中exit,會致使容器的中止。ui

 
  1.  
  2. [root@localhost temp]# docker psspa

  3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES.net

  4. 2327e7eab0ed busybox:buildroot-2014.02 "/bin/sh" About a minute ago Up About a minute bb2日誌

  5. [root@localhost temp]# docker attach bb2

  6. / # ls

  7. bin dev etc home lib lib64 linuxrc media mnt opt proc root run sbin sys tmp usr var

  8. / # pwd

  9. /

  10. / #

Docker exec

關於-i、-t參數

能夠看出只用-i時,因爲沒有分配僞終端,看起來像pipe執行同樣。可是執行結果、命令 
返回值均可以正確獲取。

 
  1.  
  2. [root@localhost temp]# docker exec -i bb2 /bin/sh

  3. date

  4. Tue Jul 14 04:01:11 UTC 2015

  5. echo $?

  6. 0

  7. dir

  8. /bin/sh: dir: not found

  9. echo $?

  10. 127

使用-it時,則和咱們日常操做console界面相似。並且也不會像attach方式由於退出,致使 
整個容器退出。 
這種方式能夠替代ssh或者nsenter、nsinit方式,在容器內進行操做。

 
  1.  
  2. [root@localhost temp]# docker exec -it bb2 /bin/sh

  3. / # pwd

  4. /

  5. / # echo $?

  6. 0

  7. / # dir

  8. /bin/sh: dir: not found

  9. / # echo $?

  10. 127

若是隻使用-t參數,則能夠看到一個console窗口,可是執行命令會發現因爲沒有得到stdin 
的輸出,沒法看到命令執行狀況。

 
  1.  
  2. [root@localhost temp]# docker exec -t bb2 /bin/sh

  3. / # pwd

  4.  
  5. hanging....

  6. [root@localhost temp]# docker exec -t bb2 pwd

  7. /

  8. [root@localhost temp]# echo $?

  9. 0

  10. [root@localhost temp]# docker exec -t bb2 dir

  11. 2015/07/14 04:03:57 docker-exec: failed to exec: exec: "dir": executable file not found in $PATH

  12. [root@localhost temp]# echo $?

  13. 0

docker exec執行後,會命令執行返回值。(備註Docker1.3彷佛有Bug,不能正確返回命令執行結果)

 
  1.  
  2. [root@localhost temp]# docker exec -it bb cat /a.sh

  3. echo "running a.sh"

  4. exit 10

  5. [root@localhost temp]# docker exec -t bb /a.sh

  6. running a.sh

  7. [root@localhost temp]# echo $?

  8. 10

  9. [root@localhost temp]# docker exec -it bb /a.sh

  10. running a.sh

  11. [root@localhost temp]# echo $?

  12. 10

  13. [root@localhost temp]# docker exec -i bb /a.sh

  14. running a.sh

  15. [root@localhost temp]# echo $?

  16. 10

關於-d參數

在後臺執行一個進程。能夠看出,若是一個命令須要長時間進程,使用-d參數會很快返回。 
程序在後臺運行。

 
  1.  
  2. [root@localhost temp]# docker exec -d bb2 /a.sh

  3. [root@localhost temp]# echo $?

  4. 0

若是不使用-d參數,因爲命令須要長時間執行,docker exec會卡住,一直等命令執行完成  才返回。

相關文章
相關標籤/搜索