Docker系列 exec與attach(四)

2021-07-23 17:00:38 字數 3599 閱讀 6213

不論是開發者是運維人員,都經常有需要進入容器的訴求。 

目前看,主要的方法不外乎以下幾種: 

1. 使用ssh登陸進容器 

2. 使用nsenter、nsinit等第三方工具 

3. 使用docker本身提供的工具

方法1需要在容器中啟動sshd,存在開銷和攻擊面增大的問題。同時也違反了docker所倡導 

的乙個容器乙個程序的原則。 

方法2需要額外學習使用第三方工具。 

所以大多數情況最好還是使用docker原生方法,docker目前主要提供了docker exec和 

docker attach兩個命令。

以下在fedora21,docker1.7上驗證。

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

// #

關於-i、-t引數

可以看出只用-i時,由於沒有分配偽終端,看起來像pipe執行一樣。但是執行結果、命令 

返回值都可以正確獲取。

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

date

tue jul 14 04:01:11 utc 2015

echo $?

0dir

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

關於我(個人網域名稱)

我的開源專案集github

期望和大家一起學習,共同進步,共勉,o(∩_∩)o謝謝

歡迎交流問題,可加個人qq 469580884,

或者,加我的群號751925591,一起**交流問題

不講虛的,只做實幹家

exec系列函式

1.exec家族一共有六個函式,分別是 1 int execl const char path,const char arg,2 int execle const char path,const char arg,char const envp 3 int execv const char path...

exec 系列函式

本質 用新的程式代替新的程序,可以指定要執行程式的檔案exec函式如下 intexecl const char path,const char arg,path 指定路徑 相對 絕對路徑 arg 相當於命令列引數,最後加上null。intexeclp const char file,const ch...

Linux 之exec系列函式

當程序呼叫exec系列函式中的任乙個時,該程序使用者空間資源 正文 資料 堆 棧 完全由新程式替代。因為呼叫exec並不建立新程式,如果無特殊指示 程序核心資訊基本不用修改 1 execl函式宣告如下 from usr include unistd.h int execl const char pa...