不論是開發者是運維人員,都經常有需要進入容器的訴求。
目前看,主要的方法不外乎以下幾種:
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...