mysql执行shell命令_关键Docker命令:使用Docker必须掌握的公认宝典
讀者可以將下面的命令綱要當(dāng)作成功使用Docker必須掌握的公認(rèn)寶典——從搜索和構(gòu)建鏡像到創(chuàng)建自己的Dockerfile。我們先看一些簡(jiǎn)單的命令,然后在此基礎(chǔ)上接觸更復(fù)雜的命令。
7.1.1 docker search
docker search命令能夠在Docker CLI上運(yùn)行,以搜索Docker注冊(cè)中心中可用的鏡像:
docker search [options] term基于圖形界面的客戶端也提供了搜索功能。
在圖7-1展示的例子中,docker search mysql返回所有鏡像名字中包含“mysql”的鏡像。正如所見(jiàn)到的,它返回了前25個(gè)結(jié)果。基于圖形界面的搜索提供了相似的結(jié)果,如圖7-2所示。
圖7-1 Docker搜索“mysql”的結(jié)果
圖7-2 基于圖形界面搜索“mysql”的結(jié)果
盡管像dockerizedrupal這樣的一些結(jié)果是唯一的,但多數(shù)結(jié)果是重復(fù)的,因?yàn)檫@些鏡像被不同用戶上傳,這些用戶將鏡像用于定制或者用于進(jìn)行集成。當(dāng)使用-s選項(xiàng)時(shí),搜索只提供被廣泛使用(基于其他用戶的反饋)的文件:
docker search –s 50 mysql該命令會(huì)返回鏡像名中包含“mysql”并且反饋至少有50顆星的所有鏡像,如圖 7-3所示。
圖7-3 鏡像名字中有“mysql”并且反饋至少有50顆星的搜索結(jié)果
在這種情況下,只列出兩條,因?yàn)槌^(guò)50評(píng)級(jí)的只有兩條。
注意 Docker一直以驚人的速度發(fā)展,因此命令、選項(xiàng)甚至特性和功能都在不同版本之間頻繁變化。例如,在編寫(xiě)本書(shū)時(shí),搜索的-s被廢棄了,取而代之的是必須使用稱為--filter的標(biāo)志。對(duì)于filter選項(xiàng),列出所有評(píng)價(jià)星級(jí)超過(guò)50顆的所有MySQL鏡像的命令會(huì)是docker search --filter stars=50 mysql7.1.2 docker pull
docker pull命令將請(qǐng)求的鏡像從Docker注冊(cè)中心下載到本地機(jī)器:
docker pull image:tag例如,如圖7-4所示,docker pull mysql從注冊(cè)中心拉取MySQL鏡像。如果沒(méi)有指定版本之類的標(biāo)簽,這個(gè)命令默認(rèn)會(huì)附加“l(fā)atest”標(biāo)簽,而不是拉取所有可用的MySQL鏡像。這個(gè)命令等價(jià)于
docker pull MySQL:latest圖7-4 docker pull從注冊(cè)中心拉取MySQL的latest鏡像
7.1.3 docker images
docker images命令返回本地機(jī)器上可用的頂層鏡像列表:
docker images[options]例如,docker images-a展示所有頂層鏡像列表,包括它們的倉(cāng)庫(kù)、標(biāo)簽、創(chuàng)建日期和虛擬尺寸,如圖7-5所示,但它沒(méi)有展示中間層的鏡像。
圖7-5 docke images-a命令展示所有頂層鏡像列表,包括它們的倉(cāng)庫(kù)、標(biāo)簽、創(chuàng)建日期和虛擬尺寸
要記住的一件重要的事情是,當(dāng)在本地機(jī)器上創(chuàng)建或構(gòu)建Docker鏡像時(shí),也創(chuàng)建了各種中間層。例如,如果使用包含多個(gè)命令的Dockerfile構(gòu)建鏡像,則執(zhí)行的每個(gè)命令都會(huì)產(chǎn)生一個(gè)鏡像層,這是Docker的關(guān)鍵方面之一,這使容器輕量并且非常適合復(fù)用。
7.1.4 docker rmi
docker rmi命令從本地機(jī)器上刪除所要求的鏡像:
docker rmi[options] image [image, image...]例如,圖7-6所示的docker rmi mysql命令從宿主機(jī)上刪除了MySQL鏡像,包括安裝的所有層。
圖7-6 通過(guò)docker rmi mysql命令刪除MySQL鏡像
7.1.5 docker run
下載(拉取)了鏡像之后,下一步就是執(zhí)行(運(yùn)行)鏡像,這正是docker run命令所要做的事情:
docker run [options] image: tag [command, args]這個(gè)命令使用容器自己的文件系統(tǒng)、端口和IP地址啟動(dòng)容器。我們還可以用一個(gè)或多個(gè)參數(shù)給run命令傳遞一些選項(xiàng)。下面是一些常用選項(xiàng):
i切換到STDIN打開(kāi)的交互模式;
t分配一個(gè)偽tty控制臺(tái)終端。
docker run命令還有許多其他選項(xiàng),例如,以分離(-d)狀態(tài)(后臺(tái))啟動(dòng)進(jìn)程,也就是說(shuō),容器會(huì)啟動(dòng)但不監(jiān)聽(tīng)命令行。我們可以指定命令來(lái)覆蓋想要運(yùn)行的鏡像自身的默認(rèn)命令,也可以指定CPU和內(nèi)存方面的運(yùn)行時(shí)約束。
舉個(gè)例子,讓我們拉取Ubuntu鏡像并執(zhí)行run命令(見(jiàn)圖7-7):
docker pull ubuntu:latest圖7-7 從Docker Hub倉(cāng)庫(kù)下載Ubuntu鏡像
該命令將最新的Ubuntu鏡像拉取到本地主機(jī)上,如圖7-8所示。
圖7-8 拉取的最新Ubuntu鏡像
現(xiàn)在,讓我們用i和t選項(xiàng)在本地主機(jī)上運(yùn)行Ubuntu。我們還指明了我們想要運(yùn)行shell進(jìn)程:
docker run –it ubuntu sh現(xiàn)在我們?cè)诒镜貦C(jī)器上運(yùn)行了一個(gè)帶有shell提示符入口的Ubuntu容器。從這里,我們可以運(yùn)行我們想要的任何shell命令。圖7-9展示了幾個(gè)簡(jiǎn)單的例子。例如:
echo 'Learning Docker';
ls;
cd bin(為了查看bin目錄的內(nèi)容)。
圖7-9 運(yùn)行交互式shell
正如所見(jiàn),bin目錄有系統(tǒng)運(yùn)轉(zhuǎn)所需的關(guān)鍵程序。
7.1.6 docker ps
docker ps命令列出所有正在運(yùn)行的容器(見(jiàn)圖7-10):
docker ps [Options]記住,每個(gè)容器運(yùn)行且只運(yùn)行一個(gè)進(jìn)程。在這個(gè)例子中,沒(méi)有正在運(yùn)行的容器,因此展示了一個(gè)空列表。
圖7-10 docker ps命令顯示了所有當(dāng)前正在運(yùn)行的容器
讓我們用-a選項(xiàng)再次運(yùn)行ps命令,如圖7-11所示,以查看所有容器,甚至是那些沒(méi)有運(yùn)行的容器。
圖7-11 -a選項(xiàng)將不活躍的容器混合到結(jié)果中
正如所見(jiàn),由于退出了shell提示符,Ubuntu容器不再運(yùn)行或活躍,但是它并沒(méi)有被刪除,只是不活躍而已。如果愿意,我們可以重啟容器,我們很快就會(huì)學(xué)到。
7.1.7 docker logs
docker ogs命令提供了指定容器的日志文件,該日志文件包含了容器的標(biāo)準(zhǔn)輸出(stdout和stderr):
docker logs [Options] Container這一命令僅適用于帶有JSON文件日志驅(qū)動(dòng)的容器。舉個(gè)例子,讓我們用下面的命令運(yùn)行shell進(jìn)程:
docker run –it ubuntu sh運(yùn)行幾個(gè)shell命令,如ls -a和cd bin,如圖7-12所示。
圖7-12 shell命令的一些例子
打開(kāi)另一個(gè)終端窗口,通過(guò)下面的命令來(lái)查找我們剛剛啟動(dòng)的Ubuntu容器的容器ID(見(jiàn)圖7-13):
docker ps –a圖7-13 查找我們剛剛啟動(dòng)的Ubuntu容器的容器ID
復(fù)制運(yùn)行的Ubuntu容器的容器ID。現(xiàn)在,我們可以執(zhí)行l(wèi)og命令來(lái)查看這個(gè)特定容器的日志(見(jiàn)圖7-14):
docker log eded3539719c我們能夠看到日志的內(nèi)容,在這個(gè)例子中是已經(jīng)執(zhí)行的命令的歷史。
圖7-14 執(zhí)行l(wèi)og命令來(lái)查看容器的日志
舉一個(gè)更復(fù)雜的例子。讓我們先下載并創(chuàng)建MySQL容器。
首先,拉取最新的MySQL鏡像(見(jiàn)圖7-15):
docker pull MySQL: latest圖7-15 拉取的最新MySQL鏡像
下一步,使用run命令創(chuàng)建MySQL容器(見(jiàn)圖7-16),并記錄容器ID:
docker run --name myDatabase > -e MySQL_ROOT_PASSWORD=myPassword > -d MySQL:latest這里,name是數(shù)據(jù)庫(kù)名,e是指定數(shù)據(jù)庫(kù)密碼的環(huán)境變量的標(biāo)志,docker run命令的d選項(xiàng)以分離模式啟動(dòng)進(jìn)程。
圖7-16 運(yùn)行MySQL容器
接下來(lái),驗(yàn)證容器進(jìn)程:
docker ps注意,容器啟動(dòng)并運(yùn)行起來(lái),如圖7-17所示。
圖7-17 驗(yàn)證容器進(jìn)程
現(xiàn)在容器已經(jīng)啟動(dòng)并運(yùn)行起來(lái),我們需要連接它。我們首先要知道的是端口。盡管我們知道默認(rèn)端口是什么,但我們還是通過(guò)運(yùn)行l(wèi)ogs命令來(lái)檢查一下日志文件:
docker logs fcb85434597b這里,fcb85434597b是之前啟動(dòng)的容器的容器ID(見(jiàn)圖7-18)。
圖7-18 運(yùn)行l(wèi)ogs命令
如圖7-19所示,我們看到MySQL的版本和正在監(jiān)聽(tīng)的端口。請(qǐng)?jiān)俅巫⒁?#xff0c;Docker日志展示了容器的stdout和stderr的信息,不要將其與MySQL的標(biāo)準(zhǔn)日志文件混淆。
圖7-19 MySQL的版本及正在監(jiān)聽(tīng)的端口
注意 另一個(gè)檢查容器正在監(jiān)聽(tīng)什么端口的方法是查看docker ps輸出。如果你有留意,圖7-18中有一個(gè)PORTS列顯示了3306/tcp,這表明MySQL將監(jiān)聽(tīng)3306端口。7.1.8 docker restart
docker restart命令會(huì)重啟指定的容器:
docker restart [Options] Container ID (s)讓我們通過(guò)指定容器ID來(lái)重啟Ubuntu容器,前面的例子中該容器ID是c8b9770c88e9,如圖7-20所示。
圖7-20 重啟Ubuntu容器
如果再次運(yùn)行ps命令,應(yīng)該會(huì)看到一個(gè)活動(dòng)的容器,如圖7-21所示。
圖7-21 ps命令顯示了一個(gè)活動(dòng)的容器
正如所見(jiàn),我們沒(méi)有得到shell提示符。我們可以通過(guò)運(yùn)行docker attach命令來(lái)解決這個(gè)問(wèn)題,接下來(lái)將討論這個(gè)命令。
7.1.9 docker attach
docker attach命令允許使用者連接到指定的正在運(yùn)行的容器上,以交互式地控制它或者查看正在進(jìn)行的輸出:
docker attach[Options] Container ID運(yùn)行這個(gè)命令,連接到c8b9770c88e9的Ubuntu容器,以與shell提示符交互,如圖7-22所示。
圖7-22 通過(guò)docker attach命令與shell提示符交互
注意,命令提示符回來(lái)了,我們可以繼續(xù)了。另一個(gè)重要的方面是,無(wú)論什么時(shí)候重啟這個(gè)容器,我們總是會(huì)得到shell提示符。我們無(wú)法改變其行為,因?yàn)檫@是最初在run命令中使用-it啟動(dòng)容器的方式。不過(guò)我們肯定可以使用不同的選項(xiàng)、參數(shù)和命令再次運(yùn)行相同的Ubuntu鏡像。這正是Docker的美妙之處。
7.1.10 docker rm
docker rm命令會(huì)刪除一個(gè)或多個(gè)指定的容器:
docker rm [Options] Container(s)例如,讓我們嘗試刪除Ubuntu容器。在刪除容器前必須停止容器,或者使用-f(強(qiáng)制)選項(xiàng)直接刪除容器,這實(shí)際上會(huì)給容器內(nèi)運(yùn)行的進(jìn)程發(fā)送SKGKILL,然后將容器刪除:
docker stop [Options] Container(s)圖7-23展示了Ubuntu容器的狀態(tài)。Ubuntu容器處于運(yùn)行狀態(tài),并已經(jīng)運(yùn)行了38個(gè)小時(shí),如狀態(tài)屬性所示。
圖7-23 Ubuntu容器的狀態(tài)
讓我們運(yùn)行stop命令并再次執(zhí)行ps`` -``a,如圖7-24所示。
圖7-24 運(yùn)行stop命令并再次執(zhí)行ps -a
正如所見(jiàn),容器不再運(yùn)行,狀態(tài)是以代碼137退出,這意味著容器收到了SIGKILL命令。stop命令會(huì)在一定的寬限期之后發(fā)送SIGTERM和SIGKILL。我們可以用-t選項(xiàng)指定秒數(shù)來(lái)調(diào)整寬限期。當(dāng)我們想讓進(jìn)程完成重要的請(qǐng)求時(shí),時(shí)間選項(xiàng)對(duì)這樣的實(shí)例可能是非常重要的,HTTP就是這種情況。
我們也可以使用docker kill命令,它直接發(fā)送SIGKILL。它不會(huì)給容器進(jìn)程優(yōu)雅地退出的機(jī)會(huì),但它讓我們可以向容器進(jìn)程發(fā)送除SIGKILL之外的其他東西。
現(xiàn)在,容器停止了,讓我們刪除容器并再次執(zhí)行ps -a,如圖7-25所示。
圖7-25 被刪除的容器
注意,容器已經(jīng)被完全刪除,ps -a命令中已經(jīng)沒(méi)有任何蹤跡。
7.1.11 docker inspect
docker inspect命令提供了關(guān)于容器或鏡像的底層、深入的信息:
docker inspect [Options] Container ID/Image讓我們?cè)贛ySQL容器上運(yùn)行這個(gè)命令,如圖7-26所示。回想一下,fcb85434597b是之前示例的容器ID:
docker inspect fcb85434597b圖7-26 docker inspect的結(jié)果
注意,這個(gè)命令返回了包含所有信息的完整的JSON數(shù)組。我們還可以指定其他格式或者查詢某些特定信息,如數(shù)據(jù)庫(kù)名、IP地址和端口信息。
下面這一命令將返回?cái)?shù)據(jù)庫(kù)名:
docker inspect –format='{{.Name}}' fcb85434597b下面這一命令將返回MySQL容器的IP地址:
docker inspect > –format='{{.NetworkSettings.IPAddress}}' fcb85434597b7.1.12 docker exec
docker exec命令可以在已經(jīng)運(yùn)行的容器中遠(yuǎn)程運(yùn)行命令:
docker exec [Options] Container ID Command [Arg...]讓我們?cè)赨buntu容器中運(yùn)行這個(gè)命令,如圖7-27所示。c8b9770c88e9是之前示例的容器ID:
docker exec c8b9770c88e9 ls -a圖7-27 docker exec命令可以在已經(jīng)運(yùn)行的容器中運(yùn)行命令
7.1.13 docker rename
是否已經(jīng)厭倦了復(fù)制和粘貼容器ID?我們可以給容器起有意義的名字,這樣可以更容易記憶和分類。使用docker rename命令可以重新命名已經(jīng)運(yùn)行的容器:
Usage: docker rename Container ID new_name讓我們重新給Ubuntu容器命名。先來(lái)查找已有的名字:
docker ps -a注意,在圖7-28中,容器當(dāng)前的名字是jolly_gates。
圖7-28 docker ps -a的結(jié)果
讓我們執(zhí)行rename命令:
docker rename e510f8e769fc Parminder注意,在圖7-29中,執(zhí)行rename命令改變了容器的名字。
圖7-29 容器重新命名成功
我們現(xiàn)在可以使用這個(gè)新名字運(yùn)行其他各種命令,而不是使用8位數(shù)的ID,如圖7-30所示。
圖7-30 用新名字運(yùn)行其他命令
7.1.14 docker cp
docker cp命令能夠在容器和運(yùn)行容器的機(jī)器之間復(fù)制文件。下面的命令形式將文件從容器復(fù)制到本地機(jī)器:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH下面的命令形式將文件從本地機(jī)器復(fù)制到指定的容器:
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH讓我們用Ubuntu容器運(yùn)行第一個(gè)命令。圖7-31展示了這個(gè)例子中要使用的sample.txt文件。
圖7-31 我們將使用的sample.txt文件
Parminder是之前示例的容器名,下面是復(fù)制文件的命令(見(jiàn)圖7-32):
docker cp Parminder:/var/sample.txt .圖7-32 將文件從Parminder容器復(fù)制到本地機(jī)器
現(xiàn)在讓我們嘗試將文件從本地機(jī)器復(fù)制到容器的命令。這里,我們使用本地機(jī)器上名為MyFile.txt的示例文件,如圖7-33所示。
圖7-33 將MyFile.txt文件從本地機(jī)器復(fù)制到容器
下面的命令將MyFile.txt文件復(fù)制到名為Parminder的容器中并存放在/var目錄下,如圖7-34所示。Parminder是之前示例中的容器名:
docker cp MyFile.txt Parminder:/var圖7-34 將MyFile.txt從本地機(jī)器復(fù)制到名為Parminder的容器的/var目錄下
7.1.15 docker pause/unpause
docker pause命令掛起指定容器內(nèi)的所有進(jìn)程:
docker pause CONTAINER [CONTAINER...]在Linux中,這個(gè)命令使用了cgroups的freezer。docker unpause命令讓容器再次運(yùn)行:
docker unpause CONTAINER [CONTAINER...]讓我們用Ubuntu容器運(yùn)行docker pause命令,如圖7-35所示。Parminder是之前示例的容器名:
docker pause Parminder圖7-35 用Ubuntu容器運(yùn)行docker pause命令
我們剛剛暫停了容器,有效地暫停了其中所有進(jìn)程。嘗試在容器內(nèi)運(yùn)行命令,會(huì)發(fā)現(xiàn)與圖7-36所示的類似情況。
圖7-36 嘗試在已暫停的容器內(nèi)運(yùn)行命令
讓我們?nèi)∠麜和?#xff08;見(jiàn)圖7-37):
docker unpause Parminder圖7-37 取消暫停的容器
由于我們剛剛?cè)∠萜鞯臅和?#xff0c;因此所有進(jìn)程又再次恢復(fù)運(yùn)行。掛起的ls命令(處于等待狀態(tài))也完成了運(yùn)行,如圖7-38所示。
圖7-38 掛起的ls命令,之前處于等待狀態(tài),現(xiàn)在完成了執(zhí)行
7.1.16 docker create
docker create命令在指定鏡像之上創(chuàng)建可寫(xiě)的容器層并為運(yùn)行指定的命令做好準(zhǔn)備:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]容器ID會(huì)作為結(jié)果輸出。這個(gè)命令與運(yùn)行docker run -d的細(xì)微差別在于容器并沒(méi)有啟動(dòng)。接下來(lái)可以使用docker start命令啟動(dòng)容器。例如,當(dāng)IT團(tuán)隊(duì)想要預(yù)先搭建一個(gè)容器,以便在準(zhǔn)備好上線時(shí)可以隨時(shí)啟動(dòng)的時(shí)候,這種創(chuàng)建容器卻推遲啟動(dòng)的能力是很方便的。
讓我們創(chuàng)建一個(gè)新容器(見(jiàn)圖7-39):
docker create -t -i fedora bash圖7-39 新創(chuàng)建的容器
注意,這個(gè)容器被創(chuàng)建了但并未啟動(dòng)。
7.1.17 docker commit
docker commit命令簡(jiǎn)單但卻非常重要——它容許用容器的更改來(lái)創(chuàng)建新鏡像:
docker commit{Options} Container [Repository:Tag]當(dāng)對(duì)容器進(jìn)行了修改并且想將其作為新鏡像發(fā)送給另一個(gè)開(kāi)發(fā)者或測(cè)試團(tuán)隊(duì)時(shí),這個(gè)命令可以從運(yùn)行的容器創(chuàng)建新鏡像。
7.1.18 docker diff
docker diff命令是另一個(gè)重要命令,它的功能不言而喻——列出容器文件系統(tǒng)中變化的文件和目錄:
docker diff Container ID隨著時(shí)間推移,當(dāng)對(duì)容器進(jìn)行了修改時(shí),這個(gè)命令會(huì)突出顯示文件系統(tǒng)相對(duì)于基礎(chǔ)鏡像的差異。
本文摘自《微服務(wù)與容器》
本書(shū)作者長(zhǎng)期擔(dān)任系統(tǒng)架構(gòu)和工程團(tuán)隊(duì)的領(lǐng)導(dǎo)者,他在本書(shū)中分析了兩個(gè)最熱的新技術(shù)趨勢(shì)——微服務(wù)和容器。正如作者所展示的,微服務(wù)和Docker容器能夠?yàn)閼?yīng)用開(kāi)發(fā)和部署帶來(lái)的敏捷性和伸縮性,特別是在速度是關(guān)鍵而小錯(cuò)誤可能帶來(lái)災(zāi)難性后果的復(fù)雜的大型項(xiàng)目中。
為了便于讀者學(xué)習(xí)如何利用微服務(wù)和Docker 來(lái)驅(qū)動(dòng)模塊化架構(gòu)設(shè)計(jì)、按需擴(kuò)展、應(yīng)用性能和可靠性、上市時(shí)間、代碼復(fù)用以及DevOps 效能的指數(shù)級(jí)提升,作者不但提供了從單體架構(gòu)遷移的詳細(xì)指導(dǎo)和完整路線圖,而且提供了一個(gè)帶領(lǐng)讀者了解企業(yè)級(jí)SOA 系統(tǒng)遷移的深入的案例研究。
本書(shū)對(duì)軟件架構(gòu)師/開(kāi)發(fā)者、希望繼續(xù)堅(jiān)持使用舊方法的系統(tǒng)專業(yè)人員以及嘗試*大化這些技術(shù)的業(yè)務(wù)價(jià)值的管理者,都是很寶貴的參考資料。
- 理解微服務(wù)如何能夠讓使用者將應(yīng)用組織到易于管理、更新和擴(kuò)展的獨(dú)立組件中。
- 決定微服務(wù)和容器是否值得投入并管理與它們相關(guān)的組織學(xué)習(xí)曲線。
- 應(yīng)用微服務(wù)之間進(jìn)程間通信的*佳實(shí)踐。
- 以有序的方式遷移單體系統(tǒng)。
- 理解Docker 容器,了解Docker的安裝和Docker接口。
- 網(wǎng)絡(luò)、編排和有效地管理Docker容器。
- 使用Docker*大化基于微服務(wù)的應(yīng)用的擴(kuò)展性。
- 通過(guò)深入、動(dòng)手的案例研究來(lái)應(yīng)用所學(xué)。
總結(jié)
以上是生活随笔為你收集整理的mysql执行shell命令_关键Docker命令:使用Docker必须掌握的公认宝典的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Word 打印技巧大全,打印文档必须要掌
- 下一篇: redis存储新闻列表_Redis对象—