1 docker run
run是最常用的命令,他是docker creat和docker start命令的組合,創建容器並啟動它。run的參數比較難理解的是-i 和-t 以及-d,分別說說這三個。
-i
-i 參數是keep STDIN open even if not attached,意思就是會把交互界面保留着。但是要看容器的PID1,或者說看容器的CMD是什么,有些CMD程序並不會理會任何輸入,也就是說它就沒有等着你輸入命令,這時候你輸入什么都是無效的。並且,因為linux對pid1的特殊處理,它也不會理會信號,所以你只能按ctrl+p + ctrl+q,把程序放到后台。(但通常都要run -it一起使用才有效)
-t
allocate a pseudo-TTY.作用是分配一個虛擬的終端,我的理解就是,有了-t參數,這個docker就會被分配一個終端,在docker中啟動bash就會有提示符。不過,-it總是一起出現的。
-d
run container in background and print container ID,就是在后台運行容器。相當於進去之后,按了ctrl+p + ctrl+q。所以可以docker attch回去。在后台運行的容器,只能通過網絡和它交互了。
-a
可以定義到底是attach STDIN、STDOUT\STDERR,如果沒有定義,則默認是 attach to both stdout and stderr。
--rm
容器退出后,自動刪除容器
--name
為容器取一個名字
--p hostport:containerport
設置端口轉發
總結
要啟動一個容器,這個容器的pid1應用是一個不需要與用戶命令行交互的,比如一個什么web應用服務,那么就用-d參數,然容器運行在后台,好好服務。比如:
docker run --name mywebserver -d -p 80:80 my_image nginx -g 'daemon off;'
要啟動一個容器並且用這個容器來做命令操作,他的pid1進程是一個和用戶交互的程序,比如啟動一台busybox(pid1是bash),那么用 -it。比如:
docker run -a stdin -a stdout -i -t ubuntu /bin/bash
或者
docker run --name myubuntu -it ubuntu /bin/bash
如果要工作后即焚毀,那么就帶上--rm就好了。
注意
如果容器要從管道中獲取輸入,就不允許帶-t了。比如:
$ echo test | docker run -i busybox cat
2 docker start
start是啟動一個已經存在的容器,他有兩個參數-a 和-i。
-a
attach STDOUT/STDERR。 -a參數帶上了的話,那么會把pid1程序的輸出都帶到終端上
-i
attach container's STDIN。 -i參數是為了讓容器相應輸入,作用其實和run中的-i一樣。
總結
啟動一個容器作為服務,就什么參數都不要帶,讓他運行在后台。
啟動一個容器作為交互應用,就帶上-i。
3 docker attach
attach命令把一個后台運行的容器搞到前台來,這樣你就可以看到他們的輸出,並且使用輸入了。
--no-stdin
關閉輸入,這樣你就不能使用輸入了
--sig-proxy
信號轉發,默認開啟,這樣DMD進程就可以收到你的信號了。
總結
把后台邊前台,基本上就是一種單一的用法docker attach container_name了。
注意
(1)因為attach是進入了和CMD程序交互,但是CMD程序未必就會相應你的輸入(一般程序都不會相應你的輸入吧,因為他有沒有動標准流中讀取什么東西),所以不要以為程序死了。
(2)因為linux對PID1程序的特殊照顧,所以它本身不會相應任何信號,除非程序自己定義了相應信號的處理方案。也就是說,你按ctrl+c可能沒什么反應哦。
(3)因為attach對stdout和stderr做了1M的緩存,如果緩存占滿了,輸出就會有卡頓感,所以如果程序有大量的輸出,就不要用attach去看,而應該用docker logs去看log哦。
(4)如果容器建立的時候是tty-enabled container (i.e.: launched with -t
),那么就不允許重定向輸入哦。
attach的退出碼是容器退出后的退出碼。
4 docker exec
這個命令是用已經運行的容器執行命令。需要注意的是,如果容器關閉后再次運行,那么用exec命令執行的命令是不會自己再次執行的。
-d
讓命令在后台執行。
-e
設置環境變量
-i -t
運行交互命令的時候用
-u -w
分別設置命令運行的用戶和work directory。
總結
你要運行交互的程序,那么就用-it。否則,就什么參數都不帶
你要改變用戶或者工作目錄,則使用-u或-w。