摘要:實(shí)現(xiàn)前述目的的方式有兩種在一個(gè)文件中指定一個(gè)基礎(chǔ)鏡像及需要完成的修改或通過(guò)運(yùn)行一個(gè)鏡像,對(duì)其進(jìn)行修改并提交。容器對(duì)外公開(kāi)服務(wù)是必要的,因此允許公開(kāi)容器的特定端口。鏡像必須完全可移植,不允許例外。
Docker是一個(gè)相對(duì)較新且發(fā)展非??焖俚捻?xiàng)目,可用來(lái)創(chuàng)建非常輕量的“虛擬機(jī)”。注意,這里的引號(hào)非常重要,Docker創(chuàng)建的并非真正的虛擬機(jī),而更像是打了激素的chroot,嗯,是大量的激素。
Docker能做什么?Docker可以解決虛擬機(jī)能夠解決的問(wèn)題,同時(shí)也能夠解決虛擬機(jī)由于資源要求過(guò)高而無(wú)法解決的問(wèn)題。Docker能處理的事情包括:
隔離應(yīng)用依賴(lài) 創(chuàng)建應(yīng)用鏡像并進(jìn)行復(fù)制 創(chuàng)建容易分發(fā)的即啟即用的應(yīng)用 允許實(shí)例簡(jiǎn)單、快速地?cái)U(kuò)展 測(cè)試應(yīng)用并隨后銷(xiāo)毀它們
Docker背后的想法是創(chuàng)建軟件程序可移植的輕量容器,讓其可以在任何安裝了Docker的機(jī)器上運(yùn)行,而不用關(guān)心底層操作系統(tǒng)。
概念鏡像
Docker的鏡像類(lèi)似虛擬機(jī)的快照,但更輕量,非常非常輕量。
創(chuàng)建Docker鏡像有幾種方式,多數(shù)是在一個(gè)現(xiàn)有鏡像基礎(chǔ)上創(chuàng)建新鏡像,因?yàn)閹缀跄阈枰娜魏螙|西都有了公共鏡像,包括所有主流Linux發(fā)行版,你應(yīng)該不會(huì)找不到你需要的鏡像。
要?jiǎng)?chuàng)建一個(gè)鏡像,你可以拿一個(gè)鏡像,對(duì)它進(jìn)行修改來(lái)創(chuàng)建它的子鏡像。實(shí)現(xiàn)前述目的的方式有兩種:在一個(gè)文件中指定一個(gè)基礎(chǔ)鏡像及需要完成的修改;或通過(guò)“運(yùn)行”一個(gè)鏡像,對(duì)其進(jìn)行修改并提交。
鏡像擁有唯一ID,以及一個(gè)供人閱讀的名字和標(biāo)簽對(duì)。鏡像可以命名為類(lèi)似ubuntu:latest、ubuntu:precise、django:1.6、django:1.7等等。
其實(shí),鏡像是一個(gè)json,它指定了從該鏡像運(yùn)行的容器的特性,union裝載點(diǎn)保存在哪里,要公開(kāi)什么端口等等。
容器
你可以從鏡像中創(chuàng)建容器,這等同于從快照中創(chuàng)建虛擬機(jī),不過(guò)更輕量。應(yīng)用是由容器運(yùn)行的。
舉個(gè)例子,你可以下載一個(gè)Ubuntu的鏡像(有個(gè)叫docker registry的鏡像公共倉(cāng)庫(kù)),通過(guò)安裝Gunicorn和Django應(yīng)用及其依賴(lài)項(xiàng)來(lái)完成對(duì)它的修改,然后從該鏡像中創(chuàng)建一個(gè)容器,在它啟動(dòng)后運(yùn)行你的應(yīng)用。
容器與虛擬機(jī)一樣,是隔離的。它們也擁有一個(gè)唯一ID和唯一的供人閱讀的名字。容器對(duì)外公開(kāi)服務(wù)是必要的,因此Docker允許公開(kāi)容器的特定端口。
與虛擬機(jī)相比,容器有一個(gè)很大的差異,它們被設(shè)計(jì)用來(lái)運(yùn)行單進(jìn)程,無(wú)法很好地模擬一個(gè)完整的環(huán)境(如果那是你需要的,請(qǐng)看看LXC)。你可能會(huì)嘗試運(yùn)行runit或supervisord實(shí)例來(lái)啟動(dòng)多個(gè)進(jìn)程,但(以我的愚見(jiàn))這真的沒(méi)有必要。
單進(jìn)程與多進(jìn)程之爭(zhēng)非常精彩。你應(yīng)該知道的是,Docker設(shè)計(jì)者極力推崇“一個(gè)容器一個(gè)進(jìn)程的方式”,如果你要選擇在一個(gè)容器中運(yùn)行多個(gè)進(jìn)程,那唯一情況是:出于調(diào)試目的,運(yùn)行類(lèi)似ssh的東西來(lái)訪問(wèn)運(yùn)行中的容器,不過(guò)docker exec命令解決了這個(gè)問(wèn)題。
【容器和虛擬機(jī)的第二個(gè)巨大差異是:當(dāng)你停止一個(gè)虛擬機(jī)時(shí),可能除了一些臨時(shí)文件,沒(méi)有文件會(huì)被刪除;當(dāng)你停止一個(gè)Docker容器,對(duì)初始狀態(tài)(創(chuàng)建容器所用的鏡像的狀態(tài))做的所有變化都會(huì)丟失。】(譯者注:該論述不正確,已與作者確認(rèn),感謝lostsnow指正)
容器是設(shè)計(jì)來(lái)運(yùn)行一個(gè)應(yīng)用的,而非一臺(tái)機(jī)器。你可能會(huì)把容器當(dāng)虛擬機(jī)用,但如我們所見(jiàn),你將失去很多的靈活性,因?yàn)镈ocker提供了用于分離應(yīng)用與數(shù)據(jù)的工具,使得你可以快捷地更新運(yùn)行中的代碼/系統(tǒng),而不影響數(shù)據(jù)。
數(shù)據(jù)卷
數(shù)據(jù)卷讓你可以不受容器生命周期影響進(jìn)行數(shù)據(jù)持久化。它們表現(xiàn)為容器內(nèi)的空間,但實(shí)際保存在容器之外,從而允許你在不影響數(shù)據(jù)的情況下銷(xiāo)毀、重建、修改、丟棄容器。Docker允許你定義應(yīng)用部分和數(shù)據(jù)部分,并提供工具讓你可以將它們分開(kāi)。使用Docker時(shí)必須做出的最大思維變化之一就是:容器應(yīng)該是短暫和一次性的。
卷是針對(duì)容器的,你可以使用同一個(gè)鏡像創(chuàng)建多個(gè)容器并定義不同的卷。卷保存在運(yùn)行Docker的宿主文件系統(tǒng)上,你可以指定卷存放的目錄,或讓Docker保存在默認(rèn)位置。保存在其他類(lèi)型文件系統(tǒng)上的都不是一個(gè)卷,稍后再具體說(shuō)。
鏈接
鏈接是Docker的另一個(gè)重要部分。
容器啟動(dòng)時(shí),將被分配一個(gè)隨機(jī)的私有IP,其它容器可以使用這個(gè)IP地址與其進(jìn)行通訊。這點(diǎn)非常重要,原因有二:一是它提供了容器間相互通信的渠道,二是容器將共享一個(gè)本地網(wǎng)絡(luò)。我曾經(jīng)碰到一個(gè)問(wèn)題,在同一臺(tái)機(jī)器上為兩個(gè)客戶啟動(dòng)兩個(gè)elasticsearch容器,但保留集群名稱(chēng)為默認(rèn)設(shè)置,結(jié)果這兩臺(tái)elasticsearch服務(wù)器立馬變成了一個(gè)自主集群。注:限制容器間通訊是可行的,請(qǐng)閱讀Docker的高級(jí)網(wǎng)絡(luò)文檔做進(jìn)一步了解。
要開(kāi)啟容器間通訊,Docker允許你在創(chuàng)建一個(gè)新容器時(shí)引用其它現(xiàn)存容器,在你剛創(chuàng)建的容器里被引用的容器將獲得一個(gè)(你指定的)別名。我們就說(shuō),這兩個(gè)容器鏈接在了一起。
因此,如果DB容器已經(jīng)在運(yùn)行,我可以創(chuàng)建web服務(wù)器容器,并在創(chuàng)建時(shí)引用這個(gè)DB容器,給它一個(gè)別名,比如dbapp。在這個(gè)新建的web服務(wù)器容器里,我可以在任何時(shí)候使用主機(jī)名dbapp與DB容器進(jìn)行通訊。
Docker更進(jìn)一步,要求你聲明容器在被鏈接時(shí)要開(kāi)放哪些端口給其他容器,否則將沒(méi)有端口可用。
在創(chuàng)建鏡像時(shí)有一點(diǎn)要注意。Docker允許你在一個(gè)鏡像中指定卷和端口。從這個(gè)鏡像創(chuàng)建的容器繼承了這些設(shè)置。但是,Docker不允許你在鏡像上指定任何不可移植的內(nèi)容。
例如,你可以在鏡像里定義卷,只要它們被保存在Docker使用的默認(rèn)位置。這是因?yàn)槿绻阍谒拗魑募到y(tǒng)里指定了一個(gè)特定目錄來(lái)保存卷,其他使用這個(gè)鏡像的宿主無(wú)法保證這個(gè)目錄是存在的。
你可以定義要公開(kāi)的端口,但僅限那些在創(chuàng)建鏈接時(shí)公開(kāi)給其他容器的端口,你不能指定公開(kāi)給宿主的端口,因?yàn)槟銦o(wú)從知曉使用那個(gè)鏡像的宿主有哪些端口可用。
你也不能在鏡像上定義鏈接。使用鏈接要求通過(guò)名字引用其他容器,但你無(wú)法預(yù)知每個(gè)使用那個(gè)鏡像的宿主如何命名容器。
鏡像必須完全可移植,Docker不允許例外。
它需要完成的東西?**
兩個(gè)詞:cgroups和union文件系統(tǒng)。Docker使用cgroup來(lái)提供容器隔離,而union文件系統(tǒng)用于保存鏡像并使容器變得短暫。
第一步,安裝Docker。
Docker命令工具需要root權(quán)限才能工作。你可以將你的用戶放入docker組來(lái)避免每次都要使用sudo。
第二步,使用以下命令從公共registry下載一個(gè)鏡像:
docker pull ubuntu:latest
這個(gè)公共registry上有你需要的幾乎所有東西的鏡像:Ubuntu、Fedora、Postgresql、MySQL、Jenkins、Elasticsearch、Redis等等。Docker開(kāi)發(fā)人員在這個(gè)公共registry里維護(hù)著數(shù)個(gè)鏡像,不過(guò)你能從上面拉取大量來(lái)自用戶發(fā)布的自建自建鏡像。
也許你需要或想要一個(gè)私有的registry(用于開(kāi)發(fā)應(yīng)用之類(lèi)的容器),你可以先看看這個(gè)?,F(xiàn)在,有好幾個(gè)方式可以設(shè)置你自己的私有registry。你也可以買(mǎi)一個(gè)。
第三步,列出你的鏡像:
docker images
第四步,從該鏡像上創(chuàng)建一個(gè)容器。
docker run --rm -ti ubuntu /bin/bash
--rm:告訴Docker一旦運(yùn)行的進(jìn)程退出就刪除容器。這在進(jìn)行測(cè)試時(shí)非常有用,可免除雜亂[圖片]-ti:告訴Docker分配一個(gè)偽終端并進(jìn)入交互模式。這將進(jìn)入到容器內(nèi),對(duì)于快速原型開(kāi)發(fā)或嘗試很有用,但不要在生產(chǎn)容器中打開(kāi)這些標(biāo)志[圖片]ubuntu:這是容器立足的鏡像[圖片]/bin/bash:要運(yùn)行的命令,因?yàn)槲覀円越换ツJ絾?dòng),它將顯示一個(gè)容器的提示符
在運(yùn)行run命令時(shí),你可指定鏈接、卷、端口、窗口名稱(chēng)(如果你沒(méi)提供,Docker將分配一個(gè)默認(rèn)名稱(chēng))等等。
現(xiàn)在,我們?cè)诤笈_(tái)運(yùn)行一個(gè)容器:
docker run -d ubuntu ping 8.8.8.8
輸出的是分配的ID.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/27126.html
摘要:時(shí)間年月日星期六說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。必填用于執(zhí)行命令,當(dāng)執(zhí)行完畢后,將產(chǎn)生一個(gè)新的文件層??蛇x指定此鏡像啟動(dòng)時(shí)默認(rèn)執(zhí)行命令??蛇x用于指定需要暴露的網(wǎng)絡(luò)端口號(hào)??蛇x向鏡像中掛載一個(gè)卷組。 時(shí)間:2017年09月16日星期六說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com 教學(xué)源碼:無(wú) 學(xué)習(xí)源碼:無(wú) 第一章:課程簡(jiǎn)介 1-1 課程介紹 Docke...
摘要:編程書(shū)籍的整理和收集最近一直在學(xué)習(xí)深度學(xué)習(xí)和機(jī)器學(xué)習(xí)的東西,發(fā)現(xiàn)深入地去學(xué)習(xí)就需要不斷的去提高自己算法和高數(shù)的能力然后也找了很多的書(shū)和文章,隨著不斷的學(xué)習(xí),也整理了下自己的學(xué)習(xí)筆記準(zhǔn)備分享出來(lái)給大家后續(xù)的文章和總結(jié)會(huì)繼續(xù)分享,先分享一部分的 編程書(shū)籍的整理和收集 最近一直在學(xué)習(xí)deep learning深度學(xué)習(xí)和機(jī)器學(xué)習(xí)的東西,發(fā)現(xiàn)深入地去學(xué)習(xí)就需要不斷的去提高自己算法和高數(shù)的能力然后...
閱讀 3298·2023-04-26 02:09
閱讀 2601·2021-11-24 09:39
閱讀 3290·2021-11-16 11:52
閱讀 3625·2021-10-26 09:50
閱讀 2782·2021-10-08 10:05
閱讀 2465·2021-09-22 15:25
閱讀 3311·2019-08-30 13:14
閱讀 923·2019-08-29 17:06