Docker基础入门总结
一、什么是Docker
? 官方文檔描述:“Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.”
一句話概括容器:容器就是將軟件打包成標(biāo)準(zhǔn)化單元,以用于開發(fā)、交付和部署。
- Docker使用Google公司推出的Go語言進(jìn)行開發(fā)實(shí)現(xiàn),基于Linux內(nèi)核的cgroup,namespace,以及AUFS類的UnionFS等技術(shù),對進(jìn)程進(jìn)行封裝隔離,屬于操作系統(tǒng)層面的虛擬化技術(shù)。 由于隔離的進(jìn)程獨(dú)立于宿主和其它的隔離的進(jìn)程,因此也稱其為容器。Docke最初實(shí)現(xiàn)是基于LXC。
-
容器鏡像是輕量的、可執(zhí)行的獨(dú)立軟件包 ,包含軟件運(yùn)行所需的所有內(nèi)容:代碼、運(yùn)行時(shí)環(huán)境、系統(tǒng)工具、系統(tǒng)庫和設(shè)置。
-
容器化軟件適用于基于Linux和Windows的應(yīng)用,在任何環(huán)境中都能夠始終如一地運(yùn)行。
-
容器賦予了軟件獨(dú)立性,使其免受外在環(huán)境差異(例如,開發(fā)和預(yù)演環(huán)境的差異)的影響,從而有助于減少團(tuán)隊(duì)間在相同基礎(chǔ)設(shè)施上運(yùn)行不同軟件時(shí)的沖突。
再來看看容器較為通俗的解釋:
如果需要通俗的描述容器的話,我覺得容器就是一個(gè)存放東西的地方,就像書包可以裝各種文具、衣柜可以放各種衣服、鞋架可以放各種鞋子一樣。我們現(xiàn)在所說的容器存放的東西可能更偏向于應(yīng)用比如網(wǎng)站、程序甚至是系統(tǒng)環(huán)境。
二、為什么要用Docker
-
Docker的鏡像提供了除內(nèi)核外完整的運(yùn)行時(shí)環(huán)境,確保了應(yīng)用運(yùn)行環(huán)境一致性,從而不會(huì)再出現(xiàn)“這段代碼在我機(jī)器上沒問題啊”這類問題;——一致的運(yùn)行環(huán)境
-
可以做到秒級(jí)、甚至毫秒級(jí)的啟動(dòng)時(shí)間。大大的節(jié)約了開發(fā)、測試、部署的時(shí)間。——更快速的啟動(dòng)時(shí)間
-
避免公用的服務(wù)器,資源會(huì)容易受到其他用戶的影響。——隔離性
-
善于處理集中爆發(fā)的服務(wù)器使用壓力;——彈性伸縮,快速擴(kuò)展
-
可以很輕易的將在一個(gè)平臺(tái)上運(yùn)行的應(yīng)用,遷移到另一個(gè)平臺(tái)上,而不用擔(dān)心運(yùn)行環(huán)境的變化導(dǎo)致應(yīng)用無法正常運(yùn)行的情況。——遷移方便
-
使用Docker可以通過定制應(yīng)用鏡像來實(shí)現(xiàn)持續(xù)集成、持續(xù)交付、部署。——持續(xù)交付和部署
三、Docker容器與虛擬機(jī)的區(qū)別
? 簡單來說: 容器和虛擬機(jī)具有相似的資源隔離和分配優(yōu)勢,但功能有所不同,因?yàn)槿萜魈摂M化的是操作系統(tǒng),而不是硬件,因此容器更容易移植,效率也更高。
傳統(tǒng)虛擬機(jī)技術(shù)是虛擬出一套硬件后,在其上運(yùn)行一個(gè)完整操作系統(tǒng),在該系統(tǒng)上再運(yùn)行所需應(yīng)用進(jìn)程;而容器內(nèi)的應(yīng)用進(jìn)程直接運(yùn)行于宿主的內(nèi)核,容器內(nèi)沒有自己的內(nèi)核,而且也沒有進(jìn)行硬件虛擬。因此容器要比傳統(tǒng)虛擬機(jī)更為輕便。
兩者對比圖:
容器與虛擬機(jī) (VM) 總結(jié)
-
容器是一個(gè)應(yīng)用層抽象,用于將代碼和依賴資源打包在一起。 多個(gè)容器可以在同一臺(tái)機(jī)器上運(yùn)行,共享操作系統(tǒng)內(nèi)核,但各自作為獨(dú)立的進(jìn)程在用戶空間中運(yùn)行 。與虛擬機(jī)相比, 容器占用的空間較少(容器鏡像大小通常只有幾十兆),瞬間就能完成啟動(dòng) 。
-
虛擬機(jī)(VM)是一個(gè)物理硬件層抽象,用于將一臺(tái)服務(wù)器變成多臺(tái)服務(wù)器。 管理程序允許多個(gè)VM在一臺(tái)機(jī)器上運(yùn)行。每個(gè)VM都包含一整套操作系統(tǒng)、一個(gè)或多個(gè)應(yīng)用、必要的二進(jìn)制文件和庫資源,因此占用大量空間。而且VM啟動(dòng)也十分緩慢 。?
通過Docker官網(wǎng),我們知道了這么多Docker的優(yōu)勢,但是大家也沒有必要完全否定虛擬機(jī)技術(shù),因?yàn)閮烧哂胁煌氖褂脠鼍啊L摂M機(jī)更擅長于徹底隔離整個(gè)運(yùn)行環(huán)境。例如,云服務(wù)提供商通常采用虛擬機(jī)技術(shù)隔離不同的用戶。而Docker通常用于隔離不同的應(yīng)用 ,例如前端,后端以及數(shù)據(jù)庫。就我目前項(xiàng)目而言,對于兩者無所謂誰會(huì)取代誰,而是兩者可以和諧共存。
容器與虛擬機(jī)(VM)兩者共存:
三、Docker的基本概念
Docker 中包括三個(gè)基本的概念:
- Image(鏡像)
- Container(容器)
- Repository(倉庫)
?Image(鏡像)
鏡像是 Docker 運(yùn)行容器的前提,倉庫是存放鏡像的場所,可見鏡像更是 Docker 的核心。
那么鏡像到底是什么呢?Docker 鏡像可以看作是一個(gè)特殊的文件系統(tǒng),除了提供容器運(yùn)行時(shí)所需的程序、庫、資源、配置等文件外,還包含了一些為運(yùn)行時(shí)準(zhǔn)備的一些配置參數(shù)(如匿名卷、環(huán)境變量、用戶等)。
鏡像不包含任何動(dòng)態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會(huì)被改變。鏡像(Image)就是一堆只讀層(read-only layer)的統(tǒng)一視角,也許這個(gè)定義有些難以理解,下面的這張圖能夠幫助讀者理解鏡像的定義:?
從左邊我們看到了多個(gè)只讀層,它們重疊在一起。除了最下面一層,其他層都會(huì)有一個(gè)指針指向下一層。這些層是 Docker 內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),并且能夠在主機(jī)的文件系統(tǒng)上訪問到。
統(tǒng)一文件系統(tǒng)(Union File System)技術(shù)能夠?qū)⒉煌膶诱铣梢粋€(gè)文件系統(tǒng),為這些層提供了一個(gè)統(tǒng)一的視角。這樣就隱藏了多層的存在,在用戶的角度看來,只存在一個(gè)文件系統(tǒng)。我們可以在圖片的右邊看到這個(gè)視角的形式。
鏡像有多種生成方法:
-
從無到有開始創(chuàng)建鏡像
-
下載并使用別人創(chuàng)建好的現(xiàn)成的鏡像
-
在現(xiàn)有鏡像上創(chuàng)建新的鏡像
? 我們可以將鏡像的內(nèi)容和創(chuàng)建步驟描述在一個(gè)文本文件中,這個(gè)文件被稱作 Dockerfile ,通過執(zhí)行 docker build命令可以構(gòu)建出 Docker 鏡像。
Container(容器)
容器(Container)的定義和鏡像(Image)幾乎一模一樣,也是一堆層的統(tǒng)一視角,唯一區(qū)別在于容器的最上面那一層是可讀可寫的。?
由于容器的定義并沒有提及是否要運(yùn)行容器,所以實(shí)際上,容器 = 鏡像 + 讀寫層。
Repository(倉庫)
Docker 倉庫是集中存放鏡像文件的場所。鏡像構(gòu)建完成后,可以很容易的在當(dāng)前宿主上運(yùn)行。
但是, 如果需要在其他服務(wù)器上使用這個(gè)鏡像,我們就需要一個(gè)集中的存儲(chǔ)、分發(fā)鏡像的服務(wù),Docker Registry(倉庫注冊服務(wù)器)就是這樣的服務(wù)。
有時(shí)候會(huì)把倉庫(Repository)和倉庫注冊服務(wù)器(Registry)混為一談,并不嚴(yán)格區(qū)分。
Docker 倉庫的概念跟 Git 類似,注冊服務(wù)器可以理解為 GitHub 這樣的托管服務(wù)。
實(shí)際上,一個(gè) Docker Registry 中可以包含多個(gè)倉庫(Repository),每個(gè)倉庫可以包含多個(gè)標(biāo)簽(Tag),每個(gè)標(biāo)簽對應(yīng)著一個(gè)鏡像。
所以說,鏡像倉庫是 Docker 用來集中存放鏡像文件的地方,類似于我們之前常用的代碼倉庫。
通常,一個(gè)倉庫會(huì)包含同一個(gè)軟件不同版本的鏡像,而標(biāo)簽就常用于對應(yīng)該軟件的各個(gè)版本 。
我們可以通過<倉庫名>:<標(biāo)簽>的格式來指定具體是這個(gè)軟件哪個(gè)版本的鏡像。如果不給出標(biāo)簽,將以 Latest 作為默認(rèn)標(biāo)簽。
倉庫又可以分為兩種形式:
- Public(公有倉庫)
- Private(私有倉庫)
Docker Registry 公有倉庫是開放給用戶使用、允許用戶管理鏡像的 Registry 服務(wù)。
一般這類公開服務(wù)允許用戶免費(fèi)上傳、下載公開的鏡像,并可能提供收費(fèi)服務(wù)供用戶管理私有鏡像。
除了使用公開服務(wù)外,用戶還可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 鏡像,可以直接使用做為私有 Registry 服務(wù)。
當(dāng)用戶創(chuàng)建了自己的鏡像之后就可以使用 Push 命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺(tái)機(jī)器上使用這個(gè)鏡像時(shí)候,只需要從倉庫上 Pull 下來就可以了。
以上我們主要把 Docker 的一些常見概念如 Image,Container,Repository 做了詳細(xì)的闡述,也從傳統(tǒng)虛擬化方式的角度闡述了 Docker 的優(yōu)勢。
四、Docker的架構(gòu)
我們從下圖可以直觀地看到 Docker 的架構(gòu):?
Docker 使用 C/S 結(jié)構(gòu),即客戶端/服務(wù)器體系結(jié)構(gòu)。Docker 客戶端與 Docker 服務(wù)器進(jìn)行交互,Docker服務(wù)端負(fù)責(zé)構(gòu)建、運(yùn)行和分發(fā) Docker 鏡像。
Docker 客戶端和服務(wù)端可以運(yùn)行在一臺(tái)機(jī)器上,也可以通過 RESTful 、 Stock 或網(wǎng)絡(luò)接口與遠(yuǎn)程 Docker 服務(wù)端進(jìn)行通信。?
這張圖展示了 Docker 客戶端、服務(wù)端和 Docker 倉庫(即 Docker Hub 和 Docker Cloud ),默認(rèn)情況下 Docker 會(huì)在 Docker 中央倉庫尋找鏡像文件。
這種利用倉庫管理鏡像的設(shè)計(jì)理念類似于 Git ,當(dāng)然這個(gè)倉庫是可以通過修改配置來指定的,甚至我們可以創(chuàng)建我們自己的私有倉庫。
五、Docker常用命令
我們可以通過 docker -h 去查看命令的詳細(xì)的幫助文檔。在這里會(huì)講一些日常我們可能會(huì)用的比較多的一些命令。?
例如,我們需要拉取一個(gè) Docker 鏡像,我們可以用如下命令:
docker pull image_nameimage_name 為鏡像的名稱,而如果我們想從 Docker Hub 上去下載某個(gè)鏡像,我們可以使用以下命令:
docker pull centos:latestcento:lastest 是鏡像的名稱,Docker Daemon 發(fā)現(xiàn)本地沒有我們需要的鏡像,會(huì)自動(dòng)去 Docker Hub 上去下載鏡像,下載完成后,該鏡像被默認(rèn)保存到 /var/lib/docker 目錄下。
接著我們?nèi)绻氩榭粗鳈C(jī)下存在多少鏡像,我們可以用如下命令:
我們要想知道當(dāng)前有哪些容器在運(yùn)行,我們可以用如下命令:
docker ps -a-a 是查看當(dāng)前所有的容器,包括未運(yùn)行的。我們該如何去對一個(gè)容器進(jìn)行啟動(dòng),重啟和停止呢?
我們可以用如下命令:
這個(gè)時(shí)候我們?nèi)绻脒M(jìn)入到這個(gè)容器中,我們可以使用 attach 命令:
docker attach container_name/container_id那如果我們想運(yùn)行這個(gè)容器中的鏡像的話,并且調(diào)用鏡像里面的 bash ,我們可以使用如下命令:
docker run -t -i container_name/container_id /bin/bash那如果這個(gè)時(shí)候,我們想刪除指定鏡像的話,由于 Image 被某個(gè) Container 引用(拿來運(yùn)行),如果不將這個(gè)引用的 Container 銷毀(刪除),那 Image 肯定是不能被刪除。
我們首先得先去停止這個(gè)容器:
然后我們用如下命令去刪除這個(gè)容器:
docker rm container_name/container_id然后這個(gè)時(shí)候我們再去刪除這個(gè)鏡像:
docker rmi image_name常用的 Docker 相關(guān)的命令就講到這里為止了,我們在后續(xù)的文章中還會(huì)反復(fù)地提到這些命令。
?
參考文獻(xiàn):
https://docs.docker.com/engine/docker-overview/
https://mp.weixin.qq.com/s/9--UJYVJXVr92RCX36R6Vg
?
--- END ---
轉(zhuǎn)載于:https://www.cnblogs.com/LangXian/p/10635639.html
總結(jié)
以上是生活随笔為你收集整理的Docker基础入门总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 并发编程:PoolExec
- 下一篇: hdoj1856