Docker入門 | 學(xué)習(xí)第一個Docker容器

      網(wǎng)友投稿 926 2025-04-01

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

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

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

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

      $?sudo?docker?info Containers:?1 Images:?8 Storage?Driver:?aufs ??Root?Dir:?/var/lib/docker/aufs ??Backing?Filesystem:?extfs ??Dirs:?10 Execution?Driver:?native-0.2 Kernel?Version:?3.13.0-43-generic Operating?System:?Ubuntu?14.04.2?LTS CPUs:?1 Total?Memory:?994?MiB Name:?riemanna ID:?DOIT:XN5S:WNYP:WP7Q:BEUP:EBBL:KGIX:GO3V:NDR7:YW6E:VFXT:FXHM WARNING:?No?swap?limit?support

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

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

      2 運(yùn)行我們的第一個容器

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

      代碼清單3-2 運(yùn)行我們的第一個容器

      $?sudo?docker?run?-i?-t?ubuntu?/bin/bash Unable?to?find?image?'ubuntu'?locally ubuntu:latest:?The?image?you?are?pulling?has?been?verified 511136ea3c5a:?Pull?complete d497ad3926c8:?Pull?complete ccb62158e970:?Pull?complete e791be0477f2:?Pull?complete 3680052c0f5c:?Pull?complete 22093c35d77b:?Pull?complete 5506de2b643b:?Pull?complete Status:?Downloaded?newer?image?for?ubuntu:latest root@fcd78e1a3569:/#

      提示

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

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

      代碼清單3-3 docker run命令

      $?sudo?docker?run?-i?-t?ubuntu?/bin/bash

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

      提示

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

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

      提示

      ▎▎我們將在第4章對鏡像做更詳細(xì)的介紹,包括如何構(gòu)建我們自己的鏡像。

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

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

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

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

      root@f7cbdac22a02:/#

      3 使用第一個容器

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

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

      root@f7cbdac22a02:/#?hostname f7cbdac22a02

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

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

      root@f7cbdac22a02:/#?cat?/etc/hosts 172.17.0.4?f7cbdac22a02 127.0.0.1?localhost ::1?localhost?ip6-localhost?ip6-loopback fe00::0?ip6-localnet ff00::0?ip6-mcastprefix ff02::1?ip6-allnodes ff02::2?ip6-allrouters

      Docker已在hosts文件中為該容器的IP地址添加了一條主機(jī)配置項。再來看看容器的網(wǎng)絡(luò)配置情況,如代碼清單3-7所示。

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

      root@f7cbdac22a02:/#?ip?a 1:?lo:??mtu?1500?qdisc?noqueue?state ??UNKNOWN?group?default link/loopback?00:00:00:00:00:00?brd?00:00:00:00:00:00 inet?127.0.0.1/8?scope?host?lo inet6?::1/128?scope?host valid_lft?forever?preferred_lft?forever 899:?eth0:??mtu?1500?qdisc?pfifo_fast ??state?UP?group?default?qlen?1000 link/ether?16:50:3a:b6:f2:cc?brd?ff:ff:ff:ff:ff:ff inet?172.17.0.4/16?scope?global?eth0 inet6?fe80::1450:3aff:feb6:f2cc/64?scope?link 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)程

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

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

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

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

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

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

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

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

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

      CONTAINER?ID?IMAGE??????????COMMAND?????CREATED???STATUS?PORTS?NAMES 1cd57c2cdf7f?ubuntu:14.04?"/bin/bash"?A?minute?Exited ??gray_cat

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

      提示

      ▎▎也可以為docker ps命令指定-l標(biāo)志,列出最后一個運(yùn)行的容器,無論其正在運(yùn)行還是已經(jīng)停止。也可以通過--format標(biāo)志,進(jìn)一步控制顯示哪些信息,以及如何顯示這些信息。

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

      注意

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

      4 容器命名

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

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

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

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

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

      注意

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

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

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

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

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

      $?sudo?docker?start?bob_the_container

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

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

      $?sudo?docker?start?aa3f365f0f4e

      提示

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

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

      注意

      ▎▎類似地,Docker也提供了docker create命令來創(chuàng)建一個容器,但是并不運(yùn)行它。這讓我們可以在自己的容器工作流中對其進(jìn)行細(xì)粒度的控制。

      6 附著到容器上

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

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

      $?sudo?docker?attach?bob_the_container

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

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

      $?sudo?docker?attach?aa3f365f0f4e

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

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

      root@aa3f365f0f4e:/_#_

      提示

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

      如果退出容器的shell,容器會再次停止運(yùn)行。

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

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

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

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

      我們在上面的docker run命令使用了-d參數(shù),因此Docker會將容器放到后臺運(yùn)行。

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

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

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

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

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

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

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

      $?sudo?docker?logs?daemon_dave hello?world hello?world hello?world hello?world hello?world hello?world hello?world .?.?.

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

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

      $?sudo?docker?logs?-f?daemon_dave hello?world hello?world hello?world hello?world hello?world hello?world hello?world .?.?.

      提示

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

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

      為了讓調(diào)試更簡單,還可以使用-t標(biāo)志為每條日志項加上時間戳,如代碼清單3-21所示。

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

      $?sudo?docker?logs?-ft?daemon_dave [May?10?13:06:17.934]?hello?world [May?10?13:06:18.935]?hello?world [May?10?13:06:19.937]?hello?world [May?10?13:06:20.939]?hello?world [May?10?13:06:21.942]?hello?world .?.?.

      提示

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

      9 Docker日志驅(qū)動

      自Docker 1.6開始,也可以控制Docker守護(hù)進(jìn)程和容器所用的日志驅(qū)動,這可以通過--log-driver選項來實現(xiàn)。可以在啟動Docker守護(hù)進(jìn)程或者執(zhí)行docker run命令時使用這個選項。

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

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

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

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

      提示

      ▎▎如果是在Docker Toolbox中運(yùn)行Docker,應(yīng)該在虛擬機(jī)中啟動Syslog守護(hù)進(jìn)程。可以先通過docker-machine ssh命令連接到Docker Toolbox虛擬機(jī),再在其中運(yùn)行syslogd命令來啟動Syslog守護(hù)進(jìn)程。

      上面的命令會將daemon_dwayne容器的日志都輸出到Syslog,導(dǎo)致docker logs命令不輸出任何東西。

      最后,還有一個可用的選項是none,這個選項將會禁用所有容器中的日志,導(dǎo)致docker logs命令也被禁用。

      提示

      ▎▎新的日志驅(qū)動也在不斷地增加,在Docker 1.8中,新增了對Graylog GELF協(xié)議、Fluentd以及日志輪轉(zhuǎn)驅(qū)動的支持。

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

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

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

      $?sudo?docker?top?daemon_dave

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

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

      PID?USER?COMMAND 977?root?/bin/sh?-c?while?true;?do?echo?hello?world;?sleep?1; ??done 1123?root?sleep?1

      11 Docker統(tǒng)計信息

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

      代碼清單3-25 docker stats命令

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

      我們能看到一個守護(hù)式容器的列表,以及它們的CPU、內(nèi)存、網(wǎng)絡(luò)I/O及存儲I/O的性能和指標(biāo)。這對快速監(jiān)控一臺主機(jī)上的一組容器非常有用。

      注意

      Docker入門 | 學(xué)習(xí)第一個Docker容器

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

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

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

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

      $?sudo?docker?exec?-d?daemon_dave?touch?/etc/new_config_file

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

      提示

      ▎▎從Docker 1.7開始,可以對docker exec啟動的進(jìn)程使用–u標(biāo)志為新啟動的進(jìn)程指定一個用戶屬主。

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

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

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

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

      注意

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

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

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

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

      $?sudo?docker?stop?daemon_dave

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

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

      $?sudo?docker?stop?c2c4e57c12c4

      注意

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

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

      14 自動重啟容器

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

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

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

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

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

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

      --restart=on-failure:5

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

      注意

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

      15 深入容器

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

      代碼清單3-32 查看容器

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

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

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

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

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

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

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

      $?sudo?docker?inspect?--format?'{{?.NetworkSettings.IPAddress?}}' ????daemon_dave 172.17.0.2

      提示

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

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

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

      $?sudo?docker?inspect?--format?'{{.Name}}?{{.State.Running}}'?\ daemon_dave?bob_the_container /daemon_dave?false /bob_the_container?false

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

      注意

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

      16 刪除容器

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

      代碼清單3-36 刪除容器

      $?sudo?docker?rm?80430f8d0921 80430f8d0921

      注意

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

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

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

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

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

      小結(jié)

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

      預(yù)知下一篇:如何構(gòu)建自己的Docker鏡像,以及如何使用Docker倉庫和Docker Registry請購買《第一本Docker書》(修訂版)進(jìn)行學(xué)習(xí)。

      本書專注于Docker 1.9及以上版本,指導(dǎo)讀者完成Docker的安裝、部署、管理和擴(kuò)展,帶領(lǐng)讀者經(jīng)歷從測試到生產(chǎn)的整個開發(fā)生命周期,讓讀者了解Docker適用于什么場景。書中先介紹Docker及其組件的基礎(chǔ)知識,然后介紹用Docker構(gòu)建容器和服務(wù)來完成各種任務(wù):利用Docker為新項目建立測試環(huán)境,演示如何使用持續(xù)集成的工作流集成Docker,如何構(gòu)建應(yīng)用程序服務(wù)和平臺,如何使用Docker的API,如何擴(kuò)展Docker。

      本文轉(zhuǎn)載自異步社區(qū)。

      軟件開發(fā) 架構(gòu)設(shè)計

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:WPS學(xué)校紅頭文件標(biāo)題怎么做?
      下一篇:excel表格去重怎樣操作(excel表格里怎么去重)
      相關(guān)文章
      亚洲国产高清国产拍精品| 亚洲精品网站在线观看你懂的| 亚洲一卡二卡三卡四卡无卡麻豆| 国产亚洲视频在线播放| 国产综合成人亚洲区| 久久精品国产亚洲AV| www亚洲精品久久久乳| 亚洲熟女精品中文字幕| 亚洲日韩亚洲另类激情文学| 中文无码亚洲精品字幕| 日本亚洲免费无线码| 亚洲人成电影网站色| 亚洲av日韩av永久无码电影| 亚洲av乱码一区二区三区按摩| 久久无码av亚洲精品色午夜| 日本中文一区二区三区亚洲| 亚洲国产精品专区在线观看| 亚洲欧洲国产成人综合在线观看 | 亚洲一区日韩高清中文字幕亚洲 | 伊人久久精品亚洲午夜| 在线亚洲精品福利网址导航| 亚洲五月综合缴情在线观看| 国产A在亚洲线播放| 亚洲国产精品久久| 亚洲国产成人久久99精品| 亚洲自国产拍揄拍| 亚洲狠狠婷婷综合久久| 国产精品亚洲а∨天堂2021| 国产亚洲?V无码?V男人的天堂| 亚洲精品无码mv在线观看网站| 亚洲精品免费在线观看| 91亚洲国产成人久久精品| 亚洲色成人四虎在线观看| 国产亚洲蜜芽精品久久| 国产aⅴ无码专区亚洲av麻豆| 久久精品视频亚洲| 亚洲国产精品久久网午夜| 亚洲国产欧美一区二区三区| 亚洲精品国产自在久久 | 亚洲国产欧美国产综合一区| 亚洲av成人一区二区三区在线观看|