版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Docker容器平臺技術(shù)使用指南
目錄第一部分Docker容器技術(shù)基礎(chǔ)及其應(yīng)用場景介紹
1.1Docker的基本概念
1.2為什么使用Docker
1.3Docker體系結(jié)構(gòu)簡介
1.4Docker容器技術(shù)的應(yīng)用場景
第二部分核心概念與安裝配置
2.1核心概念
2.2安裝Docker
2.2.1在RedHatEnterpriseLinux上安裝Docker
2.2.2在Windows上安裝Docker
2.2.3在CentOS環(huán)境下安裝Docker
第三部分使用Docker鏡像
3.1獲取鏡像
3.2查看鏡像信息
3.3搜尋鏡像
3.4刪除鏡像
3.5創(chuàng)建鏡像
3.6存出和載入鏡像
3.7上傳鏡像
第四部分操作Docker容器
4.1創(chuàng)建容器
4.2終止容器
4.3進(jìn)入容器
4.4刪除容器
4.5導(dǎo)入和導(dǎo)出容器
4.6實(shí)現(xiàn)容器的網(wǎng)絡(luò)端口映射
第五部分Docker容器實(shí)現(xiàn)Web服務(wù)與應(yīng)用5.1Docker容器實(shí)現(xiàn)Apache服務(wù)5.2Docker容器實(shí)現(xiàn)Nginx服務(wù)
5.3Docker容器實(shí)現(xiàn)Python應(yīng)用
5.4Docker容器實(shí)現(xiàn)MySQL服務(wù)
第六部分Docker的運(yùn)行監(jiān)控
6.1容器的監(jiān)控方案
6.2單臺主機(jī)上容器的監(jiān)控
6.3跨多臺主機(jī)上容器的監(jiān)控
6.4Kubernetes上容器的監(jiān)控
6.5Mesos的監(jiān)控方案
6.6性能采集工具的對比第一部分Docker容器技術(shù)基礎(chǔ)及其應(yīng)用場景介紹1.1Docker的基本概念Docker容器是資源分割和調(diào)度的基本單位,封裝整個服務(wù)的運(yùn)行時(shí)環(huán)境,用于構(gòu)建、發(fā)布和運(yùn)行分布式應(yīng)用的一個框架。它是一個跨平臺、可移植并且簡單易用的容器解決方案。Docker的源代碼托管在GitHub上,基于Go語言開發(fā)并遵從Apache2.0協(xié)議。Docker容器可以快速自動化地部署應(yīng)用,并通過操作系統(tǒng)內(nèi)核技術(shù)(namespaces、cgroups等)為容器提供資源隔離與安全保障。Docker作為輕量級的虛擬化方式,實(shí)現(xiàn)了PaaS平臺的高效部署、運(yùn)行和維護(hù)。1.2為什么使用Docker(1)
、持續(xù)部署與測試Docker消除了線上線下的環(huán)境差異,保證了應(yīng)用生命周期的環(huán)境一致性和標(biāo)準(zhǔn)化。開發(fā)人員使用鏡像實(shí)現(xiàn)標(biāo)準(zhǔn)開發(fā)環(huán)境的構(gòu)建,開發(fā)完成后通過封裝著完整環(huán)境和應(yīng)用的鏡像進(jìn)行遷移,由此,測試和運(yùn)維人員可以直接部署軟件鏡像來進(jìn)行測試和發(fā)布,大大簡化了持續(xù)集成、測試和發(fā)布的過程。Docker是革命性的,它重新定義了軟件開發(fā)、測試、交付和部署的流程。我們交付的東西不再只是代碼、配置文件、數(shù)據(jù)庫定義等,而是整個應(yīng)用服務(wù)及其運(yùn)行環(huán)境。(2)
、優(yōu)異的跨平臺性Docker在原有Linux容器的基礎(chǔ)上進(jìn)行大膽革新,為容器設(shè)定了一整套標(biāo)準(zhǔn)化的配置方法,將應(yīng)用及其依賴的運(yùn)行環(huán)境打包成鏡像。Docker是可移植(或者說跨平臺)的,可以在各種主流操作系統(tǒng)上使用。Java可以做到“一次編譯,到處運(yùn)行”,而Docker可以“構(gòu)建一次,在各平臺上運(yùn)行”(Buildonce,runanywhere)。越來越多的云平臺都支持Docker,用戶再也無需擔(dān)心受到云平臺的捆綁,同時(shí)也讓應(yīng)用多平臺混合部署成為可能。(3)
、高資源利用率與隔離Docker容器沒有管理程序的額外開銷,與底層共享操作系統(tǒng),性能更加優(yōu)良,系統(tǒng)負(fù)載更低,在同等條件下可以運(yùn)行更多的應(yīng)用實(shí)例,可以更充分地利用系統(tǒng)資源。同時(shí),Docker擁有不錯的資源隔離與限制能力,可以精確地對應(yīng)用分配CPU、內(nèi)存等資源,保證了應(yīng)用間不會相互影響。Docker是輕量級虛擬化技術(shù)。與傳統(tǒng)的VM相比,它更輕量,啟動速度更快,單臺硬件上可以同時(shí)跑成百上千個容器,所以非常適合在業(yè)務(wù)高峰期通過啟動大量容器進(jìn)行橫向擴(kuò)展。Docker容器技術(shù)的直接虛擬化不僅在技術(shù)方面使CPU利用率得到顯著提升,還因80:20法則可在業(yè)務(wù)上更大程度發(fā)揮CPU利用率,真正體現(xiàn)了虛擬化精髓。(4)
、環(huán)境標(biāo)準(zhǔn)化和版本控制可以使用Git等工具對Docker鏡像進(jìn)行版本控制,相比基于代碼的版本控制來說,能夠?qū)φ麄€應(yīng)用運(yùn)行環(huán)境實(shí)現(xiàn)版本控制,一旦出現(xiàn)故障可以快速回滾。相比以前的虛擬機(jī)鏡像,Docker壓縮和備份速度更快,鏡像啟動也像啟動一個普通進(jìn)程一樣快速。(5)
、應(yīng)用鏡像倉庫Docker官方構(gòu)建了一個鏡像倉庫,組織和管理形式類似于GitHub,其上已累積了成千上萬的鏡像。因?yàn)镈ocker的跨平臺適配性,相當(dāng)于為用戶提供了一個非常有用的應(yīng)用商店,所有人都可以自由地下載微服務(wù)組件,這為開發(fā)者提供了巨大便利。1.3Docker體系結(jié)構(gòu)簡介Docker是一個客戶/服務(wù)器(CIient/Server,CS)架構(gòu)(見上圖)。Docker客戶端是遠(yuǎn)程控制器,可通過TCPREST向DockerHost發(fā)送請求,包括創(chuàng)建容器、運(yùn)行容器、保存容器、刪除容器等請求。Docker服務(wù)端的Daemon對客戶端的請求進(jìn)行相應(yīng)的管理,隨后通過driver轉(zhuǎn)發(fā)至容器中的libcontainer執(zhí)行環(huán)境。libcontainer提供與不同Linux內(nèi)核隔離的接口,類似命名空間及控制組。這種架構(gòu)允許多個容器在共享同一個Linux內(nèi)核的情況下完全隔離地運(yùn)行。1.4Docker容器技術(shù)的應(yīng)用場景一般認(rèn)為Docker技術(shù)有以下8個主要的應(yīng)用場景,參見下圖:(1)
、應(yīng)用場景1:簡化配置這是Docker公司宣傳的Docker的主要使用場景。Docker能將運(yùn)行環(huán)境和配置放在代碼中然后部署,同一個Docker的配置可以在不同的環(huán)境中使用,這樣就降低了硬件要求和應(yīng)用環(huán)境之間耦合度。(2)
、應(yīng)用場景2:代碼流水線(CodePipeline)管理代碼從開發(fā)者的機(jī)器到最終在生產(chǎn)環(huán)境上的部署,需要經(jīng)過很多的中間環(huán)境。而每一個中間環(huán)境都有微小的差別,Docker給應(yīng)用提供了一個從開發(fā)到上線均一致的環(huán)境,讓代碼的流水線變得簡單不少。(3)
、應(yīng)用場景3:提高開發(fā)效率Docker能提升開發(fā)者的開發(fā)效率。不同的開發(fā)環(huán)境中,Docker都可以把兩件事做好,一是可以在開發(fā)環(huán)境、生產(chǎn)環(huán)境之間直接遷移,二是可以讓我們快速搭建開發(fā)環(huán)境。開發(fā)環(huán)境的機(jī)器通常內(nèi)存比較小,之前使用虛擬的時(shí)候,我們經(jīng)常需要為開發(fā)環(huán)境的機(jī)器加內(nèi)存,而現(xiàn)在Docker可以輕易的讓幾十個服務(wù)在Docker中跑起來。(4)
、應(yīng)用場景4:隔離應(yīng)用有很多種原因會讓我們選擇在一個機(jī)器上運(yùn)行不同的應(yīng)用,Docker非常適合在較低的成本下實(shí)現(xiàn)多種應(yīng)用的隔離。(5)
、應(yīng)用場景5:整合服務(wù)器Docker隔離應(yīng)用的能力使得Docker可以整合多個服務(wù)器以降低成本。由于沒有操作系統(tǒng)的內(nèi)存占用,以及能在多個實(shí)例之間共享沒有使用的內(nèi)存,Docker可以比虛擬機(jī)提供更好的服務(wù)器整合解決方案。通常數(shù)據(jù)中心的服務(wù)器資源利用率只有30%,通過使用Docker并進(jìn)行有效的資源分配可以大幅提高服務(wù)器資源的利用率。(6)
、應(yīng)用場景6:調(diào)試能力Docker提供了很多的工具,包括可以為容器設(shè)置檢查點(diǎn)、設(shè)置版本和查看兩個容器之間的差別,這些特性可以幫助調(diào)試Bug。(7)
、應(yīng)用場景7:多租戶環(huán)境另外一個Docker的使用場景是在多租戶的應(yīng)用中,它可以避免關(guān)鍵應(yīng)用的重寫。我們一個特別的關(guān)于這個場景的例子是為物聯(lián)網(wǎng)的應(yīng)用開發(fā)一個快速、易用的多租戶環(huán)境。這種多租戶的基本代碼非常復(fù)雜,很難處理,重新規(guī)劃這樣一個應(yīng)用不但消耗時(shí)間,也浪費(fèi)金錢。使用Docker,可以為每一個租戶的應(yīng)用層的多個實(shí)例創(chuàng)建隔離的環(huán)境,這不僅簡單而且成本低廉,當(dāng)然這一切得益于Docker環(huán)境的啟動速度和其高效的diff命令。(8)
、應(yīng)用場景8:快速部署在虛擬機(jī)之前,購入部署新的硬件資源需要消耗幾天的時(shí)間。虛擬化技術(shù)(Virtualization)將這個時(shí)間縮短到了分鐘級別。而Docker通過為進(jìn)程僅僅創(chuàng)建一個容器而無需啟動一個操作系統(tǒng),再次將這個過程縮短到了秒級。這正是Google和Facebook都看重的特性。我們可以創(chuàng)建銷毀Docker容器而無需擔(dān)心重新啟動帶來的開銷。第二部分核心概念與安裝配置本部分首先介紹Docker的三大核心概念。鏡像(Image)容器(Container)倉庫(Repository)只有理解了這三個核心概念,才能順利地理解Docker容器的整個生命周期。隨后將介紹如何在常見的操作系統(tǒng)平臺上安裝Docker,包括RedhatLinux、Windows、Centos等主流操作系統(tǒng)平臺。2.1核心概念Docker的大部分操作都圍繞著它的三大核心概念——鏡像、容器和倉庫而展開。因此,準(zhǔn)確把握這三大核心概念對于掌握Docker技術(shù)尤為重要。1.Docker
鏡像Docker鏡像類似于虛擬機(jī)鏡像,可以將它理解為一個只讀的模板。例如,一個鏡像可以包含一個基本的操作系統(tǒng)環(huán)境,里面僅安裝了Apache應(yīng)用程序(或用戶需要的其他軟件)。可以把它稱為一個Apache鏡像。鏡像是創(chuàng)建Docker容器的基礎(chǔ)。通過版本管理和增量的文件系統(tǒng),Docker提供了一套十分簡單的機(jī)制來創(chuàng)建和更新現(xiàn)有的鏡像,用戶甚至可以從網(wǎng)上下載一個已經(jīng)做好的應(yīng)用鏡像,并直接使用。
2.Docker容器Docker容器類似于一個輕量級的沙箱,Docker利用容器來運(yùn)行和隔離應(yīng)用。容器是從鏡像創(chuàng)建的應(yīng)用運(yùn)行實(shí)例。可以將其啟動、開始、停止、刪除,而這些容器都是彼此相互隔離的、互不可見的??梢园讶萜骺醋鍪且粋€簡易版的Linux系統(tǒng)環(huán)境(包括root用戶權(quán)限、進(jìn)程空間、用戶空間和網(wǎng)絡(luò)空間等)以及運(yùn)行在其中的應(yīng)用程序打包而成的盒子。3.Docker
倉庫Docker倉庫類似于代碼倉庫,它是Docker集中存放鏡像文件的場所。有時(shí)候會看到有資料將Docker倉庫和倉庫注冊服務(wù)器(Registry)混為一談,并不嚴(yán)格區(qū)分。實(shí)際上,倉庫注冊服務(wù)器是存放倉庫的地方,其上往往存放著多個倉庫。每個倉庫集中存放某一類鏡像,往往包括多個鏡像文件,通過不同的標(biāo)簽(tag)來進(jìn)行區(qū)分。例如存放ubuntu操作系統(tǒng)鏡像的倉庫稱為ubuntu倉庫,其中可能包括14.04、12.04等不同版本的鏡像。根據(jù)所存儲的鏡像公開分享與否,Docker倉庫可以分為公開倉庫(Public)和私有倉庫(Private)兩種形式。目前,最大的公開倉庫是官方提供的DockerHub,其中存放了數(shù)量龐大的鏡像供用戶下載。國內(nèi)不少云服務(wù)提供商(如時(shí)速云、阿里云等)也提供了倉庫的本地源,可以提供穩(wěn)定的國內(nèi)訪問。當(dāng)然,用戶如果不希望公開分享自己的鏡像文件,Docker也支持用戶在本地網(wǎng)絡(luò)內(nèi)創(chuàng)建一個只能自己訪問的私有倉庫。當(dāng)用戶創(chuàng)建了自己的鏡像之后就可以使用push命令將它上傳到指定的公有或者私有倉庫。這樣用戶下次在另外一臺機(jī)器上使用該鏡像時(shí),只需要將其從倉庫上pull下來就可以了。可以看出,Docker利用倉庫管理鏡像的設(shè)計(jì)理念與Git非常相似,實(shí)際上在理念設(shè)計(jì)上借鑒了Git的很多優(yōu)秀思想。2.2安裝DockerDocker在主流的操作系統(tǒng)和云平臺上都可以使用,包括Linux操作系統(tǒng)(如ubuntu、Debian、CentOS、Redhat等)、MacOS操作系統(tǒng)和Windows操作系統(tǒng),以及AWS等云平臺。用戶可以訪問Docker官網(wǎng)的GetDocker(/products/overview)頁面,查看獲取Docker的方式,以及Docker支持的平臺類型,如圖2-2所示。在GetDocker頁面,我們可以看到目前Docker支持DockerPlatform、DockerHub、DockerCloud和DockerDataCenter。DockerPlatform:支持在桌面系統(tǒng)或云平臺安裝Docker;DockerHub:官方提供的云托管服務(wù),可以提供公有或私有的鏡像倉庫;DockerCloud:官方提供的容器云服務(wù),可以完成容器的部署與管理,可以完整地支持容器化項(xiàng)目,還有CI、CD功能;DockerDataCenter:提供企業(yè)級的簡單安全彈性的容器集群編排和管理。推薦盡量使用Linux操作系統(tǒng)來運(yùn)行Docker,因?yàn)槟壳癓inux操作系統(tǒng)對Docker的支持是原生的,使用體驗(yàn)最好。2.2.1
在RedHatEnterpriseLinux
上安裝Docker以下是支持Docker的RHEL版本:RedHatEnterpriseLinux7(64-bit)RedHatEnterpriseLinux6.5(64-bit)或更高版本如果你的RHEL運(yùn)行的是發(fā)行版內(nèi)核。那就僅支持通過extras渠道或者EPEL包來安裝Docker。如果我們打算在非發(fā)行版本的內(nèi)核上運(yùn)行Docker,內(nèi)核的改動可能會導(dǎo)致出錯1.RedHatEnterpriseLinux7
安裝DockerRedHatEnterpriseLinux7(64位)自帶Docker。我們可以在發(fā)行日志中找到概述和指南。Docker包含在extras鏡像源中,使用下面的方法可以安裝Docker:啟用extras鏡像源:$sudosubscription-managerrepos--enable=rhel-7-server-extras-rpms安裝Docker:$sudoyuminstalldocker2.RedHatEnterpriseLinux6.5
安裝Docker需要在64位的RHEL6.5或更高的版本上來安裝Docker,Docker工作需要特定的內(nèi)核補(bǔ)丁,因此RHEL的內(nèi)核版本應(yīng)為2.6.32-431或者更高。Docker已經(jīng)包含在RHEL的EPEL源中。該源是ExtraPackagesforEnterpriseLinux(EPEL)的一個額外包,社區(qū)中正在努力創(chuàng)建和維護(hù)相關(guān)鏡像。首先,你需要安裝EPEL鏡像源,在EPEL中已經(jīng)提供了docker-io包。下一步,我們將要在我們的主機(jī)中安裝Docker,也就是docker-io包:$sudoyum-yinstalldocker-io更新docker-io包:$sudoyum-yupdatedocker-io現(xiàn)在Docker已經(jīng)安裝好了,我們來啟動docker進(jìn)程:$sudoservicedockerstart設(shè)置開機(jī)啟動:$sudochkconfigdockeron現(xiàn)在,讓我們確認(rèn)Docker是否正常工作:$sudodockerrun-i-tfedora/bin/bash現(xiàn)在Docker已經(jīng)安裝好了,讓我們來啟動Docker進(jìn)程$sudoservicedockerstart如果我們想要開機(jī)啟動Docker,我們需要執(zhí)行如下的命令:$sudochkconfigdockeron現(xiàn)在測試一下是否正常工作:$sudodockerrun-i-tfedora/bin/bash注意:如果運(yùn)行的時(shí)候提示一個Cannotstartcontainer的錯誤,錯誤中提到了SELINUX或者權(quán)限不足。我們需要更新SELINUX規(guī)則??梢允褂胹udoyumupgradeselinux-policy然后重啟。2.2.2
在Windows
上安裝Docker1.安裝1)
、下載最新版本的DockerforWindowsInstaller2)
、運(yùn)行安裝文件,它將會安裝virtualbox、MSYS-gitboot2dockerLinux鏡像和Boot2Docker的管理工具。3)、從桌面上或者ProgramFiles中找到Boot2DockerforWindows,運(yùn)行Boot2DockerStart腳本。這個腳本會要求你輸入ssh密鑰密碼-可以簡單點(diǎn)(但是起碼看起來比較安全),然后只需要按[Enter]按鈕即可。4)、Boot2DockerStart將啟動一個Unixshell來配置和管理運(yùn)行在虛擬主機(jī)中的Docker,運(yùn)行dockerversion來查看它是否正常工作。2.運(yùn)行Docker注意:如果使用的是一個遠(yuǎn)程的Docker進(jìn)程,像Boot2docker,就不需要像前邊的文檔實(shí)例中那樣在輸入Docker命令之前輸入sudo。Boot2dockerstart將會自動啟動一個shell命令框并配置好環(huán)境變量,以便我們可以馬上使用Docker:讓我們嘗試運(yùn)行hello-world例子。運(yùn)行:$dockerrunhello-world這將會下載一個非常小的hello-world鏡像,并且打印出HellofromDocker的信息。3.使用Windows的命令行((cmd.exe)
來管理運(yùn)行Docker啟動一個Windows命令行(cmd.exe),運(yùn)行Boot2docker命令,這需要WindowsPATH環(huán)境變量中包含了ssh.exe。因此我們需要將安裝的Git的bin目錄(其中包含了ssh.exe)配置到我們的%PATH%環(huán)境變量中,運(yùn)行如下命令:setPATH=%PATH%;"c:\ProgramFiles(x86)\Git\bin"現(xiàn)在,我們可以運(yùn)行boot2dockerstart命令來啟動Boot2docker虛擬機(jī)。(如果有虛擬主機(jī)不存在的錯誤提示,需要運(yùn)行boot2dockerinit命令)。復(fù)制上邊的指令到cmd.exe來設(shè)置windows控制臺的環(huán)境變量,然后就可以運(yùn)行docker命令了,譬如dockerps:4.PowerShell中使用
Docker啟動PowerShell,需要將ssh.exe添加到PATH中。$Env:Path="${Env:Path};c:\ProgramFiles(x86)\Git\bin"之后,運(yùn)行boot2dockerstart命令行,它會打印出PowerShell命令,這些命令是用來設(shè)置環(huán)境變量來連接運(yùn)行在虛擬機(jī)中Docker的。運(yùn)行這些命令,然后就可以運(yùn)行docker命令了,譬如dockerps:提示:可以使用boot2dockershellinit|Invoke-Expression來設(shè)置環(huán)境變量來代替復(fù)制粘貼Powershell命令。2.2.3
在CentOS
環(huán)境下安裝DockerDocker支持以下的CentOS版本:CentOS7(64-bit)CentOS6.5(64-bit)或更高的版本前提條件Docker運(yùn)行在CentOS7上,要求系統(tǒng)為64位、系統(tǒng)內(nèi)核版本為3.10以上。Docker運(yùn)行在CentOS-6.5或更高的版本的CentOS上,要求系統(tǒng)為64位、系統(tǒng)內(nèi)核版本為2.6.32-431或者更高版本。使用yum安裝(CentOS7下)Docker要求CentOS系統(tǒng)的內(nèi)核版本高于3.10,查看本頁面的前提條件來驗(yàn)證你的CentOS版本是否支持Docker。通過
uname--r命令查看你當(dāng)前的內(nèi)核版本uname-r3.10.0-327.el7.x86_64安裝DockerDocker軟件包和依賴包已經(jīng)包含在默認(rèn)的CentOS-Extras軟件源里,安裝命令如下:yum-yinstalldocker安裝完成。啟動Docker后臺服務(wù)servicedockerstart測試運(yùn)行hello-worlddockerrunhello-world由于本地沒有hello-world這個鏡像,所以會下載一個hello-world的鏡像,并在容器內(nèi)運(yùn)行。使用腳本安裝Docker1、使用
sudo
或
root
權(quán)限登錄Centos。2、確保yum包更新到最新。$sudoyumupdate3、執(zhí)行Docker安裝腳本。$curl-fsSL/|sh執(zhí)行這個腳本會添加
docker.repo
源并安裝Docker。4、啟動Docker進(jìn)程。$sudoservicedockerstart5、驗(yàn)證
docker
是否安裝成功并在容器中執(zhí)行一個測試的鏡像。$sudodockerrunhello-world到此,docker在CentOS系統(tǒng)的安裝完成。第三部分使用Docker鏡像鏡像(image)是Docker三大核心概念中最為重要的,自Docker誕生之日起“鏡像”就是相關(guān)社區(qū)最為熱門的關(guān)鍵詞。Docker運(yùn)行容器前需要本地存在對應(yīng)的鏡像,如果鏡像沒保存在本地,Docker會嘗試先從默認(rèn)鏡像倉庫下載(默認(rèn)使用:DockerHub公共注冊服務(wù)器中的倉庫),用戶也可以通過配置,使用自定義的鏡像倉庫。本部分將介紹圍繞鏡像這一核心概念的具體操作,包括如何使用pull命令從DockerHub倉庫中下載鏡像到本地,如何查看本地已有的鏡像信息和管理鏡像標(biāo)簽,如何在遠(yuǎn)端倉庫使用search命令進(jìn)行搜索和過濾,如何刪除鏡像標(biāo)簽和鏡像文件,如何創(chuàng)建用戶定制的鏡像并且保存為外部文件。最后,還介紹如何往DockerHub倉庫中推送自己的鏡像。3.1獲取鏡像鏡像是運(yùn)行容器的前提,官方的DockerHub網(wǎng)站已經(jīng)提供了數(shù)十萬個鏡像供大家開放下載。可以使用dockerpull命令直接從DockerHub鏡像源來下載鏡像。該命令的格式為dockerpullNAME[:TAG]。其中,NAME是鏡像倉庫的名稱(用來區(qū)分鏡像),TAG是鏡像的標(biāo)簽(往往用來表示版本信息)。通常情況下,描述一個鏡像需要包括‘名稱+標(biāo)簽’信息。例如,獲取一個Ubuntu14.04系統(tǒng)的基礎(chǔ)鏡像可以使用如下的命令:對于Docker鏡像來說,如果不顯式指定TAG,則默認(rèn)會選擇latest標(biāo)簽,這會下載倉庫中最新版本的鏡像。下面的例子將從DockerHub的Ubuntu倉庫下載一個最新的Ubuntu操作系統(tǒng)的鏡像。該命令實(shí)際上下載的就是ubuntu:latest鏡像。下載過程中可以看出,鏡像文件一般由若干層(layer)組成,6c953ac5d795這樣的串是層的唯一id(實(shí)際上完整的id包括256比特,由64個十六進(jìn)制字符組成)。使用dockerpull命令下載時(shí)會獲取并輸出鏡像的各層信息。當(dāng)不同的鏡像包括相同的層時(shí),本地僅存儲層的一份內(nèi)容,減小了需要的存儲空問。我們可能會想到,在使用不同的鏡像倉庫服務(wù)器的情況下,可能會出現(xiàn)按鏡像重名的情況。嚴(yán)格地講,鏡像的倉庫名稱中還應(yīng)該添加倉庫地址(即registry,注冊服務(wù)器)作為前綴,只是我們默認(rèn)使用的是DockerHub服務(wù),該前綴可以忽略。例如,dockerpullUbuntu:14.04命令相當(dāng)于dockerpull/Ubuntu:14.04命令,即從默認(rèn)的注冊服務(wù)器DockerHubRegistry中的ubuntu倉庫來下載標(biāo)記為14.04的鏡像。如果從非官方的倉庫下載,則需要在倉庫名稱前指定完整的倉庫地址。例如從網(wǎng)易蜂巢的鏡像源來下載ubuntu:14.04鏡像,可以使用如下命令,此時(shí)下載的鏡像名稱為/public/Ubuntu:14.04:$dockerpull/public/Ubuntu:14.04pull子命令支持的選項(xiàng)主要包括:-a,--all-tags=true|false:是否獲取倉庫中的所有鏡像,默認(rèn)為否。下載鏡像到本地后,即可隨時(shí)使用該鏡像了,例如利用該鏡像創(chuàng)建一個容器,在其中運(yùn)行bash應(yīng)用,執(zhí)行pinglocalhost命令:3.2查看鏡像信息1.使用images命令列出鏡像使用dockerimages命令可以列出本地主機(jī)上已有鏡像的基本信息。例如,下面的命令列出了上一小節(jié)中下載的鏡像信息:在列出的信息中,可以看到以下幾個字段信息。來自于哪個倉庫,比如ubuntu倉庫用來保存ubuntu系列的基礎(chǔ)鏡像;鏡像的標(biāo)簽信息,比如14.04、latest用來標(biāo)注不同的版本信息。標(biāo)簽只是標(biāo)記,并不能標(biāo)識鏡像內(nèi)容;鏡像的ID(唯一標(biāo)識鏡像),如ubuntu:latest和ubuntu:16.04鏡像的ID都是2fa927b5cdd3,說明它們目前實(shí)際上指向同一個鏡像;創(chuàng)建時(shí)間,說明鏡像最后的更新時(shí)間;鏡像大小,優(yōu)秀的鏡像往往體積都較小。其中鏡像的ID信息十分重要,它唯一標(biāo)識了鏡像。在使用鏡像ID的時(shí)候,一般可以使用該ID的前若干個字符組成的可區(qū)分串來替代完整的ID。TAG信息用來標(biāo)記來自同一個倉庫的不同鏡像。例如ubunm倉庫中有多個鏡像,通過TAG信息來區(qū)分發(fā)行版本,包括10.04、12.04、12.10、13.04、14.04、16.04等標(biāo)簽:鏡像大小信息只是表示該鏡像的邏輯體積大小,實(shí)際上由于相同的鏡像層本地只會存儲一份,物理上占用的存儲空間會小于各鏡像的邏輯體積之和。images子命令主要支持如下選項(xiàng),用戶可以自行進(jìn)行嘗試。-a,--all=true|false:列出所有的鏡像文件(包括臨時(shí)文件),默認(rèn)為否;--digests=trueIfalse:列出鏡像的數(shù)字摘要值,默認(rèn)為否;-f,---filter=[]:過濾列出的鏡像,如dangling=true只顯示沒有被使用的鏡像;也可指定帶有特定標(biāo)注的鏡像等;--format="TEMPLATE":控制輸出格式,如.ID代表ID信息,Repository代表倉庫信息等;--no-trunc=truelfalse:對輸出結(jié)果中太長的部分是否進(jìn)行截?cái)?,如鏡像的ID信息,默認(rèn)為是;-q,--quiet=truelfalse:僅輸出ID信息,默認(rèn)為否。其中,對輸出結(jié)果進(jìn)行控制的選項(xiàng)如-f,--filter=[]、--no-trunc=true|false、-q,--quiet=trueIfalse等,大部分子命令都支持。更多子命令選項(xiàng)還可以通過mandocker-images來查看。2.使用tag
命令添加鏡像標(biāo)簽為了方便在后續(xù)工作中使用特定鏡像,還可以使用dockertag命令來為本地鏡像任意添加新的標(biāo)簽。例如添加一個新的myubuntu:latest鏡像標(biāo)簽:$dockertagubuntu:latestmyubuntu:latest再次使用dockerimages列出本地主機(jī)上鏡像信息,可以看到多了一個擁有myubuntu:latest標(biāo)簽的鏡像。之后,用戶就可以直接使用myubuntu:latest來表示這個鏡像了。我們可能注意到,這些myubuntu:latest鏡像的ID跟ubuntu:latest完全一致。它們實(shí)際上指向同一個鏡像文件,只是別名不同而已。dockertag命令添加的標(biāo)簽實(shí)際上起到了類似鏈接的作用。3.使用inspect命令查看詳細(xì)信息使用dockerinspect命令可以獲取該鏡像的詳細(xì)信息,包括制作者、適應(yīng)架構(gòu)、各層的數(shù)字摘要等,可輸入以下命令:$dockerinspectubuntu:14.04返回的是一個JSON格式的消息,如果我們只要其中一項(xiàng)內(nèi)容時(shí),可以使用參數(shù)-f來指定,例如,獲取鏡像的Architecture:$dockerinspect-f{{".Architecture"}}amd644.使用history命令查看鏡像歷史既然鏡像文件由多個層組成,那么怎么知道各個層的內(nèi)容具體是什么呢?這時(shí)候可以使用history子命令,該命令將列出各層的創(chuàng)建信息。例如,查看ubuntu:14.04鏡像的創(chuàng)建過程,可以使用如下命令:$dockerhistoryubuntu:14.043.3搜尋鏡像使用dockersearch命令可以搜索遠(yuǎn)端倉庫中共享的鏡像,默認(rèn)搜索官方倉庫中的鏡像。用法為dockersearchTERM,支持的參數(shù)主要包括:--automated=trueIfalse:僅顯示自動創(chuàng)建的鏡像,默認(rèn)為否;--no-trunc=true|false:輸出信息不截?cái)囡@示,默認(rèn)為否;-s,--stars=X:指定僅顯示評價(jià)為指定星級以上的鏡像,默認(rèn)為0,即輸出所有鏡像。例如,搜索所有自動創(chuàng)建的評價(jià)為3+的帶nginx關(guān)鍵字的鏡像,如下所示:$dockersearch----automated-s3nginx可以看到返回了很多包含關(guān)鍵字的鏡像,其中包括鏡像名字、描述、星級(表示該鏡像的受歡迎程度)、是否官方創(chuàng)建、是否自動創(chuàng)建等。默認(rèn)的輸出結(jié)果將按照星級評價(jià)進(jìn)行排序。3.4刪除鏡像1.使用標(biāo)簽刪除鏡像使用dockerrmi命令可以刪除鏡像,命令格式為dockerrmiIMAGE[IMAGE…],其中IMAGE可以為標(biāo)簽或ID。例如,要刪除掉myubuntu:latest鏡像,可以使用如下命令:$dockerrmimyubuntu:latestUntagged:myubuntu:latest我們可能會擔(dān)心,本地的ubuntu:latest鏡像是否會受此命令的影響。無需擔(dān)心,當(dāng)同一個鏡像擁有多個標(biāo)簽的時(shí)候,dockerrmi命令只是刪除該鏡像多個標(biāo)簽中的指定標(biāo)簽而已,并不影響鏡像文件。因此上述操作相當(dāng)于只是刪除了鏡像2fa927b5cdd3的一個標(biāo)簽而已。為保險(xiǎn)起見,再次查看本地的鏡像,發(fā)現(xiàn)ubuntu:latest鏡像(準(zhǔn)確地說是2fa927b5cdd3鏡像)仍然存在。但當(dāng)鏡像只剩下一個標(biāo)簽的時(shí)候就要小心了,此時(shí)再使用dockerrmi命令會徹底刪除鏡像。例如刪除標(biāo)簽為ubuntu:14.04的鏡像,由于該鏡像沒有額外的標(biāo)簽指向它,執(zhí)行dockerrmi命令,它會刪除這個鏡像文件的所有層:$dockerrmiubuntu:14.042.使用鏡像ID刪除鏡像當(dāng)使用dockerrmi命令,并且后面跟上鏡像的ID(也可以是能進(jìn)行區(qū)分的部分ID串前綴)時(shí),會先嘗試刪除所有指向該鏡像的標(biāo)簽,然后刪除該鏡像文件本身。注意,當(dāng)有該鏡像創(chuàng)建的容器存在時(shí),鏡像文件默認(rèn)是無法被刪除的,例如,先利用ubuntu:14.04鏡像創(chuàng)建一個簡單的容器來輸出一段話:$dockerrunUbuntu:14.04echo'hello!Iamhere!'hello!Iamhere!使用dockerps-a命令可以看到本機(jī)上存在的所有容器:$dockerps-a可以看到,后臺存在一個退出狀態(tài)的容器,是剛基于ubuntu:14.04鏡像創(chuàng)建的。試圖刪除該鏡像,Docker會提示有容器正在運(yùn)行,無法刪除:$dockerrmiUbuntu:14.04Errorresponsefromdaemon:conflict:unabletoremoverepositoryreference"Ubuntu:14.04"(mustforce)一containera21c0840213eisusingit'sreferencedimage8f1bd21bd25c如果要想強(qiáng)行刪除鏡像,可以使用-f參數(shù)。$dockerrmi-fubuntu:14.04注意,通常并不推薦使用-f參數(shù)來強(qiáng)制刪除一個存在容器依賴的鏡像。正確的做法是,先刪除依賴該鏡像的所有容器,再來刪除鏡像。首先刪除容器a21c0840213e:$dockerrma21c0840213e再使用ID來刪除鏡像,此時(shí)會正常打印出刪除的各層信息:$dockerrmi8f1bd21bd25c3.5創(chuàng)建鏡像創(chuàng)建鏡像的方法主要有三種:基于已有鏡像的容器創(chuàng)建、基于本地模板導(dǎo)入、基于Dockerfile創(chuàng)建。1.基于已有鏡像的容器創(chuàng)建該方法主要是使用dockercommit命令。命令格式為dockercommit[OPTIONS]CONTAINER[REPOSITORY[:TAG]],主要選項(xiàng)包括:-a,--author="":作者信息;-c,--change=[]:提交的時(shí)候執(zhí)行Dockerfile指令,包括CMD|ENTRYPOINT|ENVlEXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等;-m,--message="":提交消息;--p,--pause=true:提交時(shí)暫停容器運(yùn)行。下面將演示如何使用該命令創(chuàng)建一個新鏡像。首先,啟動一個鏡像,并在其中進(jìn)行修改操作,例如創(chuàng)建一個test文件,之后退出:$dockerrun-itUbuntu:14.04/bin/bashroot@a925cb40b3f0:/#touchtestroot@a925Cb40b3f0:/#exit記住容器的ID為a925cb40b3f0。此時(shí)該容器跟原ubuntu:14.04鏡像相比,已經(jīng)發(fā)生了改變,可以使用dockercommit命令來提交為一個新的鏡像。提交時(shí)可以使用ID或名稱來指定容器:$dockercommit-m"Addedanewfile"-a"DockerNewbee"a925cb40b3f0test:0.19e9C814023bcffc3e67e892a235afe61b02f66a947d2747f724bd317dda02f27順利的話,會返回新創(chuàng)建的鏡像的ID信息,例如9e9C814023bcffc3e67e892a235afe61b02f66a947d2747f724bd317dda02f27。此時(shí)查看本地鏡像列表,會發(fā)現(xiàn)新創(chuàng)建的鏡像已經(jīng)存在了。$dockerimagesREPOSITORY
TAG
IMAGEID
CREATED
VIRTUALSIZEtest
0.1
9e9c814023bc
4secondsago
188MB2.基于本地模板導(dǎo)入用戶也可以直接從一個操作系統(tǒng)模板文件導(dǎo)入一個鏡像,主要使用dockerimport命令。命令格式為dockerimport[OPTIONS]file|URL|-[REPOSITORY[:TAG]]。要直接導(dǎo)入一個鏡像,可以使用OpenVZ提供的模板來創(chuàng)建,或者用其他已導(dǎo)出的鏡像模板來創(chuàng)建。OPENVZ模板的下載地址為http:///Download/templates/precreated。例如,下載了ubuntu-14.04的模板壓縮包,之后使用以下命令導(dǎo)入:$catUbuntu-14.04-x86_64-minimal.tar.gz|dockerimport-ubuntu:14.04然后查看新導(dǎo)入的鏡像,會發(fā)現(xiàn)它已經(jīng)在本地存在了:$dockerimagesREPOSITORY
TAG
IMAGEID
CREATED
VIRTUALSIZEubuntu
14.04
05ac7cob9383
17secondsago
215.5MB3.6存出和載入鏡像用戶可以使用dockersave和dockerload命令來存出和載入鏡像。1.存出鏡像如果要導(dǎo)出鏡像到本地文件,可以使用dockersave命令。例如,導(dǎo)出本地的ubuntu:14.04鏡像為文件ubuntu_14.04.tar,如下所示:之后,用戶就可以通過復(fù)制ubuntu_14.04.tar文件將該鏡像分享給他人。2.載入鏡像可以使用dockerload將導(dǎo)出的tar文件再導(dǎo)入到本地鏡像庫,例如從文件ubuntu_14.04.tar導(dǎo)入鏡像到本地鏡像列表,如下所示:$dockerload--inputubuntu_14.04.tar或:$dockerload<ubuntu_14.04.tar這將導(dǎo)入鏡像及其相關(guān)的元數(shù)據(jù)信息(包括標(biāo)簽等)。導(dǎo)入成功后,可以使用dockerimages命令進(jìn)行查看。3.7上傳鏡像可以使用dockerpush命令上傳鏡像到倉庫,默認(rèn)上傳到DockerHub官方倉庫(需要登錄)。命令格式為:dockerpushNAME[:TAG]l[REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]用戶在DockerHub網(wǎng)站注冊后可以上傳自制的鏡像。例如用戶user上傳本地的test:latest鏡像.可以先添加新的標(biāo)簽user/test:latest,然后用dockerpush命令上傳鏡像:$dockertagtest:latestuser/test:latest$dockerpushuser/test:latest第一次上傳時(shí),會提示輸入登錄信息或進(jìn)行注冊。第四部分操作Docker容器容器是Docker的另一個核心概念。簡單來說,容器是鏡像的一個運(yùn)行實(shí)例。所不同的是,鏡像是靜態(tài)的只讀文件,而容器帶有運(yùn)行時(shí)需要的可寫文件層。如果認(rèn)為虛擬機(jī)是模擬運(yùn)行的一整套操作系統(tǒng)(包括內(nèi)核、應(yīng)用運(yùn)行態(tài)環(huán)境和其他系統(tǒng)環(huán)境)和跑在上面的應(yīng)用,那么Docker容器就是獨(dú)立運(yùn)行的一個(或一組)應(yīng)用,以及它們必需的運(yùn)行環(huán)境。容器是直接提供應(yīng)用服務(wù)的組件,也是Docker實(shí)現(xiàn)快速啟停和高效服務(wù)性能的基礎(chǔ)。在生產(chǎn)環(huán)境中,因?yàn)槿萜髯陨淼妮p量級特性,我們推薦使用容器時(shí)在一組容器前引入HA(HighAvailability,高可靠性)機(jī)制。例如使用HAProxy工具來代理容器訪問,這樣在容器出現(xiàn)故障時(shí),可以快速切換到功能正常的容器。此外,建議通過指定合適的容器重啟策略,來自動重啟退出的容器。本部分具體介紹圍繞容器的重要操作,包括創(chuàng)建一個容器、啟動容器、終止一個容器、進(jìn)入容器內(nèi)執(zhí)行操作、刪除容器和通過導(dǎo)入導(dǎo)出容器來實(shí)現(xiàn)容器遷移等。4.1創(chuàng)建容器從現(xiàn)在開始,可以忘掉虛擬機(jī)。對容器進(jìn)行操作就跟直接操作應(yīng)用一樣簡單、快速。Docker容器實(shí)在太輕量級了,用戶可以隨時(shí)創(chuàng)建或刪除容器。1.新建容器可以使用dockercreate命令新建一個容器,例如:使用dockercreate命令新建的容器處于停止?fàn)顟B(tài),可以使用dockerstart命令來啟動它。create命令和后續(xù)的run命令支持的選項(xiàng)都十分復(fù)雜,與容器運(yùn)行模式相關(guān)、與容器和環(huán)境配置相關(guān)、與容器資源限制和安全保護(hù)相關(guān)。2.啟動容器使用dockerstart命令來啟動一個已經(jīng)創(chuàng)建的容器,例如啟動剛創(chuàng)建的ubuntu容器:$dockerstartafaf此時(shí),通過dockerps命令可以查看一個運(yùn)行中的容器:$dockerps3.新建并啟動容器除了創(chuàng)建容器后通過start命令來啟動,也可以直接新建并啟動容器。所需要的命令主要為dockerrun,等價(jià)于先執(zhí)行dockercreate命令,再執(zhí)行dockerstart命令。例如,下面的命令輸出一個"HelloWorld",之后容器自動終止:$dockerrunubuntu/bin/echo'Helloworld'Helloworld這跟在本地直接執(zhí)行/bin/echo'Helloworld'幾乎感覺不出任何區(qū)別。當(dāng)利用dockerrun來創(chuàng)建并啟動容器時(shí),Docker在后臺運(yùn)行的標(biāo)準(zhǔn)操作包括:檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載;利用鏡像創(chuàng)建一個容器,并啟動該容器;分配一個文件系統(tǒng)給容器,并在只讀的鏡像層外面掛載一層可讀寫層;從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個虛擬接口到容器中;從網(wǎng)橋的地址池配置一個IP地址給容器;執(zhí)行用戶指定的應(yīng)用程序;執(zhí)行完畢后容器被自動終止。下面的命令啟動一個bash終端,允許用戶進(jìn)行交互:$dockerrun-itUbuntu:14.04/bin/bashroot@af8bae53bdd3:/#其中,-t選項(xiàng)讓Docker分配一個偽終端(pseudo-tty)并綁定到容器的標(biāo)準(zhǔn)輸入上,-i則讓容器的標(biāo)準(zhǔn)輸入保持打開。更多的命令選項(xiàng)可以通過mandocker-run命令來查看。在交互模式下,用戶可以通過所創(chuàng)建的終端來輸入命令,例如:在容器內(nèi)用ps命令查看進(jìn)程,可以看到,只運(yùn)行了bash應(yīng)用,并沒有運(yùn)行其他無關(guān)的進(jìn)程。用戶可以按Ctrl+d或輸入exit命令來退出容器:root@af8bae53bdd3:/#exitexit對于所創(chuàng)建的bash容器,當(dāng)使用exit命令退出之后,容器就自動處于退出(Exited)狀態(tài)了。這是因?yàn)閷ocker容器來說,當(dāng)運(yùn)行的應(yīng)用退出后,容器也就沒有繼續(xù)運(yùn)行的必要了。某些時(shí)候,執(zhí)行dockerrun會出錯,因?yàn)槊顭o法正常執(zhí)行容器會直接退出,此時(shí)可以查看退出的錯誤代碼。默認(rèn)情況下,常見錯誤代碼包括:125:Dockerdaemon執(zhí)行出錯,例如指定了不支持的Docker命令參數(shù);126:所指定命令無法執(zhí)行,例如權(quán)限出錯;127:容器內(nèi)命令無法找到。命令執(zhí)行后出錯,會默認(rèn)返回錯誤碼。4.守護(hù)態(tài)運(yùn)行更多的時(shí)候,需要讓Docker容器在后臺以守護(hù)態(tài)(Daemonized)形式運(yùn)行。此時(shí),可以通過添加-d參數(shù)來實(shí)現(xiàn)。例如下面的命令會在后臺運(yùn)行容器:容器啟動后會返回一個唯一的id,也可以通過dockerps命令來查看容器信息:此時(shí),要獲取容器的輸出信息,可以如下使用dockerlogs命令:$dockerlogsce5helioworldhelioworldhelloworld4.2終止容器可以使用dockerstop來終止一個運(yùn)行中的容器。該命令的格式為dockerstop[-t|--time[=10]][CONTAINER…]。首先向容器發(fā)送SIGTERM信號,等待一段超時(shí)時(shí)間(默認(rèn)為10秒)后,再發(fā)送SIGKILL信號來終止容器:$dockerstopce5ce5此外,當(dāng)Docker容器中指定的應(yīng)用終結(jié)時(shí),容器也會自動終止。例如對于上一節(jié)中只啟動了一個終端的容器,用戶通過exit命令或Ctrl+d來退出終端時(shí),所創(chuàng)建的容器立刻終止,處于stopped狀態(tài)。可以用dockerps-qa命令看到所有容器的ID。例如:$dockerps-qace554267d7a4d58050081fe3e812617b41f6處于終止?fàn)顟B(tài)的容器,可以通過dockerstart命令來重新啟動:$dockerstartce5此外,dockerrestart命令會將一個運(yùn)行態(tài)的容器先終止,然后再重新啟動它:$dockerrestartce54.3進(jìn)入容器Docker從1.3.0版本起提供了一個方便的exec命令,可以在容器內(nèi)直接執(zhí)行任意命令。該命令的基本格式為:dockerexec[-d|--detach][--detach-keys[=[]]][-i|--interactive][--privileged][-t|--tty][-u|--user[=USER]]CONTAINERCOMMAND[ARG…]。比較重要的參數(shù)有:-i,--interactive=true|false:打開標(biāo)準(zhǔn)輸入接受用戶輸入命令,默認(rèn)為false;--privileged=true|false:是否給執(zhí)行命令以高權(quán)限,默認(rèn)為false;-t,--tty=true|false:分配偽終端,默認(rèn)為false;-u,--user="":執(zhí)行命令的用戶名或ID。例如進(jìn)入到剛創(chuàng)建的容器中,并啟動一個bash:$dockerexec-it243c32535da7/bin/bashroot@243c32535da7:/#可以看到,一個bash終端打開了,在不影響容器內(nèi)其他應(yīng)用的前提下,用戶可以很容易與容器進(jìn)行交互。4.4刪除容器可以使用dockerrm命令來刪除處于終止或退出狀態(tài)的容器,命令格式為dockerrm[-f|--force][-l|--link][-v|--volumes]CONTAINER[CONTAINER…]。主要支持的選項(xiàng)包括:-f,--force=false:是否強(qiáng)行終止并刪除一個運(yùn)行中的容器;-l,--link=false:刪除容器的連接,但保留容器;-v,--volumes=false:刪除容器掛載的數(shù)據(jù)卷。例如,查看處于終止?fàn)顟B(tài)的容器,并刪除:$dockerrmce554267d7a4Ce554267d7a4默認(rèn)情況下,dockerrm命令只能刪除處于終止或退出狀態(tài)的容器,并不能刪除還處于運(yùn)行狀態(tài)的容器。如果要直接刪除一個運(yùn)行中的容器,可以添加-f參數(shù)。Docker會先發(fā)送SIGKILL信號給容器,終止其中的應(yīng)用,之后強(qiáng)行刪除,如下所示:$dockerrm-f2ae2ae4.5導(dǎo)入和導(dǎo)出容器某些時(shí)候,需要將容器從一個系統(tǒng)遷移到另外一個系統(tǒng),此時(shí)可以使用Docker的導(dǎo)入和導(dǎo)出功能。這也是Docker自身提供的一個重要特性。1.導(dǎo)出容器導(dǎo)出容器是指導(dǎo)出一個已經(jīng)創(chuàng)建的容器到一個文件,不管此時(shí)這個容器是否處于運(yùn)行狀態(tài),可以使用dockerexport命令,該命令的格式為dockerexport[-o]--output[=""]]CONTAINER。其中,可以通過-o選項(xiàng)來指定導(dǎo)出的tar文件名,也可以直接通過重定向來實(shí)現(xiàn)。示例:分別導(dǎo)出ce554267d7a4容器和e812617b41f6容器到文件test_for_run.tar文件和test_for_stop.tar文件:$dockerexport-otest_for_run.tarce5$lstest_for_run.tar$dockerexporte81>test_for_stop.tar$lstest_for_run.tartest_for_stop.tar之后,可將導(dǎo)出的tar文件傳輸?shù)狡渌麢C(jī)器上,然后再通過導(dǎo)人命令導(dǎo)人到系統(tǒng)中,從而實(shí)現(xiàn)容器的遷移。2.導(dǎo)入容器導(dǎo)出的文件又可以使用dockerimport命令導(dǎo)入變成鏡像,該命令格式為:dockerimport[-cI--change[=[]]][-m|--message[=MESSAGE]]file|URL|-[REPOSITORY[:TAG]]用戶可以通過-c,--change=[]選項(xiàng)在導(dǎo)入的同時(shí)執(zhí)行對容器進(jìn)行修改的Dockerfile指令。下面將導(dǎo)出的test_for_run.tar文件導(dǎo)入到系統(tǒng)中:$dockerimporttest_for_run.tar-test/Ubuntu:v1.0之前鏡像章節(jié)中我們曾介紹過使用dockerload命令來導(dǎo)入一個鏡像文件,與dockerimport命令十分類似。實(shí)際上,既可以使用dockerload命令來導(dǎo)入鏡像存儲文件到本地鏡像庫,也可以使用dockerimport命令來導(dǎo)人一個容器快照到本地鏡像庫。這兩者的區(qū)別在于容器快照文件將丟棄所有的歷史記錄和元數(shù)據(jù)信息(即僅保存容器當(dāng)時(shí)的快照狀態(tài)),而鏡像存儲文件將保存完整記錄,體積也更大。此外,從容器快照文件導(dǎo)入時(shí)可以重新指定標(biāo)簽等元數(shù)據(jù)信息。4.6實(shí)現(xiàn)容器的網(wǎng)絡(luò)端口映射下面我們來實(shí)現(xiàn)Docker容器的網(wǎng)絡(luò)端口映射。我們先創(chuàng)建了一個python應(yīng)用的容器。$dockerrun-d-Ptraining/webapppythonapp.pyfce072cc88cee71b1cdceb57c2821d054a4a59f67da6b416fceb5593f059fc6d另外,我們可以指定容器綁定的網(wǎng)絡(luò)地址,比如綁定。我們使用-P參數(shù)創(chuàng)建一個容器,使用dockerps來看到端口5000綁定主機(jī)端口32768。$dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESfce072cc88cetraining/webapp"pythonapp.py"4minutesagoUp4minutes:32768->5000/tcpgrave_hopper我們也可以使用-p標(biāo)識來指定容器端口綁定到主機(jī)端口。兩種方式的區(qū)別是:-P:是容器內(nèi)部端口隨機(jī)映射到主機(jī)的高端口。-p:是容器內(nèi)部端口綁定到指定的主機(jī)端口。另外,我們可以指定容器綁定的網(wǎng)絡(luò)地址,比如綁定。這樣我們就可以通過訪問:5001來訪問容器的5002端口。上面的例子中,默認(rèn)都是綁定tcp端口,如果要綁定UPD端口,可以在端口后面加上/udp。dockerport命令可以讓我們快捷地查看端口的綁定情況。$dockerportadoring_stonebraker5002:5001第五部分Docker容器實(shí)現(xiàn)Web服務(wù)與應(yīng)用5.1Docker容器實(shí)現(xiàn)Apache服務(wù)方法一、通過Dockerfile
構(gòu)建創(chuàng)建Dockerfile首先,創(chuàng)建目錄apache,用于存放后面的相關(guān)東西。$mkdir-p~/apache/www~/apache/logs~/apache/confwww目錄將映射為apache容器配置的應(yīng)用程序目錄,logs目錄將映射為apache容器的日志目錄,conf目錄里的配置文件將映射為apache容器的配置文件,進(jìn)入創(chuàng)建的apache目錄,創(chuàng)建Dockerfile,內(nèi)容如下:Dockerfile文件中COPYhttpd-foreground/usr/local/bin/是將當(dāng)前目錄下的httpd-foreground拷貝到鏡像里,作為httpd服務(wù)的啟動腳本,所以我們要在本地創(chuàng)建一個腳本文件httpd-foreground#!/bin/bashset-e#ApachegetsgrumpyaboutPIDfilespre-existingrm-f/usr/local/apache2/logs/httpd.pidexechttpd-DFOREGROUND賦予httpd-foreground文件可執(zhí)行權(quán)限$chmod+xhttpd-foreground通過Dockerfile創(chuàng)建一個鏡像,替換成你自己的名字$dockerbuild-thttpd.創(chuàng)建完成后,我們可以在本地的鏡像列表里查找到剛剛創(chuàng)建的鏡像$dockerimageshttpdREPOSITORYTAGIMAGEIDCREATEDSIZEhttpdlatestda1536b4ef1423secondsago....195.1MB方法二、dockerpullhttpd查找DockerHub上的httpd鏡像這里我們拉取官方的鏡像$dockerpullhttpd等待下載完成后,我們就可以在本地鏡像列表里查到REPOSITORY為httpd的鏡像。使用apache鏡像運(yùn)行容器命令說明:-p80:80:將容器的80端口映射到主機(jī)的80端口-v$PWD/www/:/usr/local/apache2/htdocs/:將主機(jī)中當(dāng)前目錄下的www目錄掛載到容器的
/usr/local/apache2/htdocs/-v$PWD/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf:將主機(jī)中當(dāng)前目錄下的
conf/httpd.conf文件掛載到容器的/usr/local/apache2/conf/httpd.conf-v$PWD/logs/:/usr/local/apache2/logs/:將主機(jī)中當(dāng)前目錄下的logs目錄掛載到容器的
/usr/local/apache2/logs/查看容器啟動情況$dockerpsCONTAINERIDIMAGECOMMAND...............PORTSNAMES79a97f2aac37httpd"httpd-foreground"...:80->80/tcpsharp_swanson通過瀏覽器訪問驗(yàn)證Docker中的Apache服務(wù)是否可訪問。5.2Docker容器實(shí)現(xiàn)Nginx服務(wù)方法一、通過Dockerfile
構(gòu)建創(chuàng)建Dockerfile首先,創(chuàng)建目錄nginx,用于存放后面的相關(guān)東西。$mkdirp~/nginx/www~/nginx/logs~/nginx/confwww目錄將映射為nginx容器配置的虛擬目錄,logs目錄將映射為nginx容器的日志目錄,conf目錄里的配置文件將映射為nginx容器的配置文件,進(jìn)入創(chuàng)建的nginx目錄,創(chuàng)建Dockerfile。通過Dockerfile創(chuàng)建一個鏡像,替換成你自己的名字。dockerbuild-tnginx.創(chuàng)建完成后,我們可以在本地的鏡像列表里查找到剛剛創(chuàng)建的鏡像方法二、dockerpullnginx查找DockerHub上的nginx鏡像。這里我們拉取官方的鏡像$dockerpullnginx等待下載完成后,我們就可以在本地鏡像列表里查到REPOSITORY為nginx的鏡像。使用nginx鏡像,運(yùn)行容器命令說明:-p80:80:將容器的80端口映射到主機(jī)的80端口--namemynginx:將容器命名為mynginx-v$PWD/www:/www:將主機(jī)中當(dāng)前目錄下的www掛載到容器的/www-v$PWD/conf/nginx.conf:/etc/nginx/nginx.conf:將主機(jī)中當(dāng)前目錄下的nginx.conf掛載到容器的/etc/nginx/nginx.conf-v$PWD/logs:/wwwlogs:將主機(jī)中當(dāng)前目錄下的logs掛載到容器的/wwwlogs查看容器啟動情況通過瀏覽器訪問5.3Docker容器實(shí)現(xiàn)Python應(yīng)用方法一、通過Dockerfile
構(gòu)建創(chuàng)建Dockerfile首先,創(chuàng)建目錄python,用于存放后面的相關(guān)東西。$mdkir-p~/python~/python/myappmyapp目錄將映射為python容器配置的應(yīng)用目錄,進(jìn)入創(chuàng)建的python目錄,創(chuàng)建Dockerfile。通過Dockerfile創(chuàng)建一個鏡像,替換成你自己的名字$dockerbuild-tpython:3.5.創(chuàng)建完成后,我們可以在本地的鏡像列表里查找到剛剛創(chuàng)建的鏡像方法二、dockerpullpython查找DockerHub上的python鏡像這里我們拉取官方的鏡像,標(biāo)簽為3.5$dockerpullpython:3.5等待下載完成后,我們就可以在本地鏡像列表里查到REPOSITORY為python,標(biāo)簽為3.5的鏡像。在~/python/myapp目錄下創(chuàng)建一個helloworld.py文件,代碼如下:#!/usr/bin/pythonprint("Hello,World!");運(yùn)行容器$dockerrun-v$PWD/myapp:/usr/src/myapp-w/usr/src/myapppython:3.5pythonhelloworld.py命令說明:-v$PWD/myapp:/usr/src/myapp:將主機(jī)中當(dāng)前目錄下的myapp掛載到容器的/usr/src/myapp-w/usr/src/myapp:指定容器的/usr/src/myapp目錄為工作目錄pythonhelloworld.py:使用容器的python命令來執(zhí)行工作目錄中的helloworld.py文件輸出結(jié)果:Hello,World!5.4Docker容器實(shí)現(xiàn)MySQL服務(wù)方法一、通過Dockerfile
構(gòu)建創(chuàng)建Dockerfile首先,創(chuàng)建目錄mysql,用于存放后面的相關(guān)東西。$mkdir-p~/mysql/data~/mysql/logs~/mysql/confdata目錄將映射為mysql容器配置的數(shù)據(jù)文件存放路徑,logs目錄將映射為mysql容器的日志目錄,conf目錄里的配置文件將映射為mysql容器的配置文件。進(jìn)入創(chuàng)建的mysql目錄,創(chuàng)建DockerfileFROMdebian:jessie通過Dockerfile創(chuàng)建一個鏡像,替換成你自己的名字。$dockerbuild-tmysql.創(chuàng)建完成后,我們可以在本地的鏡像列表里查找到剛剛創(chuàng)建的鏡像$dockerimages|grepmysqlmysql..............5.62c0964ec182a3weeksago329MB方法二、dockerpullmysql查找DockerHub上的mysql鏡像。這里我們拉取官方的鏡像,標(biāo)簽為5.6。$dockerpullmysql:5.6等待下載完成后,我們就可以在本地鏡像列表里查到REPOSITORY為mysql,標(biāo)簽為5.6的鏡像。運(yùn)行容器:命令說明:-p3306:3306:將容器的3306端口映射到主機(jī)的3306端口-v$PWD/conf/f:/etc/mysql/f:將主機(jī)當(dāng)前目錄下的conf/f掛載到容器的/etc/mysql/f-v$PWD/logs:/logs:將主機(jī)當(dāng)前目錄下的logs目錄掛載到容器的/logs-v$PWD/data:/mysql_data:將主機(jī)當(dāng)前目錄下的data目錄掛載到容器的/mysql_data-eMYSQL_ROOT_PASSWORD=123456:初始化root用戶的密碼查看容器啟動情況:第六部分Docker的運(yùn)行監(jiān)控在運(yùn)維體系中,監(jiān)控是非常重要的組成部分。通過監(jiān)控可以實(shí)時(shí)掌握系統(tǒng)運(yùn)行的狀態(tài),對故障的提前預(yù)警,歷史狀態(tài)的回放等,還可以通過監(jiān)控?cái)?shù)據(jù)為系統(tǒng)的容量規(guī)劃提供輔助決策,為系統(tǒng)性能優(yōu)化提供真實(shí)的用戶行為和體驗(yàn)。6.1容器的監(jiān)控方案傳統(tǒng)的監(jiān)控系統(tǒng)大多是針對物理機(jī)或虛擬機(jī)設(shè)計(jì)的,物理機(jī)和虛擬機(jī)的特點(diǎn)是靜態(tài)的,生命周期長,一個環(huán)境安裝配置好后可能幾年都不會去變動,那么對
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 五年級數(shù)學(xué)上《小數(shù)除法豎式計(jì)算題》練習(xí)
- 昆明醫(yī)科大學(xué)《民族器樂欣賞》2023-2024學(xué)年第一學(xué)期期末試卷
- 江蘇醫(yī)藥職業(yè)學(xué)院《乒乓球教學(xué)與實(shí)踐》2023-2024學(xué)年第一學(xué)期期末試卷
- 湖南三一工業(yè)職業(yè)技術(shù)學(xué)院《寵物醫(yī)學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 湖北中醫(yī)藥大學(xué)《營養(yǎng)護(hù)理學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 【物理】《力》(教學(xué)設(shè)計(jì))-2024-2025學(xué)年人教版(2024)初中物理八年級下冊
- 重慶工商職業(yè)學(xué)院《市場營銷模擬實(shí)驗(yàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 鄭州電力高等專科學(xué)?!俄?xiàng)目管理設(shè)計(jì)與創(chuàng)業(yè)精神》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江警官職業(yè)學(xué)院《化工熱力學(xué)實(shí)驗(yàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 中國民用航空飛行學(xué)院《舞臺實(shí)踐》2023-2024學(xué)年第一學(xué)期期末試卷
- 學(xué)校2025年寒假特色實(shí)踐作業(yè)綜合實(shí)踐暨跨學(xué)科作業(yè)設(shè)計(jì)活動方案
- 2024數(shù)據(jù)資源采購及運(yùn)營管理合同3篇
- 人教版小學(xué)數(shù)學(xué)一年級上冊20以內(nèi)加減混合口算練習(xí)題全套
- 兒童青少年行為和情緒障礙的護(hù)理
- 自升式塔式起重機(jī)安裝與拆卸施工方案
- 山東省技能大賽青島選拔賽-世賽選拔項(xiàng)目20樣題(數(shù)字建造)
- 人居環(huán)境整治合同書
- 2025屆上海市徐匯、松江、金山區(qū)高一物理第一學(xué)期期末學(xué)業(yè)水平測試試題含解析
- 幼兒園意識形態(tài)風(fēng)險(xiǎn)點(diǎn)排查報(bào)告
- 催收培訓(xùn)制度
- 學(xué)習(xí)布萊爾盲文用積木相關(guān)項(xiàng)目實(shí)施方案
評論
0/150
提交評論