摘要:因?yàn)殓R像包含操作系統(tǒng)完整的文件系統(tǒng),其體積往往是龐大的,因此在設(shè)計(jì)時(shí),就充分利用的技術(shù),將其設(shè)計(jì)為分層存儲(chǔ)的架構(gòu)。分層存儲(chǔ)的特征還使得鏡像的復(fù)用定制變的更為容易。容器也采用分層存儲(chǔ)。
什么是 Docker?
Docker 使用 Google 公司推出的 Go 語(yǔ)言 進(jìn)行開(kāi)發(fā)實(shí)現(xiàn),基于 Linux 內(nèi)核的 cgroup,namespace,以及 AUFS 類的 Union FS 等技術(shù),對(duì)進(jìn)程進(jìn)行封裝隔離,屬于 操作系統(tǒng)層面的虛擬化技術(shù)。由于隔離的進(jìn)程獨(dú)立于宿主和其它的隔離的進(jìn)程,因此也稱其為容器。
Docker 在容器的基礎(chǔ)上,進(jìn)行了進(jìn)一步的封裝,從文件系統(tǒng)、網(wǎng)絡(luò)互聯(lián)到進(jìn)程隔離等等,極大的簡(jiǎn)化了容器的創(chuàng)建和維護(hù)。使得 Docker 技術(shù)比虛擬機(jī)技術(shù)更為輕便、快捷。
下面的圖片比較了 Docker 和傳統(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)沒(méi)有自己的內(nèi)核,而且也沒(méi)有進(jìn)行硬件虛擬。因此容器要比傳統(tǒng)虛擬機(jī)更為輕便。
Docker 的通俗解釋
Docker的思想來(lái)自于集裝箱,集裝箱解決了什么問(wèn)題?在一艘大船上,可以把貨物規(guī)整的擺放起來(lái)。并且各種各樣的貨物被集裝箱標(biāo)準(zhǔn)化了,集裝箱和集裝箱之間不會(huì)互相影響。那么我就不需要專門運(yùn)送水果的船和專門運(yùn)送化學(xué)品的船了。只要這些貨物在集裝箱里封裝的好好的,那我就可以用一艘大船把他們都運(yùn)走。docker就是類似的理念。
不同的應(yīng)用程序可能會(huì)有不同的應(yīng)用環(huán)境,比如.net開(kāi)發(fā)的網(wǎng)站和php開(kāi)發(fā)的網(wǎng)站依賴的軟件就不一樣,如果把他們依賴的軟件都安裝在一個(gè)服務(wù)器上就要調(diào)試很久,而且很麻煩,還會(huì)造成一些沖突。比如IIS和Apache訪問(wèn)端口沖突。這個(gè)時(shí)候你就要隔離.net開(kāi)發(fā)的網(wǎng)站和php開(kāi)發(fā)的網(wǎng)站。常規(guī)來(lái)講,我們可以在服務(wù)器上創(chuàng)建不同的虛擬機(jī)在不同的虛擬機(jī)上放置不同的應(yīng)用,但是虛擬機(jī)開(kāi)銷比較高。docker 可以實(shí)現(xiàn)虛擬機(jī)隔離應(yīng)用環(huán)境的功能,并且開(kāi)銷比虛擬機(jī)小。
開(kāi)發(fā)軟件的時(shí)候用的是 Ubuntu,但是運(yùn)維管理的都是 Centos,運(yùn)維在把你的軟件從開(kāi)發(fā)環(huán)境轉(zhuǎn)移到生產(chǎn)環(huán)境的時(shí)候就會(huì)遇到一些 Ubuntu 轉(zhuǎn) Centos 的問(wèn)題,比如:有個(gè)特殊版本的數(shù)據(jù)庫(kù),只有Ubuntu 支持,Centos 不支持,在轉(zhuǎn)移的過(guò)程當(dāng)中運(yùn)維就得想辦法解決這樣的問(wèn)題。這時(shí)候要是有docker 你就可以把開(kāi)發(fā)環(huán)境直接封裝轉(zhuǎn)移給運(yùn)維,運(yùn)維直接部署你給他的docker就可以了。而且部署速度快。
在服務(wù)器負(fù)載方面,如果你多帶帶開(kāi)一個(gè)虛擬機(jī),那么虛擬機(jī)會(huì)占用空閑內(nèi)存的,docker部署的話,這些內(nèi)存就會(huì)利用起來(lái)。
Docker 基本概念
鏡像 ( Image )
操作系統(tǒng)分為內(nèi)核和用戶空間。對(duì)于 Linux 而言,內(nèi)核啟動(dòng)后,會(huì)掛載 root 文件系統(tǒng)為其提供用戶空間支持。而 Docker 鏡像(Image),就相當(dāng)于是一個(gè) root 文件系統(tǒng)。比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu 16.04 最小系統(tǒng)的 root 文件系統(tǒng)。
Docker 鏡像是一個(gè) 特殊的文件系統(tǒng),除了提供容器運(yùn)行時(shí)所需的程序、庫(kù)、資源、配置等文件外,還包含了一些為運(yùn)行時(shí)準(zhǔn)備的一些配置參數(shù)(如匿名卷、環(huán)境變量、用戶等)。鏡像不包含任何動(dòng)態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會(huì)被改變。
因?yàn)殓R像包含操作系統(tǒng)完整的 root 文件系統(tǒng),其體積往往是龐大的,因此在 Docker 設(shè)計(jì)時(shí),就充分利用 Union FS 的技術(shù),將其設(shè)計(jì)為 分層存儲(chǔ) 的架構(gòu)。所以嚴(yán)格來(lái)說(shuō),鏡像并非是像一個(gè) ISO 那樣的打包文件,鏡像只是一個(gè)虛擬的概念,其實(shí)際體現(xiàn)并非由一個(gè)文件組成,而是由一組文件系統(tǒng)組成,或者說(shuō),由多層文件系統(tǒng)聯(lián)合組成。
鏡像構(gòu)建時(shí),會(huì)一層層構(gòu)建,前一層是后一層的基礎(chǔ)。每一層構(gòu)建完就不會(huì)再發(fā)生改變,后一層上的任何改變只發(fā)生在自己這一層。比如,刪除前一層文件的操作,實(shí)際不是真的刪除前一層的文件,而是僅在當(dāng)前層標(biāo)記為該文件已刪除。在最終容器運(yùn)行的時(shí)候,雖然不會(huì)看到這個(gè)文件,但是實(shí)際上該文件會(huì)一直跟隨鏡像。因此,在構(gòu)建鏡像的時(shí)候,需要額外小心,每一層盡量只包含該層需要添加的東西,任何額外的東西應(yīng)該在該層構(gòu)建結(jié)束前清理掉。
分層存儲(chǔ)的特征還使得鏡像的復(fù)用、定制變的更為容易。甚至可以用之前構(gòu)建好的鏡像作為基礎(chǔ)層,然后進(jìn)一步添加新的層,以定制自己所需的內(nèi)容,構(gòu)建新的鏡像。
容器(Container)
鏡像(Image)和容器(Container)的關(guān)系,就像是面向?qū)ο蟪绦蛟O(shè)計(jì)中的 類 和 實(shí)例 一樣,鏡像是靜態(tài)的定義,容器是鏡像運(yùn)行時(shí)的實(shí)體。容器可以被創(chuàng)建、啟動(dòng)、停止、刪除、暫停等。
容器的實(shí)質(zhì)是進(jìn)程,但與直接在宿主執(zhí)行的進(jìn)程不同,容器進(jìn)程運(yùn)行于屬于自己的獨(dú)立的命名空間。因此容器可以擁有自己的 root 文件系統(tǒng)、自己的網(wǎng)絡(luò)配置、自己的進(jìn)程空間,甚至自己的用戶 ID 空間。容器內(nèi)的進(jìn)程是運(yùn)行在一個(gè)隔離的環(huán)境里,使用起來(lái)就好像是在一個(gè)獨(dú)立于宿主的系統(tǒng)下操作一樣。這種特性使得容器封裝的應(yīng)用比直接在宿主運(yùn)行更加安全。
容器也采用分層存儲(chǔ)。每一個(gè)容器運(yùn)行時(shí),是以鏡像為基礎(chǔ)層,在其上創(chuàng)建一個(gè)當(dāng)前容器的存儲(chǔ)層,我們可以稱 這個(gè)為容器運(yùn)行時(shí)讀寫而準(zhǔn)備 的存儲(chǔ)層為容器存儲(chǔ)層。容器存儲(chǔ)層的生存周期和容器一樣,容器消亡時(shí),容器存儲(chǔ)層也隨之消亡。因此,任何保存于容器存儲(chǔ)層的信息都會(huì)隨容器刪除而丟失。
容器不應(yīng)該向其存儲(chǔ)層內(nèi)寫入任何數(shù)據(jù),容器存儲(chǔ)層要保持無(wú)狀態(tài)化。所有的文件寫入操作,都應(yīng)該使用數(shù)據(jù)卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會(huì)跳過(guò)容器存儲(chǔ)層,直接對(duì)宿主(或網(wǎng)絡(luò)存儲(chǔ))發(fā)生讀寫,其性能和穩(wěn)定性更高。
數(shù)據(jù)卷的生存周期獨(dú)立于容器,容器消亡,數(shù)據(jù)卷不會(huì)消亡。因此,使用數(shù)據(jù)卷后,容器刪除或者重新運(yùn)行之后,數(shù)據(jù)卻不會(huì)丟失。
倉(cāng)庫(kù)(Repository)
鏡像構(gòu)建完成后,可以很容易的在當(dāng)前宿主機(jī)上運(yùn)行,但是,如果需要在其它服務(wù)器上使用這個(gè)鏡像,我們就需要一個(gè) 集中存儲(chǔ)、分發(fā)鏡像 的服務(wù),Docker Registry 就是這樣的服務(wù)。一個(gè) Docker Registry 中可以包含多個(gè)倉(cāng)庫(kù)(Repository);每個(gè)倉(cāng)庫(kù)可以包含多個(gè)標(biāo)簽(Tag);每個(gè)標(biāo)簽對(duì)應(yīng)一個(gè)鏡像。
通常,一個(gè)倉(cāng)庫(kù)會(huì)包含同一個(gè)軟件不同版本的鏡像,而標(biāo)簽就常用于對(duì)應(yīng)該軟件的各個(gè)版本。我們可以通過(guò) <倉(cāng)庫(kù)名>:<標(biāo)簽> 的格式來(lái)指定具體是這個(gè)軟件哪個(gè)版本的鏡像。如果不給出標(biāo)簽,將以 latest 作為默認(rèn)標(biāo)簽。以 Ubuntu 鏡像 為例,ubuntu 是倉(cāng)庫(kù)的名字,其內(nèi)包含有不同的版本標(biāo)簽,如,14.04, 16.04。我們可以通過(guò) ubuntu:14.04,或者 ubuntu:16.04 來(lái)具體指定所需哪個(gè)版本的鏡像。如果忽略了標(biāo)簽,比如 ubuntu,那將視為 ubuntu:latest。
倉(cāng)庫(kù)名經(jīng)常以 兩段式路徑 形式出現(xiàn),比如 jwilder/nginx-proxy,前者往往意味著 Docker Registry 多用戶環(huán)境下的用戶名,后者則往往是對(duì)應(yīng)的軟件名。但這并非絕對(duì),取決于所使用的具體 Docker Registry 的軟件或服務(wù)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/27579.html
摘要:如果使用操作系統(tǒng)自帶包安裝,目前安裝的版本是比較舊的。之前版本如果是較低版本的系統(tǒng),需要先更新內(nèi)核。然后重復(fù)上面的步驟即可。 Quick Start Installation Ubuntu 通過(guò)系統(tǒng)自帶包安裝 Ubuntu 14.04 版本系統(tǒng)中已經(jīng)自帶了 Docker 包,可以直接安裝。 $ sudo apt-get update $ sudo apt-get install -y ...
摘要:使用官方安裝腳本使用官方安裝腳本自動(dòng)安裝,僅適用于公網(wǎng)環(huán)境。安裝指定版本的注意在某些版本之后,安裝出現(xiàn)了其他依賴包,如果安裝失敗的話請(qǐng)關(guān)注錯(cuò)誤信息。例如之后,需要先安裝。使用官方安裝腳本使用官方安裝腳本自動(dòng)安裝,僅適用于公網(wǎng)環(huán)境。# 安裝之前需卸載舊版本 sudo yum remove docker CE docker-client ...
摘要:將一個(gè)輕量級(jí)的容器虛擬化平臺(tái)和一組標(biāo)準(zhǔn)工作流程工具進(jìn)行集成,來(lái)幫助你方便地管理和部署應(yīng)用。主要包括哪些組件主要包括兩個(gè)組件開(kāi)源的容器虛擬化平臺(tái)用于分享和管理容器的軟件即服務(wù)平臺(tái)。 【編者的話】本文來(lái)自 Docker 的官方文檔,詳細(xì)介紹了 Docker 的體系結(jié)構(gòu)、重要概念、內(nèi)部工作機(jī)理等內(nèi)容,推薦不了解 Docker 內(nèi)部原理的同學(xué)閱讀。 什么是 Docker? Docker 是...
摘要:下面給出了其中幾個(gè)子命令。將指定名稱的容器拉取到系統(tǒng)中。列出正在運(yùn)行的容器。起初只是之上的一個(gè)軟件層但現(xiàn)在已經(jīng)演化成為一個(gè)獨(dú)立的系統(tǒng)。服務(wù)器的主要配置文件位于和參考從構(gòu)建鏡像命令的用法 檢查安裝情況 centos7下 // 刪除舊版本和相關(guān)依賴 yum remove docker docker-client d...
摘要:分鐘快速入門教程一歡迎來(lái)到世界與虛擬化在沒(méi)有的時(shí)代,我們會(huì)使用硬件虛擬化虛擬機(jī)以提供隔離。倉(cāng)庫(kù)分為公開(kāi)倉(cāng)庫(kù)和私有倉(cāng)庫(kù),最大的公開(kāi)倉(cāng)庫(kù)是官方倉(cāng)庫(kù),國(guó)內(nèi)的公開(kāi)倉(cāng)庫(kù)也有很多選擇,例如阿里云等。 原文地址:梁桂釗的博客博客地址:http://blog.720ui.com 歡迎關(guān)注公眾號(hào):「服務(wù)端思維」。一群同頻者,一起成長(zhǎng),一起精進(jìn),打破認(rèn)知的局限性。 30 分鐘快速入門 Docker 教程...
摘要:分鐘快速入門教程一歡迎來(lái)到世界與虛擬化在沒(méi)有的時(shí)代,我們會(huì)使用硬件虛擬化虛擬機(jī)以提供隔離。倉(cāng)庫(kù)分為公開(kāi)倉(cāng)庫(kù)和私有倉(cāng)庫(kù),最大的公開(kāi)倉(cāng)庫(kù)是官方倉(cāng)庫(kù),國(guó)內(nèi)的公開(kāi)倉(cāng)庫(kù)也有很多選擇,例如阿里云等。 原文地址:梁桂釗的博客博客地址:http://blog.720ui.com 歡迎關(guān)注公眾號(hào):「服務(wù)端思維」。一群同頻者,一起成長(zhǎng),一起精進(jìn),打破認(rèn)知的局限性。 30 分鐘快速入門 Docker 教程...
閱讀 2461·2021-11-22 15:35
閱讀 3756·2021-11-04 16:14
閱讀 2685·2021-10-20 13:47
閱讀 2487·2021-10-13 09:49
閱讀 2064·2019-08-30 14:09
閱讀 2359·2019-08-26 13:49
閱讀 879·2019-08-26 10:45
閱讀 2762·2019-08-23 17:54