前言
-
《Docker Practice(Docker從入門到實踐)》學(xué)習筆記
這本書講的非常清晰透徹寄月,細節(jié)內(nèi)容也非常全面无牵。因此,關(guān)于這本書的學(xué)習筆記茎毁,我希望可以注重對其邏輯和思維的總結(jié),而不是僅僅羅列知識點七蜘。
書中的語言實在是非常簡練且清晰,單純總結(jié)成點會缺少很多思維上的邏輯連貫性橡卤,完全羅列又會顯得過于復(fù)雜。因此我將以下面這種方式來進行學(xué)習:- 對重要的知識點或概念進行引用
- 在知識點后加入自己的理解碧库,或是對其概括總結(jié)
- 一個知識塊結(jié)束,對整個塊的內(nèi)容總結(jié)
Docker定義
Docker 使用 Google 公司推出的 Go 語言 進行開發(fā)實現(xiàn)嵌灰,基于 Linux 內(nèi)核的 cgroup,namespace沽瞭,以及 AUFS 類的 Union FS 等技術(shù),對進程進行封裝隔離驹溃,屬于操作系統(tǒng)層面的虛擬化技術(shù)。由于隔離的進程獨立于宿主和其它的隔離的進程吠架,因此也稱其為容器。
Docker 在容器的基礎(chǔ)上傍药,進行了進一步的封裝魂仍,從文件系統(tǒng)、網(wǎng)絡(luò)互聯(lián)到進程隔離等等擦酌,極大的簡化了容器的創(chuàng)建和維護。使得 Docker 技術(shù)比虛擬機技術(shù)更為輕便赊舶、快捷。
Docker的三個基本概念
- 鏡像(
Image
) - 容器(
Container
) - 倉庫(
Repository
)
Docker的這三個基本概念笼平,確定了Docker的整個生命周期,我們不僅僅需要理解每一個單獨的概念寓调,更需要理解這三者之間的相互關(guān)系。
Docker鏡像(Image)
操作系統(tǒng)分為內(nèi)核和用戶空間夺英。對于Linux而言,內(nèi)核啟動后痛悯,掛載
root
文件系統(tǒng)為其提供用戶空間支持。而 Docker 鏡像(Image)载萌,就相當于是一個root
文件系統(tǒng)。比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu 16.04 最小系統(tǒng)的root
文件系統(tǒng)炒考。
Docker 鏡像是一個特殊的文件系統(tǒng)可缚,除了提供容器運行時所需的程序、庫帘靡、資源、配置等文件外描姚,還包含了一些為運行時準備的一些配置參數(shù)(如匿名卷、環(huán)境變量轩勘、用戶等)。鏡像不包含任何動態(tài)數(shù)據(jù)绊寻,其內(nèi)容在構(gòu)建之后也不會被改變悬秉。
- Docker鏡像是一個特殊的文件系統(tǒng)
- 功能: 為容器運行提供必要的(1)程序、庫和泌、資源、配置等文件及(2)配置參數(shù)(匿名卷武氓、環(huán)境變量、用戶等)
- 要求:
- 不包含動態(tài)數(shù)據(jù)
- 其內(nèi)容在構(gòu)建之后不會改變
小結(jié):
這段內(nèi)容給出了Docker鏡像的定義:Docker鏡像本質(zhì)是一個文件系統(tǒng)县恕,功能是提供了Docker容器運行所需環(huán)境的所有內(nèi)容剂桥,對于鏡像文件的要求是不能包含動態(tài)文件且內(nèi)容構(gòu)建后不會發(fā)生改變。
分層存儲
因為鏡像包含操作系統(tǒng)完整的 root 文件系統(tǒng)渊额,其體積往往是龐大的,因此在 Docker 設(shè)計時旬迹,就充分利用Union FS的技術(shù),將其設(shè)計為分層存儲的架構(gòu)奔垦。
鏡像構(gòu)建時屹耐,會一層層構(gòu)建椿猎,前一層是后一層的基礎(chǔ)。每一層構(gòu)建完就不會再發(fā)生改變犯眠,后一層上的任何改變只發(fā)生在自己這一層。
在構(gòu)建鏡像的時候筐咧,需要額外小心,每一層盡量只包含該層需要添加的東西量蕊,任何額外的東西應(yīng)該在該層構(gòu)建結(jié)束前清理掉。
分層存儲的特征還使得鏡像的復(fù)用残炮、定制變的更為容易。甚至可以用之前構(gòu)建好的鏡像作為基礎(chǔ)層势就,然后進一步添加新的層楷怒,以定制自己所需的內(nèi)容瓦灶,構(gòu)建新的鏡像鸠删。
這部分內(nèi)容實際是對Docker鏡像的要求做出解釋:包含動態(tài)數(shù)據(jù)必然會導(dǎo)致鏡像文件體積變大刃泡,內(nèi)容在構(gòu)建之后不發(fā)生變化則能保證對鏡像的復(fù)用碉怔,同時也是Docker本身定位的要求。
Docker容器(Container)
容器與鏡像的關(guān)系:
鏡像(Image)和容器(Container)的關(guān)系撮胧,就像是面向?qū)ο蟪绦蛟O(shè)計中的 類 和 實例 一樣,鏡像是靜態(tài)的定義芹啥,容器是鏡像運行時的實體。容器可以被創(chuàng)建墓怀、啟動、停止虱朵、刪除、暫停等碴犬。
容器的本質(zhì)及特征:
容器的實質(zhì)是進程,但與直接在宿主執(zhí)行的進程不同梆暮,容器進程運行于屬于自己的獨立的 命名空間。因此容器可以擁有自己的 root 文件系統(tǒng)蚯涮、自己的網(wǎng)絡(luò)配置治专、自己的進程空間,甚至自己的用戶 ID 空間张峰。
容器內(nèi)的進程是運行在一個隔離的環(huán)境里,使用起來喘批,就好像是在一個獨立于宿主的系統(tǒng)下操作一樣铣揉。這種特性使得容器封裝的應(yīng)用比直接在宿主運行更加安全餐曹。
- 容器本質(zhì)是進程
- 容器基于Docker鏡像,容器進程本身具有程序運行的所有環(huán)境台猴,因此獨立運行饱狂,與宿主系統(tǒng)同相互隔離。
容器存儲層
每一個容器運行時休讳,是以鏡像為基礎(chǔ)層,在其上創(chuàng)建一個當前容器的存儲層俊柔,我們可以稱這個為容器運行時讀寫而準備的存儲層為容器存儲層。
容器存儲層的生存周期和容器一樣雏婶,容器消亡時,容器存儲層也隨之消亡尚骄。因此,任何保存于容器存儲層的信息都會隨容器刪除而丟失倔丈。
按照 Docker 最佳實踐的要求,容器不應(yīng)該向其存儲層內(nèi)寫入任何數(shù)據(jù)需五,容器存儲層要保持無狀態(tài)化。所有的文件寫入操作宏邮,都應(yīng)該使用 數(shù)據(jù)卷(Volume)、或者綁定宿主目錄蜜氨,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網(wǎng)絡(luò)存儲)發(fā)生讀寫飒炎,其性能和穩(wěn)定性更高。
數(shù)據(jù)卷的生存周期獨立于容器郎汪,容器消亡闯狱,數(shù)據(jù)卷不會消亡抛计。因此,使用數(shù)據(jù)卷后吹截,容器刪除或者重新運行之后,數(shù)據(jù)卻不會丟失饭弓。
- 定義:以鏡像為基礎(chǔ)層,在其上創(chuàng)建一個當前容器的存儲層
- 生存周期:隨容器的消亡而消亡弟断,存儲的信息也隨容器刪除而丟失
- 要求:容器不應(yīng)該向其存儲層內(nèi)寫入任何數(shù)據(jù),容器存儲層要保持無狀態(tài)化
- 數(shù)據(jù)存儲:使用 數(shù)據(jù)卷(Volume)阀趴、或者綁定宿主目錄
Docker倉庫(Registry)
鏡像構(gòu)建完成后,可以很容易的在當前宿主機上運行刘急,但是,如果需要在其它服務(wù)器上使用這個鏡像叔汁,我們就需要一個集中的存儲、分發(fā)鏡像的服務(wù)据块,Docker Registry 就是這樣的服務(wù)。
一個 Docker Registry 中可以包含多個倉庫(
Repository
)另假;每個倉庫可以包含多個標簽(Tag
);每個標簽對應(yīng)一個鏡像边篮。通常,一個倉庫會包含同一個軟件不同版本的鏡像戈轿,而標簽就常用于對應(yīng)該軟件的各個版本。我們可以通過
<倉庫名>:<標簽>
的格式來指定具體是這個軟件哪個版本的鏡像凶杖。如果不給出標簽,將以latest
作為默認標簽智蝠。以 Ubuntu 鏡像 為例,
ubuntu
是倉庫的名字杈湾,其內(nèi)包含有不同的版本標簽,如漆撞,14.04
,16.04
。我們可以通過ubuntu:14.04
浮驳,或者ubuntu:16.04
來具體指定所需哪個版本的鏡像。如果忽略了標簽至会,比如ubuntu
,那將視為ubuntu:latest
奉件。倉庫名經(jīng)常以 兩段式路徑 形式出現(xiàn)宵蛀,比如
jwilder/nginx-proxy
术陶,前者往往意味著 Docker Registry 多用戶環(huán)境下的用戶名,后者則往往是對應(yīng)的軟件名梧宫。但這并非絕對,取決于所使用的具體 Docker Registry 的軟件或服務(wù)祟敛。
Docker倉庫的作用是為了讓Docker鏡像可以被廣泛使用,其模式類似于GitHub的功能馆铁。
Docker Registry 公開服務(wù)
Docker Registry 公開服務(wù)是開放給用戶使用、允許用戶管理鏡像的 Registry 服務(wù)埠巨。一般這類公開服務(wù)允許用戶免費上傳、下載公開的鏡像辣垒,并可能提供收費服務(wù)供用戶管理私有鏡像印蔬。
最常使用的 Registry 公開服務(wù)是官方的 Docker Hub,這也是默認的 Registry,并擁有大量的高質(zhì)量的官方鏡像例驹。除此以外,還有 CoreOS 的 Quay.io荤胁,CoreOS 相關(guān)的鏡像存儲在這里;Google 的 Google Container Registry仅政,Kubernetes 的鏡像使用的就是這個服務(wù)。
由于某些原因圆丹,在國內(nèi)訪問這些服務(wù)可能會比較慢。國內(nèi)的一些云服務(wù)商提供了針對 Docker Hub 的鏡像服務(wù)(
Registry Mirror
)辫封,這些鏡像服務(wù)被稱為加速器。常見的有 阿里云加速器秸讹、DaoCloud 加速器 等。使用加速器會直接從國內(nèi)的地址下載 Docker Hub 的鏡像璃诀,比直接從 Docker Hub 下載速度會提高很多。在 安裝 Dcoekr 一節(jié)中有詳細的配置方法劣欢。國內(nèi)也有一些云服務(wù)商提供類似于 Docker Hub 的公開服務(wù)裁良。比如 時速云鏡像倉庫、網(wǎng)易云鏡像服務(wù)价脾、DaoCloud 鏡像市場、阿里云鏡像庫 等侨把。
私有 Docker Registry
除了使用公開服務(wù)外,用戶還可以在本地搭建私有 Docker Registry秋柄。Docker 官方提供了 Docker Registry 鏡像,可以直接使用做為私有 Registry 服務(wù)骇笔。在 私有倉庫 一節(jié)中嚣崭,會有進一步的搭建私有 Registry 服務(wù)的講解懦傍。
開源的 Docker Registry 鏡像只提供了 Docker Registry API 的服務(wù)端實現(xiàn),足以支持
docker
命令谎脯,不影響使用持寄。但不包含圖形界面源梭,以及鏡像維護稍味、用戶管理、訪問控制等高級功能模庐。在官方的商業(yè)化版本 Docker Trusted Registry 中,提供了這些高級功能掂碱。除了官方的 Docker Registry 外,還有第三方軟件實現(xiàn)了 Docker Registry API疼燥,甚至提供了用戶界面以及一些高級功能。比如醉者,VMWare Harbor 和 Sonatype Nexus。
總結(jié)
Docker的三個概念撬即,鏡像(Image)、容器(Container)和倉庫(Repository)剥槐,定義了Docker的整個工作模式。鏡像是一個文件系統(tǒng)粒竖,為容器提供所需的運行環(huán)境;容器運行時基于鏡像提供的環(huán)境温圆,從而達到和宿主系統(tǒng)的環(huán)境隔離;為了能讓鏡像大量復(fù)用和廣泛使用岁歉,提出了倉庫的概念膝蜈,且Docker倉庫和GitHub很相似。
本文內(nèi)容是從整體上來介紹Docker饱搏,說明Docker中三個基本概念的功能和定位,從而在整體上來理解Docker推沸。之后會對各個模塊進行更細致的學(xué)習。