如果你是Docker的新手,看一下你應(yīng)該學(xué)習(xí)的一些基礎(chǔ)命令,以便開(kāi)始管理容器。
Docker對(duì)軟件開(kāi)發(fā)生命周期產(chǎn)生了巨大影響,使得大規(guī)模軟件部署變得簡(jiǎn)單而且安全。這個(gè)教程將介紹運(yùn)行、啟動(dòng)、停止和刪除Docker容器的基礎(chǔ)知識(shí)。
Docker使得在不同的操作系統(tǒng)上使用不同的編程語(yǔ)言很容易,而所有這些都在同一主機(jī)上實(shí)現(xiàn)。
在Docker之后部署你的軟件變得更加容易,你不必?fù)?dān)心錯(cuò)過(guò)系統(tǒng)配置或先決條件。
Docker與虛擬機(jī)
如果你正使用虛擬運(yùn)行你的軟件,為什么還需要Docker來(lái)取代呢?
它們之間的主要區(qū)別在于Docker是一個(gè)在你的本機(jī)操作系統(tǒng)中運(yùn)行的獨(dú)立進(jìn)程,而虛擬機(jī)是一個(gè)完整的隔離操作系統(tǒng),它在主機(jī)操作系統(tǒng)之上運(yùn)行,需要更多時(shí)間來(lái)加載。所以Docker比虛擬機(jī)有更多優(yōu)勢(shì),例如:
- 加載速度與虛擬機(jī)不同,所需的硬件資源很少。
- 在同一操作系統(tǒng)上同時(shí)運(yùn)行多個(gè)Docker容器。
- 你可以修改容器并對(duì)其進(jìn)行部署,或?qū)ocker文件定義提供給朋友,以便在同一環(huán)境中工作。
實(shí)際上,Docker不是虛擬機(jī)的替代品,而是解決特定問(wèn)題。
假設(shè)你的應(yīng)用程序需要3個(gè)或更多在不同操作系統(tǒng)上運(yùn)行的服務(wù),那么你可以在同一主機(jī)上平穩(wěn)運(yùn)行3個(gè)容器,而不是在同一主機(jī)上運(yùn)行3個(gè)虛擬機(jī)。聽(tīng)起來(lái)很棒!
運(yùn)行你的容器
在開(kāi)始之前,請(qǐng)確保已正確安裝Docker并準(zhǔn)備好接受命令。在新的終端窗口中鍵入以下命令:
$ docker -v
以上命令輸出PC上安裝的Docker版本:
Docker version 17.12.0-ce-rc2, build f9cde63
是時(shí)候開(kāi)始運(yùn)行容器了:
$ docker container run alpine echo "Hello World"
當(dāng)您第一次運(yùn)行上述命令時(shí),你應(yīng)該在終端窗口中看到與此類似的輸出:
這很容易,不是嗎?嘗試再次運(yùn)行相同的命令:
$ docker container run alpine echo "Hello World"
運(yùn)行上述命令的第二,第三或第n次,你應(yīng)該只在終端中看到此輸出:
Hello World
現(xiàn)在你已成功運(yùn)行容器,現(xiàn)在是時(shí)候分析究竟發(fā)生了什么。查看以下命令:
$ docker container run alpine echo "Hello World"
該命令包含多個(gè)部分。首先,你有“docker”這個(gè)詞。這是Docker命令行界面(CLI)的名稱,用于與負(fù)責(zé)運(yùn)行容器的Docker引擎進(jìn)行交互。
接下來(lái),您有單詞“container”,它表示你正在使用的上下文。
再下一步是 實(shí)際要執(zhí)行的命令run。
現(xiàn)在,還需要告訴Docker運(yùn)行哪個(gè)容器。在這里,運(yùn)行的是 alpine 容器。
最后,需要定義在容器運(yùn)行時(shí),應(yīng)在容器內(nèi)執(zhí)行的進(jìn)程或任務(wù)類型。這是命令的最后一部分,echo "Hello World"。
在容器內(nèi)運(yùn)行進(jìn)程
既然已經(jīng)了解了運(yùn)行容器的命令的各個(gè)部分,請(qǐng)嘗試在另一個(gè)容器中運(yùn)行不同的進(jìn)程:
$ docker container run centos ping -c 5 127.0.0.1
輸出如下:
在前面的示例中,使用的容器鏡像是CentOS,并且在CentOS容器內(nèi)執(zhí)行的進(jìn)程是ping -c 5 127.0.0.1,它將環(huán)回地址ping五次直到它停止。
第一行如下:
Unable to find image 'centos:latest' locally
這告訴你Docker沒(méi)有在系統(tǒng)的本地緩存中找到名為centos:latest的鏡像。因此,Docker知道它必須從存儲(chǔ)容器的某個(gè)鏡像源中提。
默認(rèn)情況下,Docker環(huán)境配置為從hub.docker.com的Docker Hub中提取鏡像。這由第二行表示如下:
latest: Pulling from library/centos
接下來(lái)的三行輸出如下:
85432449fd0f: Pull completeDigest: sha256:3b1a65e9a05...Status:
這告訴您Docker已成功從Docker Hub中提取了鏡像centos:latest。
后續(xù)的輸出都是由容器內(nèi)運(yùn)行的進(jìn)程生成的,這里運(yùn)行的是ping工具。
你可能還注意到latest這個(gè)關(guān)鍵字出現(xiàn)了幾次。每個(gè)映像都有一個(gè)版本(也稱為標(biāo)記),如果沒(méi)有明確指定版本,則Docker會(huì)自動(dòng)其視為最新版本。
如果在系統(tǒng)上再次運(yùn)行這個(gè)容器,將不會(huì)輸出之前的五行,因?yàn)镈ocker將在本地緩存容器映像,因此不必先下載它。試試是不是這樣。
運(yùn)行一個(gè)隨機(jī)引用容器
為了運(yùn)行隨機(jī)語(yǔ)句容器,需要一個(gè)生成隨機(jī)語(yǔ)句的算法??梢栽诖颂嶽1]找到生成這些隨機(jī)語(yǔ)句的API。
現(xiàn)在的目標(biāo)是要在容器內(nèi)運(yùn)行一個(gè)進(jìn)程,每5秒生成一條隨機(jī)語(yǔ)句,并且輸出到STDOUT:
按Ctrl + C停止腳本。這是輸出:
每個(gè)響應(yīng)都是一個(gè)JSON格式的字符串,包含引號(hào),作者及其類別。
現(xiàn)在,讓這個(gè)容器后臺(tái)運(yùn)行。為此,需要將前面的腳本縮成一行,并使用 /bin/sh -c “…” 來(lái)執(zhí)行。Docker 的表達(dá)式如下:
$ docker container run -d --name quotes alpine \ /bin/sh -c "while :; do wget -qO- https://talaikis.com/api/quotes/random; printf '\n'; sleep 5; done"
上面的表達(dá)式,你使用了兩個(gè)命令行參數(shù),-d 和--name。-d告訴Docker以一個(gè)Linux守護(hù)進(jìn)程的方式運(yùn)行容器。-name參數(shù)用于為容器指定顯式名稱。
如果您未指定顯式容器名稱,Docker將自動(dòng)為容器分配一個(gè)隨機(jī)但唯一的名稱。這個(gè)名字將由一位著名科學(xué)家的名字和一個(gè)形容詞組成。
諸如,“boring_borg”或“angry_goldberg”。相當(dāng)幽默,不是嗎?
一個(gè)重要的方面是容器名稱必須是唯一的。確保引號(hào)容器已啟動(dòng)并正在運(yùn)行:
$ docker container ls -l
前面輸出的重要部分是STATUS列,此例中,它顯示UP 16 seconds。這意味著容器已經(jīng)啟動(dòng)并運(yùn)行了16秒。
列表容器
隨著時(shí)間的推移繼續(xù)運(yùn)行容器,你的系統(tǒng)也許會(huì)產(chǎn)生很多容器。要查找主機(jī)上當(dāng)前正在運(yùn)行的容器,可以使用container ls命令,如下所示:
$ docker container ls
這將列出所有當(dāng)前運(yùn)行的容器。
默認(rèn)情況下,Docker輸出七列,含義如下:
如果要列出系統(tǒng)上定義的所有容器,可以使用命令行參數(shù) -a 或 -all,如下所示:
$ docker container ls -a
這將列出任何狀態(tài)的容器,無(wú)論是創(chuàng)建,運(yùn)行還是退出。
有時(shí),可能只想列出所有容器的ID。為此,你有 -q 參數(shù):
$ docker container ls -q
你可能想知道這有什么用。這里有個(gè)例子:
$ docker container rm -f $(docker container ls -a -q)
上面的命令刪除當(dāng)前在系統(tǒng)上定義的所有容器,包括已停止的容器。rm命令代表刪除,將在本教程中進(jìn)一步解釋。
在上一節(jié)中,您在list命令中使用了-l參數(shù)。嘗試使用Docker幫助找出-l參數(shù)代表什么。您可以為list命令調(diào)用help,如下所示:
$ docker container ls -h
停止和啟動(dòng)容器
有時(shí),你可能需要暫時(shí)停止正在運(yùn)行的容器。試試以下這個(gè)容器:
$ docker container run -d --name quotes alpine \ /bin/sh -c "while :; do wget -qO- https://talaikis.com/api/quotes/random; printf '\n'; sleep 5; done"
現(xiàn)在,你可以使用以下命令停止此容器:
$ docker container stop quotes
當(dāng)你嘗試暫停容器時(shí),可能會(huì)注意到它需要一段時(shí)間(大約10秒)才能執(zhí)行完成。為什么會(huì)這樣? Docker將 Linux SIGTERM信號(hào)發(fā)送到容器內(nèi)運(yùn)行的主進(jìn)程。
在上面的命令中,容器的名稱用于指定要停止的容器。也可以使用容器ID。
你如何獲得容器ID?
有幾種方法可以做到這一點(diǎn)。手動(dòng)方法是列出所有正在運(yùn)行的容器,并在列表中找到您要查找的容器。只需從那里復(fù)制其ID。
更自動(dòng)化的方法是使用shell腳本和環(huán)境變量。例如,如果要獲取引號(hào)容器的ID,這是一個(gè)示例:
$ export CONTAINER_ID = $(docker container ls | grep quotes | awk '{print $1}')
這里我們使用AWK獲取第一個(gè)字段,即容器ID。現(xiàn)在,您可以在表達(dá)式中使用$CONTAINER_ID變量,而不是使用容器名稱:
$ docker container stop $CONTAINER_ID
一旦停止容器后,其狀態(tài)將更改為“已退出”。
你可以使用docker container start命令重新啟動(dòng)已停止的容器。
移除容器
運(yùn)行docker container ls -a命令時(shí),您可以看到很多處于“已退出”狀態(tài)的容器。
如果您不再需要這些容器,最好將它們從內(nèi)存中刪除;否則,他們會(huì)占用寶貴的資源。刪除容器的命令如下:
$ docker container rm <container ID>
或者,也可以使用此命令:
$ docker container rm <container name>
有時(shí),無(wú)法刪除正在運(yùn)行的容器;如果要強(qiáng)制刪除,可以使用命令行參數(shù) -f 或 -force。
容器化改變了行業(yè)運(yùn)行方式,將維護(hù)成本降低了50%以上,并將產(chǎn)品上市時(shí)間縮短了約90%。此外,相對(duì)于容器外運(yùn)行,容器使應(yīng)用程序更安全。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接