docker

1.docker? ? 鏡像? 容器

2.docker與虛擬機(jī)

3.docker簡(jiǎn)單操作


1.docker? ? 鏡像? 容器

1.1 docker

? ? ? Docker是一個(gè)基于輕量級(jí)虛擬化技術(shù)的容器,整個(gè)項(xiàng)目基于Go語(yǔ)言開(kāi)發(fā),并采用了Apache 2.0協(xié)議。Docker可以將我們的應(yīng)用程序打包封裝到一個(gè)容器中,該容器包含了應(yīng)用程序的代碼、運(yùn)行環(huán)境、依賴庫(kù)、配置文件等必需的資源,通過(guò)容器就可以實(shí)現(xiàn)方便快速并且與平臺(tái)解耦的自動(dòng)化部署方式,無(wú)論你部署時(shí)的環(huán)境如何,容器中的應(yīng)用程序都會(huì)運(yùn)行在同一種環(huán)境下。

舉例:

? ? ? ? 我寫(xiě)了一個(gè)5g基站通訊系統(tǒng),該系統(tǒng)的技術(shù)棧非常廣,需要依賴于各種開(kāi)源庫(kù)和中間件。如果按照純手動(dòng)的部署方式,我需要安裝各種開(kāi)源軟件,還需要寫(xiě)好每個(gè)開(kāi)源軟件的配置文件。如果只是部署一次,這點(diǎn)時(shí)間開(kāi)銷還是可以接受的,但如果我每隔幾天就需要換個(gè)服務(wù)器去部署這個(gè)程序,那么這些繁瑣的重復(fù)工作無(wú)疑是會(huì)令人發(fā)狂的。這時(shí)候,Docker的用處就派上場(chǎng)了,我只需要根據(jù)應(yīng)用程序的部署步驟編寫(xiě)一份Dockerfile文件(將安裝、配置等操作交由Docker自動(dòng)化處理),然后構(gòu)建并發(fā)布他的鏡像,這樣,不管在什么機(jī)器上,我都只需要拉取他需要的鏡像,然后就可以直接部署運(yùn)行了,這正是Docker的魅力所在。

1.2? 鏡像

鏡像是Docker中的一個(gè)重要概念:

? ? ? 它類似于虛擬機(jī)中使用到的鏡像,由于任何應(yīng)用程序都需要有它自己的運(yùn)行環(huán)境,Image就是用來(lái)提供所需運(yùn)行環(huán)境的一個(gè)模板。

? ? ? Docker你可以與其他人共享你的Image,但是提倡每個(gè)Image都遵循單一職責(zé)原則,也就是只做好一件事。

1.3? 容器

? ? ? Container是Docker提供的一個(gè)抽象層,它就像一個(gè)輕量級(jí)的沙盒,其中包含了一個(gè)極簡(jiǎn)的Linux系統(tǒng)環(huán)境與運(yùn)行在其中的應(yīng)用程序。

? ? Container是Image的運(yùn)行實(shí)例(Image本身是只讀的,Container啟動(dòng)時(shí),Docker會(huì)在Image的上層創(chuàng)建一個(gè)可寫(xiě)層,任何在Container中的修改都不會(huì)影響到Image,如果想要在Image保存Container中的修改,Docker采用了基于Container生成新的Image層的策略),Docker引擎利用Container來(lái)操作并隔離每個(gè)應(yīng)用(也就是說(shuō),每個(gè)容器中的應(yīng)用都是互相獨(dú)立的)。

? ? ? ? 我們可以從從Docker與Container的英文單詞原意中就可以體會(huì)出Docker的思想。

? ? ? ? Container可以釋義為集裝箱,集裝箱是一個(gè)可以便于機(jī)械設(shè)備裝卸的封裝貨物的通用標(biāo)準(zhǔn)規(guī)格,它的發(fā)明簡(jiǎn)化了物流運(yùn)輸?shù)臋C(jī)械化過(guò)程,使其建立起了一套標(biāo)準(zhǔn)化的物流運(yùn)輸體系。

? ? ? ? Docker的意思為碼頭工人,可以認(rèn)為,Docker就像是在碼頭上辛勤工作的工人,把應(yīng)用打包成一個(gè)個(gè)具有某種標(biāo)準(zhǔn)化規(guī)格的"集裝箱"(其實(shí)這里指出的集裝箱對(duì)應(yīng)的是Image,在Docker中Container更像是一個(gè)運(yùn)行中的沙盒),當(dāng)貨物運(yùn)輸?shù)侥康牡睾螅a頭工人們(Docker)就可以把集裝箱拆開(kāi)取出其中的貨物(基于Image來(lái)創(chuàng)建Container并運(yùn)行)。這種標(biāo)準(zhǔn)化與隔離性可以很方便地組合使用多個(gè)Image來(lái)構(gòu)建你的應(yīng)用環(huán)境。

2. docker 與虛擬機(jī)

? ? ? ? 我們知道Docker是基于輕量級(jí)虛擬化技術(shù)的,所以它與我們平常使用的虛擬機(jī)是不一樣的。

虛擬機(jī)技術(shù)可以分成以下兩類:

系統(tǒng)虛擬機(jī):通過(guò)軟件對(duì)計(jì)算機(jī)系統(tǒng)的模擬來(lái)提供一個(gè)真實(shí)計(jì)算機(jī)的替代品。它是物理硬件的抽象并提供了運(yùn)行完整操作系統(tǒng)所需的功能。虛擬機(jī)通過(guò)物理機(jī)器來(lái)管理和共享硬件,這樣實(shí)現(xiàn)了多個(gè)虛擬機(jī)環(huán)境彼此之間的隔離,一臺(tái)機(jī)器上可以運(yùn)行多個(gè)虛擬機(jī),每個(gè)虛擬機(jī)包括一個(gè)操作系統(tǒng)的完整副本。在系統(tǒng)虛擬機(jī)中,所運(yùn)行的所有軟件或操作都只會(huì)影響到該虛擬機(jī)的環(huán)境。我們經(jīng)常使用的VMWare就是系統(tǒng)虛擬機(jī)的實(shí)現(xiàn)。

程序虛擬機(jī):允許程序獨(dú)立運(yùn)行在平臺(tái)之外。比較典型的例子就是JVM,Java通過(guò)JVM這一抽象層使得Java程序與操作系統(tǒng)和硬件平臺(tái)解耦(因?yàn)槊總€(gè)Java程序都是運(yùn)行在JVM中的),因此實(shí)現(xiàn)了所謂的compile once, run everywhere。

? ? ? ? Docker所用到的技術(shù)與上述兩種都不相同,它使用了更輕量級(jí)的虛擬化技術(shù),多個(gè)Container共享了同一個(gè)操作系統(tǒng)內(nèi)核,并且就像運(yùn)行在本地上一樣。Container技術(shù)相對(duì)于虛擬機(jī)來(lái)說(shuō),只是一個(gè)應(yīng)用程序?qū)拥某橄?,它將代碼與依賴關(guān)系打包到一起,多個(gè)Container可以在同一臺(tái)機(jī)器上運(yùn)行(意味著一個(gè)虛擬機(jī)上也可以運(yùn)行多個(gè)Container),并與其它Container共享操作系統(tǒng)內(nèi)核,每一個(gè)Container都在用戶空間中作為一個(gè)獨(dú)立的進(jìn)程運(yùn)行,這些特性都證明了Container要比虛擬機(jī)更加靈活與輕量(一般都是結(jié)合虛擬機(jī)與Docker一起使用)。

圖片發(fā)自簡(jiǎn)書(shū)App

? ? ? ? Container技術(shù)其實(shí)并不是個(gè)新鮮事物,最早可以追溯到UNIX中的chroot(在1979年的V7 Unix中引入),它可以改變當(dāng)前正在運(yùn)行的進(jìn)程及其子目錄的根目錄,在這種修改過(guò)的環(huán)境下運(yùn)行的程序不能在指定的目錄樹(shù)之外訪問(wèn)文件,從而限制用戶的活動(dòng)范圍,為進(jìn)程提供了隔離空間。之后各種Unix版本涌現(xiàn)出很多Container技術(shù),在2006年,Google提出了"Process Containers"期望在Linux內(nèi)核中實(shí)現(xiàn)進(jìn)程資源隔離的相關(guān)特性,由于Container在Linux內(nèi)核中的定義過(guò)于寬泛混亂,后來(lái)該項(xiàng)目改名為CGroups(Control Groups),實(shí)現(xiàn)了對(duì)進(jìn)程的資源限制。2008年,LXC(Linux Containers)發(fā)布,它是一種在操作系統(tǒng)層級(jí)上的虛擬化方法,用于在Linux系統(tǒng)上通過(guò)共享一個(gè)內(nèi)核來(lái)運(yùn)行多個(gè)互相隔離的程序(Container)。LXC正是結(jié)合了Linux內(nèi)核中的CGroups和對(duì)分離的名稱空間的支持來(lái)為應(yīng)用程序提供了一個(gè)隔離的環(huán)境。而Docker也是基于LXC實(shí)現(xiàn)的(Docker的前身是dotClound公司中的內(nèi)部項(xiàng)目,它是一家提供PaaS服務(wù)的公司。),并作出了許多改進(jìn)。

3.docker的簡(jiǎn)單操作

1.docker ps 顯示當(dāng)前正在運(yùn)行的容器

2.docker ps -a 顯示所有狀態(tài)的容器

3.docker ps -n 3 顯示最后被創(chuàng)建的n個(gè)容器(注意:不限狀態(tài))

4.docker ps -q 只顯示容器ID

5.docker ps -s 顯示容器文件大小

6.docker –version 查看當(dāng)前docker版本

7.docker run hello-word 測(cè)試docker安裝是否有效

8.docker image ls 顯示當(dāng)前計(jì)算機(jī)的鏡像

9.docker container ls 顯示正在運(yùn)行的容器

10.docker container ls –all 顯示所有容器

11.docker build -t image_name . 創(chuàng)建一個(gè)docker鏡像,使用-t表示鏡像的名稱

12.sudo service docker start 啟動(dòng)docker服務(wù)

13.sudo service docker stop 關(guān)閉docker服務(wù)

14.sudo service docker restart 重啟docker服務(wù)

15.docker container stop ID 結(jié)束這個(gè)進(jìn)程

16.docker build -t image_name . 創(chuàng)建一個(gè)docker鏡像

17.docker container rm ID 刪除容器

18.docker image rm ID 刪除鏡像

19.docker login 登錄docker

20.docker tag image(鏡像名稱) username(docker注冊(cè)的用戶名)/respository(倉(cāng)庫(kù)名):tag(tag名)

21.docker push username/resposity:tag 上傳鏡像

22.docker run -p 4000:80 username/respository:tag 可以在任何計(jì)算機(jī)上運(yùn)行


? ? ? ? Docker提供了非常強(qiáng)大的自動(dòng)化部署方式與靈活性,對(duì)多個(gè)應(yīng)用程序之間做到了解耦,提供了開(kāi)發(fā)上的敏捷性、可控性以及可移植性。同時(shí),Docker也在不斷地幫助越來(lái)越多的企業(yè)實(shí)現(xiàn)了向云端遷移、向微服務(wù)轉(zhuǎn)型以及向DevOps模式的實(shí)踐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容