自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

全球首部Docker書籍:讓你邁出使用Docker的第一步

云計(jì)算
本文摘自全球第一本關(guān)于 Docker知識(shí)的書籍《第一本Docker書》。在本文中,我們將邁出使用Docker的第一步,學(xué)習(xí)第一個(gè)Docker容器。本章還會(huì)介紹如何與Docker進(jìn)行交互的基本知識(shí)。

在本文中,我們將邁出使用Docker的***步,學(xué)習(xí)***個(gè)Docker容器。本章還會(huì)介紹如何與Docker進(jìn)行交互的基本知識(shí)。

1 確保Docker已經(jīng)就緒

首先,我們會(huì)查看Docker是否能正常工作,然后學(xué)習(xí)基本的Docker的工作流:創(chuàng)建并管理容器。我們將瀏覽容器的典型生命周期:從創(chuàng)建、管理到停止,直到最終刪除。

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

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

  1. $ sudo docker info   
  2. Containers: 0   
  3. Images: 0   
  4. Storage Driver: aufs   
  5.  Root Dir: /var/lib/docker/aufs   
  6.  Dirs: 144   
  7. Execution Driver: native-0.1   
  8. Kernel Version: 3.8.0-29-generic   
  9. Registry: [https://index.docker.io/v1/] 

在這里我們調(diào)用了docker可執(zhí)行程序的info命令,該命令會(huì)返回所有容器和鏡像(鏡像即是Docker用來(lái)構(gòu)建容器的“構(gòu)建塊”)的數(shù)量、Docker使用的執(zhí)行驅(qū)動(dòng)和存儲(chǔ)驅(qū)動(dòng)(execution and storage driver),以及Docker的基本配置。

在前面幾章我們已經(jīng)介紹過(guò),Docker是基于客戶端-服務(wù)器構(gòu)架的。它有一個(gè)docker程序,既能作為客戶端,也可以作為服務(wù)器端。作為客戶端時(shí),docker程序向Docker守護(hù)進(jìn)程發(fā)送請(qǐng)求(如請(qǐng)求返回守護(hù)進(jìn)程自身的信息),然后再對(duì)返回來(lái)的請(qǐng)求結(jié)果進(jìn)行處理。

2 運(yùn)行我們的***個(gè)容器

現(xiàn)在,讓我們嘗試啟動(dòng)***個(gè)Docker容器。我們可以使用docker run命令創(chuàng)建容器,如代碼清單3-2所示。docker run命令提供了Docker容器的創(chuàng)建到啟動(dòng)的功能,在本書中我們也會(huì)使用該命令來(lái)創(chuàng)建新容器。

代碼清單3-2 創(chuàng)建***個(gè)容器

  1. $ sudo docker run -i -t ubuntu /bin/bash 
  2. Pulling repository ubuntu from https://index.docker.io/v1 
  3. Pulling image 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c (precise) from ubuntu 
  4. Pulling 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c metadata 
  5. Pulling 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c fs layer 
  6. Downloading 58337280/? (n/a) 
  7. Pulling image b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc (quantal) from ubuntu 
  8. Pulling image 27cf784147099545 () from ubuntu 
  9. root@fcd78e1a3569:/#  

  {提示}

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

 

代碼清單3-3所示命令的輸出結(jié)果非常豐富,下面我們來(lái)逐條解析。

代碼清單3-3 docker run命令

  1. $ sudo docker run -i -t ubuntu /bin/bash  

  {提示}

官方文檔上列出了docker run命令的所有標(biāo)志,此外還可以用命令docker help run查看這些標(biāo)志?;蛘?,也可以用Docker的man頁(yè)(也就是執(zhí)行man docker-run命令)。

 

首先,我們告訴Docker執(zhí)行docker run命令,并指定了-i和-t兩個(gè)命令行參數(shù)。-i標(biāo)志保證容器中STDIN是開啟的,盡管我們并沒有附著到容器中。持久的標(biāo)準(zhǔn)輸入是交互式shell的“半邊天”,-t標(biāo)志則是另外“半邊天”,它告訴Docker為要?jiǎng)?chuàng)建的容器分配一個(gè)偽tty終端。這樣,新創(chuàng)建的容器才能提供一個(gè)交互式shell。若要在命令行下創(chuàng)建一個(gè)我們能與之進(jìn)行交互的容器,而不是一個(gè)運(yùn)行后臺(tái)服務(wù)的容器,則這兩個(gè)參數(shù)已經(jīng)是最基本的參數(shù)了。

接下來(lái),我們告訴Docker基于什么鏡像來(lái)創(chuàng)建容器,示例中使用的是ubuntu鏡像。ubuntu鏡像是一個(gè)常備鏡像,也可以稱為“基礎(chǔ)”(base)鏡像,它由Docker公司提供,保存在Docker HubRegistry上。

你可以用 ubuntu 基礎(chǔ)鏡像(以及類似的 fedora、debian、centos等鏡像)為基礎(chǔ),在你選擇的操作系統(tǒng)上構(gòu)建自己的鏡像。這里,我們基于此基礎(chǔ)鏡像啟動(dòng)了一個(gè)容器,并且沒有對(duì)容器進(jìn)行任何改動(dòng)。

那么,在這一切的背后又都發(fā)生了什么呢?首先Docker會(huì)檢查本地是否存在ubuntu鏡像,如果本地還沒有該鏡像的話,那么Docker就會(huì)連接官方維護(hù)的Docker Hub Registry,查看Docker Hub中是否有該鏡像。Docker一旦找到該鏡像,就會(huì)下載該鏡像并將其保存到本地宿主機(jī)中。

隨后,Docker在文件系統(tǒng)內(nèi)部用這個(gè)鏡像創(chuàng)建了一個(gè)新容器。該容器擁有自己的網(wǎng)絡(luò)、IP地址,以及一個(gè)用來(lái)和宿主機(jī)進(jìn)行通信的橋接網(wǎng)絡(luò)接口。***,我們告訴Docker在新容器中要運(yùn)行什么命令,在本例中我們?cè)谌萜髦羞\(yùn)行/bin/bash命令啟動(dòng)了一個(gè)Bash shell。

當(dāng)容器創(chuàng)建完畢之后,Docker就會(huì)執(zhí)行容器中的/bin/bash命令,這時(shí)我們就可以看到容器內(nèi)的shell了,就像代碼清單3-4所示。

代碼清單3-4 ***個(gè)容器的shell

  1. root@f7cbdac22a02:/#  

  {注意}

在第4章中,我們將會(huì)看到如何構(gòu)建自己的鏡像并基于該鏡像創(chuàng)建容器的基礎(chǔ)知識(shí)。

#p#

3 使用***個(gè)容器

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

代碼清單3-5 檢查容器的主機(jī)名

  1. root@f7cbdac22a02:/# hostname 
  2. f7cbdac22a02  

可以看到,容器的主機(jī)名就是該容器的ID。我們?cè)賮?lái)看看/etc/hosts文件,如代碼清單3-6所示。

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

  1. root@f7cbdac22a02:/# cat /etc/hosts 
  2. 172.17.0.4 f7cbdac22a02 
  3. 127.0.0.1 localhost 
  4. ::1 localhost ip6-localhost ip6-loopback 
  5. fe00::0 ip6-localnet 
  6. ff00::0 ip6-mcastprefix 
  7. ff02::1 ip6-allnodes 
  8. ff02::2 ip6-allrouters  

Docker以在hosts文件中為該容器的IP地址添加了一條主機(jī)配置項(xiàng)。我們?cè)賮?lái)看看容器的網(wǎng)絡(luò)配置情況,如代碼清單3-7所示。

代碼清單3-7 檢查容器的接口

  1. root@f7cbdac22a02:/# ip a 
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default 
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
  4. inet 127.0.0.1/8 scope host lo 
  5. inet6 ::1/128 scope host 
  6. valid_lft forever preferred_lft forever 
  7. 899: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 
  8. link/ether 16:50:3a:b6:f2:cc brd ff:ff:ff:ff:ff:ff 
  9. inet 172.17.0.4/16 scope global eth0 
  10. inet6 fe80::1450:3aff:feb6:f2cc/64 scope link 
  11. valid_lft forever preferred_lft forever  

我們可以看到,這里有l(wèi)o的環(huán)回接口,還有IP為172.17.0.4的標(biāo)準(zhǔn)eth0網(wǎng)絡(luò)接口,和普通宿主機(jī)是完全一樣的。我們還可以查看容器中運(yùn)行的進(jìn)程,如代碼清單3-8所示。

代碼清單3-8 檢查容器的進(jìn)程

  1. root@f7cbdac22a02:/# ps -aux 
  2. USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 
  3. root 1 0.0 0.0 18156 1936 ? Ss May30 0:00 /bin/bash 
  4. root 21 0.0 0.0 15568 1100 ? R+ 02:38 0:00 ps -aux  

接下來(lái)我們要干些什么呢?安裝一個(gè)軟件包怎么樣?如代碼清單3-9所示。

代碼清單3-9 在***個(gè)容器中安裝軟件包

  1. root@f7cbdac22a02:/# apt-get update && apt-get install vim  

  {提示}

你也可以為docker ps命令指定-l標(biāo)志,該選項(xiàng)會(huì)列出***一次運(yùn)行的容器,包括正在運(yùn)行和已經(jīng)停止的。

 

  {注意}

有三種方式可以指代唯一容器:短UUID(如f7cbdac22a02)、長(zhǎng)UUID(如f7cbdac22a02e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778)或者名稱(如gray_cat)。

 

通過(guò)上述命令,我們就在容器中安裝了Vim軟件。

你可以繼續(xù)在容器中做任何自己想做的事情。當(dāng)所有工作都結(jié)束時(shí),輸入exit,就可以返回到Ubuntu宿主機(jī)的命令行提示符了。

這個(gè)容器現(xiàn)在怎樣了?容器現(xiàn)在已經(jīng)停止運(yùn)行了!只有在指定的/bin/bash命令處于運(yùn)行狀態(tài)的時(shí)候,我們?nèi)萜饕膊艜?huì)相應(yīng)地處于運(yùn)行狀態(tài)。一旦退出容器,/bin/bash命令也就結(jié)束了,這時(shí)容器也隨之停止了運(yùn)行。

但容器仍然是存在的,我們可以用docker ps -a命令查看當(dāng)前系統(tǒng)中容器的列表

默認(rèn)情況下,當(dāng)執(zhí)行docker ps命令時(shí),只能看到正在運(yùn)行的容器。如果指定-a標(biāo)志,選項(xiàng)的話,那么docker ps命令會(huì)列出所有容器,包括正在運(yùn)行的和已經(jīng)停止的。

從該命令的輸出結(jié)果中我們可以看到關(guān)于這個(gè)容器的很多有用信息:ID、用于創(chuàng)建該容器的鏡像、容器***執(zhí)行的命令、創(chuàng)建時(shí)間以及容器的退出狀態(tài)(在上面的例子中,退出狀態(tài)是0,因?yàn)槿萜魇峭ㄟ^(guò)正常的exit命令退出的)。我們還可以看到,每個(gè)容器都有一個(gè)名稱。

4 容器命名

Docker會(huì)為我們創(chuàng)建的每一個(gè)容器自動(dòng)生成一個(gè)隨機(jī)的名稱。例如,上面我們剛剛創(chuàng)建的容器就被命名為gray_cat。如果想為容器指定一個(gè)名稱,而不是使用自動(dòng)生成的名稱,則可以用--name標(biāo)志來(lái)實(shí)現(xiàn),如代碼清單3-10所示。

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

  1. $ sudo docker run --name bob_the_container -i -t ubuntu /bin/bash   
  2. root@aa3f365f0f4e:/# exit

上述命令將會(huì)創(chuàng)建一個(gè)名為bob_the_container的容器。一個(gè)合法的容器名稱只能包含以下字符:小寫字母a~z、大寫字母A~Z、數(shù)字0~9、下劃線、圓點(diǎn)、橫線(如果用正則表達(dá)式來(lái)表示這些符號(hào),就是[a-zA-Z0-9_.-])。

在很多Docker命令中,我們都可以用容器的名稱來(lái)替代容器ID,后面我們將會(huì)看到。容器名稱有助于分辨容器,當(dāng)構(gòu)建容器和應(yīng)用程序之間的邏輯連接時(shí),容器的名稱也有助于從邏輯上理解連接關(guān)系。具體的名稱(如web、db)比容器ID和隨機(jī)容器名好記多了。我推薦大家都使用容器名稱,以更加方便地管理容器。

容器的命名必須是唯一的。如果我們?cè)噲D創(chuàng)建兩個(gè)名稱相同的容器,則命令將會(huì)失敗。如果要使用的容器名稱已經(jīng)存在,可以先用docker rm命令刪除已有的同名容器后,再來(lái)創(chuàng)建新的容器。

5 重新啟動(dòng)已經(jīng)停止的容器

bob_the_container容器已經(jīng)停止了,接下來(lái)我們能對(duì)它做些什么呢?如果愿意,我們可以用下面的命令重新啟動(dòng)一個(gè)已經(jīng)停止的容器,如代碼清單3-11所示。

代碼清單3-11 啟動(dòng)已經(jīng)停止運(yùn)行的容器

  1. $ sudo docker start bob_the_container  

除了容器名稱,我們也可以用容器ID來(lái)指定容器,如代碼清單3-12所示。

代碼清單3-12 通過(guò)ID啟動(dòng)已經(jīng)停止運(yùn)行的容器

  1. $ sudo docker start aa3f365f0f4e  

  {提示}

我們也可以使用docker restart命令來(lái)重新啟動(dòng)一個(gè)容器。

這時(shí)運(yùn)行不帶-a標(biāo)志的docker ps命令,就應(yīng)該看到我們的容器已經(jīng)開始運(yùn)行了。

#p#

6 附著到容器上

Docker容器重新啟動(dòng)的時(shí)候,會(huì)沿用docker run命令時(shí)指定的參數(shù)來(lái)運(yùn)行,因此我們?nèi)萜髦匦聠?dòng)后會(huì)運(yùn)行一個(gè)交互式會(huì)話shell。此外,我們也可以用docker attach命令,重新附著到該容器的會(huì)話上,如代碼清單3-13所示。

代碼清單3-13 附著到正在運(yùn)行的容器

  1. $ sudo docker attach bob_the_container  

我們也可以使用容器ID,重新附著到容器的會(huì)話上,如代碼清單3-14所示。

代碼清單3-14 通過(guò)ID附著到正在運(yùn)行的容器

  1. $ sudo docker attach aa3f365f0f4e  

現(xiàn)在,我們又重新回到了容器的Bash提示符,如代碼清單3-15所示。

代碼清單3-15 重新附著到容器的會(huì)話

  1. root@aa3f365f0f4e:/#  

  {提示}

你可能需要按下回車鍵才能進(jìn)入該會(huì)話。

如果退出容器的shell,容器也會(huì)隨之停止運(yùn)行。

7 創(chuàng)建守護(hù)式容器

除了這些交互式運(yùn)行的容器(interactive container),我們也可以創(chuàng)建長(zhǎng)期運(yùn)行的容器。守護(hù)式容器(daemonized container)沒有交互式會(huì)話,非常適合運(yùn)行應(yīng)用程序和服務(wù)。大多數(shù)時(shí)候我們都需要以守護(hù)式來(lái)運(yùn)行我們的容器。下面我們就來(lái)啟動(dòng)一個(gè)守護(hù)式容器,如代碼清單3-16所示。

代碼清單3-16 創(chuàng)建長(zhǎng)期運(yùn)行的容器

  1. $ sudo docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" 
  2. 1333bb1a66af402138485fe44a335b382c09a887aa9f95cb9725e309ce5b7db3  

我們?cè)谏厦娴膁ocker run命令使用了-d參數(shù),因此Docker會(huì)將容器放到后臺(tái)運(yùn)行。

我們還在容器要運(yùn)行的命令里使用了一個(gè)while循環(huán),該循環(huán)會(huì)一直打印hello world,直到容器或其進(jìn)程停止運(yùn)行。

通過(guò)組合使用上面的這些參數(shù),你可以發(fā)現(xiàn)docker run命令并沒有像上一個(gè)容器一樣將主機(jī)的控制臺(tái)附著到新的shell會(huì)話上,而是僅僅返回了一個(gè)容器ID而已,我們還是在主機(jī)的命令行之中。如果我們執(zhí)行docker ps命令,可以看到一個(gè)正在運(yùn)行的容器,如代碼清單3-17所示。

代碼清單3-17 查看正在運(yùn)行的daemon_dave容器

  1. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 
  2. 1333bb1a66af ubuntu:14.04 /bin/sh -c 'while tr 32 secs ago Up 27 daemon_dave  

8容器內(nèi)部都在干些什么

現(xiàn)在我們已經(jīng)有了一個(gè)在后臺(tái)運(yùn)行while循環(huán)的守護(hù)型容器。為了探究該容器內(nèi)部都在干些什么,我們可以用docker logs命令來(lái)獲取容器的日志,如代碼清單3-18所示。

代碼清單3-18 獲取守護(hù)式容器的日志

  1. $ sudo docker logs daemon_dave 
  2. hello world 
  3. hello world 
  4. hello world 
  5. hello world 
  6. hello world 
  7. hello world 
  8. hello world  
. . .

這里,我們可以看到while循環(huán)正在向日志里打印hello world。Docker會(huì)輸出***幾條日志項(xiàng)并返回。我們也可以在命令后使用-f參數(shù)來(lái)監(jiān)控Docker的日志,這與tail -f命令非常相似,如代碼清單3-19所示。

代碼清單3-19 跟蹤守護(hù)式容器的日志

  1. $ sudo docker logs -f daemon_dave 
  2. hello world 
  3. hello world 
  4. hello world 
  5. hello world 
  6. hello world 
  7. hello world 
  8. hello world 
  9. . . .  

  {提示}

可以通過(guò)Ctrl+C退出日志跟蹤。

我們也可以跟蹤容器日志的某一片段,和之前類似,只需要在tail命令后加入-f --lines標(biāo)志即可。例如,可以用docker logs --tail 10 daemon_dave獲取日志的***10行內(nèi)容。另外,也可以用docker logs --tail 0 -f daemon_dave命令來(lái)跟蹤某個(gè)容器的***日志而不必讀取整個(gè)日志文件。

為了讓調(diào)試更簡(jiǎn)單,我們還可以使用-t標(biāo)志為每條日志項(xiàng)加上時(shí)間戳,如代碼清單3-20所示。

代碼清單3-20 跟蹤守護(hù)式容器的***日志

  1. $ sudo docker logs -ft daemon_dave 
  2. [May 10 13:06:17.934] hello world 
  3. [May 10 13:06:18.935] hello world 
  4. [May 10 13:06:19.937] hello world 
  5. [May 10 13:06:20.939] hello world 
  6. [May 10 13:06:21.942] hello world 
  7. . . .  

  {提示}

同樣,可以通過(guò)Ctr+C退出日志跟蹤。

#p#

9 查看容器內(nèi)的進(jìn)程

除了容器的日志,我們也可以查看容器內(nèi)部運(yùn)行的進(jìn)程。要做到這一點(diǎn),要使用docker top命令,如代碼清單3-21所示。

代碼清單3-21 查看守護(hù)式容器的進(jìn)程

  1. $ sudo docker top daemon_dave  

該命令執(zhí)行后,我們可以看到容器內(nèi)的所有進(jìn)程(主要還是我們的while循環(huán))、運(yùn)行進(jìn)程的用戶及進(jìn)程ID,如代碼清單3-22所示。

  1. 代碼清單3-22 docker``top命令的輸出結(jié)果 
  2. PID USER COMMAND 
  3. 977 root /bin/sh -c while truedo echo hello world; sleep 1; done 
  4. 1123 root sleep 1  

10 在容器內(nèi)部運(yùn)行進(jìn)程

在Docker 1.3之后,我們也可以通過(guò)docker exec命令在容器內(nèi)部額外啟動(dòng)新進(jìn)程。可以在容器內(nèi)運(yùn)行的進(jìn)程有兩種類型:后臺(tái)任務(wù)和交互式任務(wù)。后臺(tái)任務(wù)在容器內(nèi)運(yùn)行且沒有交互需求,而交互式任務(wù)則保持在前臺(tái)運(yùn)行。對(duì)于需要在容器內(nèi)部打開shell的任務(wù),交互式任務(wù)是很實(shí)用的。下面我們先來(lái)看一個(gè)后臺(tái)任務(wù)的例子,如代碼清單3-23所示。

代碼清單3-23 在容器中運(yùn)行后臺(tái)任務(wù)

  1. $ sudo docker exec -d daemon_dave touch /etc/new_config_file  

這里的-d標(biāo)志表明需要運(yùn)行一個(gè)后臺(tái)進(jìn)程,-d標(biāo)志之后,指定的是要在內(nèi)部執(zhí)行這個(gè)命令的容器的名字以及要執(zhí)行的命令。上面例子中的命令會(huì)在daemon_dave容器內(nèi)創(chuàng)建了一個(gè)空文件,文件名為/etc/new_config_file。通過(guò)docker exec后臺(tái)命令,我們可以在正在運(yùn)行的容器中進(jìn)行維護(hù)、監(jiān)控及管理任務(wù)。

我們也可以在daemon_dave容器中啟動(dòng)一個(gè)諸如打開shell的交互式任務(wù),如代碼清單3-24所示。

代碼清單3-24 在容器內(nèi)運(yùn)行交互命令

  1. $ sudo docker exec -t -i daemon_dave /bin/bashVersion:  

  {注意}

docker exec命令是Docker 1.3引入的,早期版本并不支持該命令。對(duì)于早期Docker版本,請(qǐng)參考第6章中介紹的nsenter命令。

和運(yùn)行交互容器時(shí)一樣,這里的-t和-i標(biāo)志為我們執(zhí)行的進(jìn)程創(chuàng)建了TTY并捕捉STDIN。接著我們指定了要在內(nèi)部執(zhí)行這個(gè)命令的容器的名字以及要執(zhí)行的命令。在上面的例子中,這條命令會(huì)在daemon_dave容器內(nèi)創(chuàng)建一個(gè)新的bash會(huì)話,有了這個(gè)會(huì)話,我們就可以在該容器中運(yùn)行其他命令了。

11 停止守護(hù)式容器

要停止守護(hù)式容器,只需要執(zhí)行docker stop命令,如代碼清單3-25所示。

代碼清單3-25 停止正在運(yùn)行的Docker容器

  1. $ sudo docker stop daemon_dave  

當(dāng)然,也可以用容器ID來(lái)指代容器名稱,如代碼清單3-26所示。

代碼清單3-26 通過(guò)容器ID停止正在運(yùn)行的容器

  1. $ sudo docker stop c2c4e57c12c4  

  {注意}

docker stop命令會(huì)向Docker容器進(jìn)程發(fā)送SIGTERM信號(hào)。如果你想快速停止某個(gè)容器,也可以使用docker kill命令來(lái)向容器進(jìn)程發(fā)送SIGKILL信號(hào)。

要想查看已經(jīng)停止的容器的狀態(tài),則可以使用docker ps命令。還有一個(gè)很實(shí)用的命令docker ps -n x,該命令會(huì)顯示***x個(gè)容器,不論這些容器正在運(yùn)行還是已經(jīng)停止。

#p#

12 自動(dòng)重啟容器

如果由于某種錯(cuò)誤而導(dǎo)致容器停止運(yùn)行,我們還可以通過(guò)--restart標(biāo)志,讓Docker自動(dòng)重新啟動(dòng)該容器。--restart標(biāo)志會(huì)檢查容器的退出代碼,并據(jù)此來(lái)決定是否要重啟容器。默認(rèn)的行為是Docker不會(huì)重啟容器。

代碼清單3-27是一個(gè)在docker run命令中使用—restart標(biāo)志的例子。

代碼清單3-27 自動(dòng)重啟容器

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

在本例中,--restart標(biāo)志被設(shè)置為always。無(wú)論容器的退出代碼是什么,Docker都會(huì)自動(dòng)重啟該容器。除了always,我們還可以將這個(gè)標(biāo)志設(shè)為on-failure,這樣,只有當(dāng)容器的退出代碼為非0值的時(shí)候,才會(huì)自動(dòng)重啟。另外,on-failure``還接受``一個(gè)可選的重啟次數(shù)參數(shù),如代碼清單3-28所示。

代碼清單3-28 為on-failure指定count參數(shù)

  1. --restart=on-failure:5  

  {注意}

--restart標(biāo)志是Docker1.2.0引入的選項(xiàng)。

 

這樣,當(dāng)容器退出代碼為非0時(shí),Docker會(huì)嘗試自動(dòng)重啟該容器,最多重啟5次。

13 深入容器

除了通過(guò)docker ps命令獲取容器的信息,我們還可以使用docker inspect``來(lái)獲得更多的容器信息,如代碼清單3-29所示。

代碼清單3-29 查看容器

  1. $ sudo docker inspect daemon_dave 
  2. [{ 
  3. "ID""c2c4e57c12c4c142271c031333823af95d64b20b5d607970c334784430bcbd0f"
  4. "Created""2014-05-10T11:49:01.902029966Z"
  5. "Path""/bin/sh"
  6. "Args": [ 
  7. "-c"
  8. "while true; do echo hello world; sleep 1; done" 
  9. ], 
  10. "Config": { 
  11. "Hostname""c2c4e57c12c4"
  12. . . .  

docker inspect命令會(huì)對(duì)容器進(jìn)行詳細(xì)的檢查,然后返回其配置信息,包括名稱、命令、網(wǎng)絡(luò)配置以及很多有用的數(shù)據(jù)。

我們也可以用-f或者--format標(biāo)志來(lái)選定查看結(jié)果,如代碼清單3-30所示。

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

  1. $ sudo docker inspect --format='{{ .State.Running }}' daemon_dave 
  2. false  

上面這條命令會(huì)返回容器的運(yùn)行狀態(tài),示例中該狀態(tài)為false。我們還能獲取其他有用的信息,如容器IP地址,如代碼清單3-31所示。

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

  1. $ sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' \ 
  2. daemon_dave 
  3. 172.17.0.2  

  {提示}

--format或者-f標(biāo)志遠(yuǎn)非表面看上去那么簡(jiǎn)單。該標(biāo)志實(shí)際上支持完整的Go語(yǔ)言模板。用它進(jìn)行查詢時(shí),可以充分利用Go語(yǔ)言模板的優(yōu)勢(shì)。

我們也可以同時(shí)指定多個(gè)容器,并顯示每個(gè)容器的輸出結(jié)果,如代碼清單3-32所示。

代碼清單3-32 查看多個(gè)容器

  1. $ sudo docker inspect --format '{{.Name}} {{.State.Running}}' \ 
  2. daemon_dave bob_the_container 
  3. /daemon_dave false 
  4. /bob_the_container false  

  {注意}

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

 

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

#p#

14 刪除容器

如果容器已經(jīng)不再使用,可以使用docker rm命令來(lái)刪除它們,如代碼清單3-33所示。

代碼清單3-33 刪除容器

  1. $ sudo docker rm 80430f8d0921 
  2. 80430f8d0921  

  {注意}

需要注意的是,運(yùn)行中的Docker容器是無(wú)法刪除的!你必須先通過(guò)docker stop或docker kill命令停止容器,才能將其刪除。

目前,還沒有辦法一次刪除所有容器,不過(guò)可以通過(guò)代碼清單3-34所示的小技巧來(lái)刪除全部容器。

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

  1. docker rm `docker ps -a -q`  

上面的docker ps命令會(huì)列出現(xiàn)有的全部容器,-a標(biāo)志代表列出所有(all)容器,而-q標(biāo)志則表示只需要返回容器的ID而不會(huì)返回容器的其他信息。這樣我們就得到了容器ID的列表,并傳給了docker rm命令,從而達(dá)到刪除所有容器的目的。

小結(jié)

在本章中我們介紹了Docker容器的基本工作原理。這里學(xué)到的內(nèi)容也是本書剩余章節(jié)中學(xué)習(xí)如何使用Docker的基礎(chǔ)。

本文摘自《***本Docker書》

全球***本Docker書

 

原文鏈接:www.jianshu.com/p/26f15063de7d

責(zé)任編輯:Ophira 來(lái)源: 《第一本Docker書》 簡(jiǎn)書
相關(guān)推薦

2018-02-10 11:24:39

Python數(shù)據(jù)程序

2020-07-22 22:10:34

互聯(lián)網(wǎng)物聯(lián)網(wǎng)IOT

2017-03-29 21:01:22

微軟開源

2015-10-28 22:25:45

SwiftAndroid應(yīng)用開發(fā)

2017-06-14 17:18:52

容器DevopsDocker

2022-10-20 14:29:25

2021-01-15 18:17:06

網(wǎng)絡(luò)協(xié)議分層

2012-04-13 16:40:16

豌豆莢

2013-12-16 11:25:55

開源開源社區(qū)

2013-05-27 09:42:33

IEEE802.3以太網(wǎng)400G以太網(wǎng)

2015-06-02 11:42:00

Cloud FoundAzure

2009-01-18 08:49:04

Java入門JDK

2019-11-20 10:54:46

無(wú)密碼身份驗(yàn)證網(wǎng)絡(luò)安全

2012-07-11 16:43:14

飛視美

2013-01-15 09:17:11

2015-11-03 15:02:23

技術(shù)周刊

2011-07-25 14:17:46

BSMIT運(yùn)維北塔

2010-07-01 13:44:12

2021-08-24 05:07:25

React

2012-08-30 11:14:11

云計(jì)算虛擬化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)