標籤:

Docker入門 | 學習第一個Docker容器

在本文中,我們將邁出使用Docker的第一步,學習第一個Docker容器。還會介紹如何與Docker進行交互的基本知識。

1 確保Docker已經就緒

首先,我們會查看Docker是否能正常工作,然後學習基本的Docker的工作流:創建並管理容器。我們將瀏覽容器的典型生命周期:從創建、管理到停止,直到最終刪除。

第一步,查看docker程序是否存在,功能是否正常,如代碼清單3-1所示。

代碼清單3-1 查看docker程序是否正常工作

$ sudo docker infonContainers: 1nImages: 8nStorage Driver: aufsn Root Dir: /var/lib/docker/aufsn Backing Filesystem: extfsn Dirs: 10nExecution Driver: native-0.2nKernel Version: 3.13.0-43-genericnOperating System: Ubuntu 14.04.2 LTSnCPUs: 1nTotal Memory: 994 MiBnName: riemannanID: DOIT:XN5S:WNYP:WP7Q:BEUP:EBBL:KGIX:GO3V:NDR7:YW6E:VFXT:FXHMnWARNING: No swap limit supportn

在這裡我們調用了docker可執行程序的info命令,該命令會返回所有容器和鏡像(鏡像即是Docker用來構建容器的「構建塊」)的數量、Docker使用的執行驅動和存儲驅動(execution and storage driver),以及Docker的基本配置。

在前面幾章已經介紹過,Docker是基於客戶端-伺服器構架的。它有一個docker程序,既能作為客戶端,也可以作為伺服器端。作為客戶端時,docker程序向Docker守護進程發送請求(如請求返回守護進程自身的信息),然後再對返回的請求結果進行處理。

2 運行我們的第一個容器

現在,讓我們嘗試啟動第一個Docker容器。我們可以使用docker run命令創建容器,如代碼清單3-2所示。docker run命令提供了Docker容器的創建到啟動的功能,在本書中我們也會使用該命令來創建新容器。

代碼清單3-2 運行我們的第一個容器

$ sudo docker run -i -t ubuntu /bin/bashnUnable to find image ubuntu locallynubuntu:latest: The image you are pulling has been verifiedn511136ea3c5a: Pull completend497ad3926c8: Pull completenccb62158e970: Pull completene791be0477f2: Pull completen3680052c0f5c: Pull completen22093c35d77b: Pull completen5506de2b643b: Pull completenStatus: Downloaded newer image for ubuntu:latestnroot@fcd78e1a3569:/#n

提示

官方文檔列出了完整的Docker命令列表,也可以使用docker help獲取這些命令。此外,還可以使用Docker的man頁(即執行man docker-run)。

代碼清單3-3所示的命令的輸出結果非常豐富,下面來逐條解析。

代碼清單3-3 docker run命令

$ sudo docker run -i -t ubuntu /bin/bashn

首先,我們告訴Docker執行docker run命令,並指定了-i和-t兩個命令行參數。-i標誌保證容器中STDIN是開啟的,儘管我們並沒有附著到容器中。持久的標準輸入是互動式shell的「半邊天」,-t標誌則是另外「半邊天」,它告訴Docker為要創建的容器分配一個偽tty終端。這樣,新創建的容器才能提供一個互動式shell。若要在命令行下創建一個我們能與之進行交互的容器,而不是一個運行後台服務的容器,則這兩個參數已經是最基本的參數了。

提示

官方文檔上列出了docker run命令的所有標誌,此外還可以用命令docker help run查看這些標誌。或者,也可以用Docker的man頁(也就是執行man docker-run命令)。

接下來,我們告訴Docker基於什麼鏡像來創建容器,示例中使用的是ubuntu鏡像。ubuntu鏡像是一個常備鏡像,也可以稱為「基礎」(base)鏡像,它由Docker公司提供,保存在Docker Hub****Registry上。可以以ubuntu基礎鏡像(以及類似的fedora、debian、centos等鏡像)為基礎,在選擇的操作系統上構建自己的鏡像。到目前為止,我們基於此基礎鏡像啟動了一個容器,並且沒有對容器增加任何東西。

提示

我們將在第4章對鏡像做更詳細的介紹,包括如何構建我們自己的鏡像。

那麼,在這一切的背後又都發生了什麼呢?首先Docker會檢查本地是否存在ubuntu鏡像,如果本地還沒有該鏡像的話,那麼Docker就會連接官方維護的Docker Hub Registry,查看Docker Hub中是否有該鏡像。Docker一旦找到該鏡像,就會下載該鏡像並將其保存到本地宿主機中。

隨後,Docker在文件系統內部用這個鏡像創建了一個新容器。該容器擁有自己的網路、IP地址,以及一個用來和宿主機進行通信的橋接網路介面。最後,我們告訴Docker在新容器中要運行什麼命令,在本例中我們在容器中運行/bin/bash命令啟動了一個Bash shell。

當容器創建完畢之後,Docker就會執行容器中的/bin/bash命令,這時就可以看到容器內的shell了,就像代碼清單3-4所示。

代碼清單3-4 第一個容器的shell

root@f7cbdac22a02:/#n

3 使用第一個容器

現在,我們已經以root用戶登錄到了新容器中,容器的ID f7cbdac22a02``,乍看起來有些令人迷惑的字元串。這是一個完整的Ubuntu系統,可以用它來做任何事情。下面就來研究一下這個容器。首先,我們可以獲取該容器的主機名,如代碼清單3-5所示。

代碼清單3-5 檢查容器的主機名

root@f7cbdac22a02:/# hostnamenf7cbdac22a02n

可以看到,容器的主機名就是該容器的ID。再來看看/etc/hosts文件,如代碼清單3-6所示。

代碼清單3-6 檢查容器的/etc/hosts文件

root@f7cbdac22a02:/# cat /etc/hostsn172.17.0.4 f7cbdac22a02n127.0.0.1 localhostn::1 localhost ip6-localhost ip6-loopbacknfe00::0 ip6-localnetnff00::0 ip6-mcastprefixnff02::1 ip6-allnodesnff02::2 ip6-allroutersn

Docker已在hosts文件中為該容器的IP地址添加了一條主機配置項。再來看看容器的網路配置情況,如代碼清單3-7所示。

代碼清單3-7 檢查容器的介面

root@f7cbdac22a02:/# ip an1: lo: <LOOPBACK,UP,LOWER_UP> mtu 1500 qdisc noqueue staten UNKNOWN group defaultnlink/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00ninet 127.0.0.1/8 scope host loninet6 ::1/128 scope hostnvalid_lft forever preferred_lft forevern899: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fastn state UP group default qlen 1000nlink/ether 16:50:3a:b6:f2:cc brd ff:ff:ff:ff:ff:ffninet 172.17.0.4/16 scope global eth0ninet6 fe80::1450:3aff:feb6:f2cc/64 scope linknvalid_lft forever preferred_lft forevern

可以看到,這裡有lo的環回介面,還有IP為172.17.0.4的標準eth0網路介面,和普通宿主機是完全一樣的。我們還可以查看容器中運行的進程,如代碼清單3-8所示。

代碼清單3-8 檢查容器的進程

root@f7cbdac22a02:/# ps -auxnUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDnroot 1 0.0 0.0 18156 1936 ? Ss May30 0:00 /bin/bashnroot 21 0.0 0.0 15568 1100 ? R+ 02:38 0:00 ps -auxn

接下來要幹些什麼呢?安裝一個軟體包怎麼樣?如代碼清單3-9所示。

代碼清單3-9 在第一個容器中安裝軟體包

root@f7cbdac22a02:/# apt-get update && apt-get install vimn

通過上述命令,就在容器中安裝了Vim軟體。

用戶可以繼續在容器中做任何自己想做的事情。當所有工作都結束時,輸入exit,就可以返回到Ubuntu宿主機的命令行提示符了。

這個容器現在怎樣了?容器現在已經停止運行了!只有在指定的/bin/bash命令處於運行狀態的時候,我們的容器也才會相應地處於運行狀態。一旦退出容器,/bin/bash命令也就結束了,這時容器也隨之停止了運行。

但容器仍然是存在的,可以用docker ps -a命令查看當前系統中容器的列表,如代碼清單3-10所示。

代碼清單3-10 列出Docker容器

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESn1cd57c2cdf7f ubuntu:14.04 "/bin/bash" A minute Exitedn gray_cat n

默認情況下,當執行docker ps命令時,只能看到正在運行的容器。如果指定-a標誌的話,那麼docker ps命令會列出所有容器,包括正在運行的和已經停止的。

提示

也可以為docker ps命令指定-l標誌,列出最後一個運行的容器,無論其正在運行還是已經停止。也可以通過–format標誌,進一步控制顯示哪些信息,以及如何顯示這些信息。

從該命令的輸出結果中我們可以看到關於這個容器的很多有用信息:ID、用於創建該容器的鏡像、容器最後執行的命令、創建時間以及容器的退出狀態(在上面的例子中,退出狀態是0,因為容器是通過正常的exit命令退出的)。我們還可以看到,每個容器都有一個名稱。

注意

有3種方式可以唯一指代容器:短UUID(如f7cbdac22a02)、長UUID(如f7cbdac 22a02e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778)或者名稱(如gray_cat)。

4 容器命名

Docker會為我們創建的每一個容器自動生成一個隨機的名稱。例如,上面我們剛剛創建的容器就被命名為gray_cat。如果想為容器指定一個名稱,而不是使用自動生成的名稱,則可以用--name標誌來實現,如代碼清單3-11所示。

代碼清單3-11 給容器命名

$ sudo docker run --name bob_the_container -i -t ubuntu /bin/bashnroot@aa3f365f0f4e:/# exitn

上述命令將會創建一個名為bob_the_container的容器。一個合法的容器名稱只能包含以下字元:小寫字母a~z、大寫字母A~Z、數字0~9、下劃線、圓點、橫線(如果用正則表達式來表示這些符號,就是[a-zA-Z0-9``_``.-])。

在很多Docker命令中,都可以用容器的名稱來替代容器ID,後面我們將會看到。容器名稱有助於分辨容器,當構建容器和應用程序之間的邏輯連接時,容器的名稱也有助於從邏輯上理解連接關係。具體的名稱(如web、db)比容器ID和隨機容器名好記多了。我推薦大家都使用容器名稱,以更加方便地管理容器。

注意

我們將會在第5章詳細介紹如何連接到Docker容器。

容器的命名必須是唯一的。如果試圖創建兩個名稱相同的容器,則命令將會失敗。如果要使用的容器名稱已經存在,可以先用docker rm命令刪除已有的同名容器後,再來創建新的容器。

5 重新啟動已經停止的容器

bob_the_container容器已經停止了,接下來我們能對它做些什麼呢?如果願意,我們可以用下面的命令重新啟動一個已經停止的容器,如代碼清單3-12所示。

代碼清單3-12 啟動已經停止運行的容器

$ sudo docker start bob_the_containern

除了容器名稱,也可以用容器ID來指定容器,如代碼清單3-13所示。

代碼清單3-13 通過ID啟動已經停止運行的容器

$ sudo docker start aa3f365f0f4en

提示

也可以使用docker restart命令來重新啟動一個容器。

這時運行不帶-a標誌的docker ps命令,就應該看到我們的容器已經開始運行了。

注意

類似地,Docker也提供了docker create命令來創建一個容器,但是並不運行它。這讓我們可以在自己的容器工作流中對其進行細粒度的控制。

6 附著到容器上

Docker容器重新啟動的時候,會沿用docker run命令時指定的參數來運行,因此我們的容器重新啟動後會運行一個互動式會話shell。此外,也可以用docker attach命令,重新附著到該容器的會話上,如代碼清單3-14所示。

代碼清單3-14 附著到正在運行的容器

$ sudo docker attach bob_the_containern

也可以使用容器ID,重新附著到容器的會話上,如代碼清單3-15所示。

代碼清單3-15 通過ID附著到正在運行的容器

$ sudo docker attach aa3f365f0f4en

現在,又重新回到了容器的Bash提示符,如代碼清單3-16所示。

代碼清單3-16 重新附著到容器的會話

root@aa3f365f0f4e:/_#_n

提示

可能需要按下回車鍵才能進入該會話。

如果退出容器的shell,容器會再次停止運行。

7 創建守護式容器

除了這些互動式運行的容器(interactive container),也可以創建長期運行的容器。守護式容器(daemonized container)沒有互動式會話,非常適合運行應用程序和服務。大多數時候我們都需要以守護式來運行我們的容器。下面就來啟動一個守護式容器,如代碼清單3-17所示。

代碼清單3-17 創建長期運行的容器

$ sudo docker run --name daemon_dave -d ubuntu /bin/sh -c "whilen true; do echo hello world; sleep 1; done"n1333bb1a66af402138485fe44a335b382c09a887aa9f95cb9725e309ce5b7db3n

我們在上面的docker run命令使用了-d參數,因此Docker會將容器放到後台運行。

我們還在容器要運行的命令里使用了一個while循環,該循環會一直列印hello world,直到容器或其進程停止運行。

通過組合使用上面的這些參數,你會發現docker run命令並沒有像上一個容器一樣將主機的控制台附著到新的shell會話上,而是僅僅返回了一個容器ID而已,我們還是在主機的命令行之中。如果執行docker ps命令,可以看到一個正在運行的容器,如代碼清單3-18所示。

代碼清單3-18 查看正在運行的daemon_dave容器

CONTAINER ID IMAGE COMMAND CREATEDn STATUS PORTS NAMESn1333bb1a66af ubuntu:14.04 /bin/sh -c while tr 32 secs ago Up 27n daemon_daven

8 容器內部都在幹些什麼

現在我們已經有了一個在後台運行while循環的守護型容器。為了探究該容器內部都在幹些什麼,可以用docker logs命令來獲取容器的日誌,如代碼清單3-19所示。

代碼清單3-19 獲取守護式容器的日誌

$ sudo docker logs daemon_davenhello worldnhello worldnhello worldnhello worldnhello worldnhello worldnhello worldn. . .n

這裡,我們可以看到while循環正在向日誌里列印hello world。Docker會輸出最後幾條日誌項並返回。我們也可以在命令後使用-f參數來監控Docker的日誌,這與tail -f命令非常相似,如代碼清單3-20所示。

代碼清單3-20 跟蹤守護式容器的日誌

$ sudo docker logs -f daemon_davenhello worldnhello worldnhello worldnhello worldnhello worldnhello worldnhello worldn. . .n

提示

可以通過Ctr+C退出日誌跟蹤。

我們也可以跟蹤容器日誌的某一片段,和之前類似,只需要在tail命令後加入-f --tail標誌即可。例如,可以用docker logs --tail 10 daemon_dave獲取日誌的最後10行內容。另外,也可以用docker logs --tail 0 -f daemon_dave命令來跟蹤某個容器的最新日誌而不必讀取整個日誌文件。

為了讓調試更簡單,還可以使用-t標誌為每條日誌項加上時間戳,如代碼清單3-21所示。

代碼清單3-21 跟蹤守護式容器的最新日誌

$ sudo docker logs -ft daemon_daven[May 10 13:06:17.934] hello worldn[May 10 13:06:18.935] hello worldn[May 10 13:06:19.937] hello worldn[May 10 13:06:20.939] hello worldn[May 10 13:06:21.942] hello worldn. . .n

提示

同樣,可以通過Ctr+C退出日誌跟蹤。

9 Docker日誌驅動

自Docker 1.6開始,也可以控制Docker守護進程和容器所用的日誌驅動,這可以通過–log-driver選項來實現。可以在啟動Docker守護進程或者執行docker run命令時使用這個選項。

有好幾個選項,包括默認的json-file,json-file也為我們前面看到的docker logs命令提供了基礎。

其他可用的選項還包括syslog,該選項將禁用docker logs命令,並且將所有容器的日誌輸出都重定向到Syslog。可以在啟動Docker守護進程時指定該選項,將所有容器的日誌都輸出到Syslog,或者通過docker run對個別的容器進行日誌重定向輸出。

代碼清單3-22 在容器級別啟動Syslog

$ sudo docker run --log-driver="syslog" --name daemon_dwayne -dn ubuntu /bin/sh -c "while true; do echo hello world; sleep 1;n done"n. . .n

提示

如果是在Docker Toolbox中運行Docker,應該在虛擬機中啟動Syslog守護進程。可以先通過docker-machine ssh命令連接到Docker Toolbox虛擬機,再在其中運行syslogd命令來啟動Syslog守護進程。

上面的命令會將daemon_dwayne容器的日誌都輸出到Syslog,導致docker logs命令不輸出任何東西。

最後,還有一個可用的選項是none,這個選項將會禁用所有容器中的日誌,導致docker logs命令也被禁用。

提示

新的日誌驅動也在不斷地增加,在Docker 1.8中,新增了對Graylog GELF協議、Fluentd以及日誌輪轉驅動的支持。

10 查看容器內的進程

除了容器的日誌,也可以查看容器內部運行的進程。要做到這一點,要使用docker top命令,如代碼清單3-23所示。

代碼清單3-23 查看守護式容器的進程

$ sudo docker top daemon_daven

該命令執行後,可以看到容器內的所有進程(主要還是我們的while循環)、運行進程的用戶及進程ID,如代碼清單3-24所示。

代碼清單3-24 docker**top命令的輸出結果

PID USER COMMANDn977 root /bin/sh -c while true; do echo hello world; sleep 1;n donen1123 root sleep 1n

11 Docker統計信息

除了docker top命令,還可以使用docker stats命令,它用來顯示一個或多個容器的統計信息。讓我們來看看它的輸出是什麼樣的。下面我們來查看一下容器daemon_dave以及其他守護式容器的統計信息。

代碼清單3-25 docker stats命令

$ sudo docker stats daemon_dave daemon_kate daemon_clare daemon_sarahnCONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/Ondaemon_clare 0.10% 220 KiB/994 MiB 0.02% 1.898 KiB/648 B 12.75 MB / 0 Bndaemon_dave 0.14% 212 KiB/994 MiB 0.02% 5.062 KiB/648 B 1.69 MB / 0 Bndaemon_kate 0.11% 216 KiB/994 MiB 0.02% 1.402 KiB/648 B 24.43 MB / 0 Bndaemon_sarah 0.12% 208 KiB/994 MiB 0.02% 718 B/648 B 11.12 MB / 0 Bn

我們能看到一個守護式容器的列表,以及它們的CPU、內存、網路I/O及存儲I/O的性能和指標。這對快速監控一台主機上的一組容器非常有用。

注意

docker stats是Docker 1.5.0中引入的命令。

12 在容器內部運行進程

在Docker 1.3之後,也可以通過docker exec命令在容器內部額外啟動新進程。可以在容器內運行的進程有兩種類型:後台任務和互動式任務。後台任務在容器內運行且沒有交互需求,而互動式任務則保持在前台運行。對於需要在容器內部打開shell的任務,互動式任務是很實用的。下面先來看一個後台任務的例子,如代碼清單3-26所示。

代碼清單3-26 在容器中運行後台任務

$ sudo docker exec -d daemon_dave touch /etc/new_config_filen

這裡的-d標誌表明需要運行一個後台進程,-d標誌之後,指定的是要在內部執行這個命令的容器的名字以及要執行的命令。上面例子中的命令會在daemon_dave容器內創建了一個空文件,文件名為/etc/new_config_file。通過docker exec後台命令,可以在正在運行的容器中進行維護、監控及管理任務。

{提示}

從Docker 1.7開始,可以對docker exec啟動的進程使用–u標誌為新啟動的進程指定一個用戶屬主。

我們也可以在daemon_dave容器中啟動一個諸如打開shell的互動式任務,如代碼清單3-27所示。

代碼清單3-27 在容器內運行交互命令

$ sudo docker exec -t -i daemon_dave /bin/bash n

和運行交互容器時一樣,這裡的-t和-i標誌為我們執行的進程創建了TTY並捕捉STDIN。接著我們指定了要在內部執行這個命令的容器的名字以及要執行的命令。在上面的例子中,這條命令會在daemon_dave容器內創建一個新的bash會話,有了這個會話,我們就可以在該容器中運行其他命令了。

注意

docker exec命令是Docker 1.3引入的,早期版本並不支持該命令。對於早期Docker版本,請參考第6章中介紹的nsenter命令。

13 停止守護式容器

要停止守護式容器,只需要執行docker stop命令,如代碼清單3-28所示。

代碼清單3-28 停止正在運行的Docker容器

$ sudo docker stop daemon_daven

當然,也可以用容器ID來指代容器名稱,如代碼清單3-29所示。

代碼清單3-29 通過容器ID停止正在運行的容器

$ sudo docker stop c2c4e57c12c4n

注意

docker stop命令會向Docker容器進程發送SIGTERM信號。如果想快速停止某個容器,也可以使用docker kill命令來向容器進程發送SIGKILL信號。

要想查看已經停止的容器的狀態,則可以使用docker ps命令。還有一個很實用的命令docker ps -n x,該命令會顯示最後x個容器,不論這些容器正在運行還是已經停止。

14 自動重啟容器

如果由於某種錯誤而導致容器停止運行,還可以通過--restart標誌,讓Docker自動重新啟動該容器。--restart標誌會檢查容器的退出代碼,並據此來決定是否要重啟容器。默認的行為是Docker不會重啟容器。

代碼清單3-30是一個在docker run命令中使用—restart標誌的例子。

代碼清單3-30 自動重啟容器

$ sudo docker run --restart=always --name daemon_dave -d ubuntu /n bin/sh -c "while true; do echo hello world; sleep 1; done"n

在本例中,--restart標誌被設置為always。無論容器的退出代碼是什麼,Docker都會自動重啟該容器。除了always,還可以將這個標誌設為on-failure,這樣,只有當容器的退出代碼為非0值的時候,才會自動重啟。另外,on-failure``還接受一個可選的重啟次數參數,如代碼清單3-31所示。

代碼清單3-31 為on-failure指定count參數

--restart=on-failure:5n

這樣,當容器退出代碼為非0時,Docker會嘗試自動重啟該容器,最多重啟5次。

注意

–restart標誌是Docker1.2.0引入的選項。

15 深入容器

除了通過docker ps命令獲取容器的信息,還可以使用docker inspect``來獲得更多的容器信息,如代碼清單3-32所示。

代碼清單3-32 查看容器

$ sudo docker inspect daemon_daven[{n "ID": "n c2c4e57c12c4c142271c031333823af95d64b20b5d607970c334784430bcbd0fn ",n "Created": "2014-05-10T11:49:01.902029966Z",n "Path": "/bin/sh",n "Args": [n "-c",n "while true; do echo hello world; sleep 1; done"n ],n "Config": {n "Hostname": "c2c4e57c12c4",n. . .n

docker inspect命令會對容器進行詳細的檢查,然後返回其配置信息,包括名稱、命令、網路配置以及很多有用的數據。

也可以用-f或者--format標誌來選定查看結果,如代碼清單3-33所示。

代碼清單3-33 有選擇地獲取容器信息

$ sudo docker inspect --format={{ .State.Running }} daemon_davenfalsen

上面這條命令會返回容器的運行狀態,示例中該狀態為false。我們還能獲取其他有用的信息,如容器IP地址,如代碼清單3-34所示。

代碼清單3-34 查看容器的IP地址

$ sudo docker inspect --format {{ .NetworkSettings.IPAddress }}n daemon_daven172.17.0.2n

提示

–format或者-f標誌遠非表面看上去那麼簡單。該標誌實際上支持完整的Go語言模板。用它進行查詢時,可以充分利用Go語言模板的優勢。

也可以同時指定多個容器,並顯示每個容器的輸出結果,如代碼清單3-35所示。

代碼清單3-35 查看多個容器

$ sudo docker inspect --format {{.Name}} {{.State.Running}} ndaemon_dave bob_the_containern/daemon_dave falsen/bob_the_container falsen

可以為該參數指定要查詢和返回的查看散列(inspect hash)中的任意部分。

注意

除了查看容器,還可以通過瀏覽/var/lib/docker目錄來深入了解Docker的工作原理。該目錄存放著Docker鏡像、容器以及容器的配置。所有的容器都保存在/var/lib/docker/containers目錄下。

16 刪除容器

如果容器已經不再使用,可以使用docker rm命令來刪除它們,如代碼清單3-36所示。

代碼清單3-36 刪除容器

$ sudo docker rm 80430f8d0921n80430f8d0921n

注意

從Docker 1.6.2開始,可以通過給docker rm命令傳遞-f標誌來刪除運行中的Docker容器。這之前的版本必須先使用docker stop或docker kill命令停止容器,才能將其刪除。

目前,還沒有辦法一次刪除所有容器,不過可以通過代碼清單3-37所示的小技巧來刪除全部容器。

代碼清單3-37 刪除所有容器

$ sudo docker rm `sudo docker ps -a -q`n

上面的docker ps命令會列出現有的全部容器,-a標誌代表列出所有容器,而-q標誌則表示只需要返回容器的ID而不會返回容器的其他信息。這樣我們就得到了容器ID的列表,並傳給了docker rm命令,從而達到刪除所有容器的目的。

小結

本文中介紹了Docker容器的基本工作原理。這裡學到的內容也是本書剩餘章節中學習如何使用Docker的基礎。

預知下一篇:如何構建自己的Docker鏡像,以及如何使用Docker倉庫和Docker Registry請購買《第一本Docker書》(修訂版)進行學習。

本書專註於Docker 1.9及以上版本,指導讀者完成Docker的安裝、部署、管理和擴展,帶領讀者經歷從測試到生產的整個開發生命周期,讓讀者了解Docker適用於什麼場景。書中先介紹Docker及其組件的基礎知識,然後介紹用Docker構建容器和服務來完成各種任務:利用Docker為新項目建立測試環境,演示如何使用持續集成的工作流集成Docker,如何構建應用程序服務和平台,如何使用Docker的API,如何擴展Docker。

請多精彩敬請關註:人郵IT書坊


推薦閱讀:

技術丨淺談如何設計數據讀取框架簡化資料庫操作
【乾貨合集】Redis深入之道——Redis4.0、讀寫分離技術揭秘及實戰應用
分散式架構系統生成全局唯一序列號的一個思路
IMVC(同構 MVC)的前端實踐
基於TableStore構建簡易海量Topic消息隊列

TAG:Docker | 架构 |