一、docker的簡介:
民權ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
應用容器是個啥樣子呢,一個做好的應用容器長的就像一個裝好了一組特定應用的虛擬機一樣,比如我現在想用MySQL數據庫,我直接找個裝好了的MySQL的容器就可以了,想用的時候一運行容器,MySQL服務就起來了,就可以使用MySQL了
為什么不能直接安裝一個MySQL?或者是SqlServer呢也可以???
答:因為有的時候根據每個人的電腦的不同,在物理機安裝的時候會出現各種各樣的錯誤,突然你的機器中病毒了或者是掛了,你所有的服務都需要重新安裝。
注意:
但是有了docker,或者說是有了容器就不同了,你就相當于有了一個可以運行起來的虛擬機,只要你能運行容器,MySQL的配置就剩了 ,不用再去安裝MySQL,如果你想換一臺電腦,直接把容器端過來,就可以使用容器里面的服務了。
Docker是基于go語言開發(fā)的,代碼托管在GitHub上,并遵循Apache2.0開源協議
Dokcer可以封裝任何有效的應用程序,幾乎可以達在任何一臺服務器之間運行相同的服務,換句話說開發(fā)者,只需構建一次應用,就可以在多平臺上運行,運維人員只需要配置他們的服務,即可運行所有的應用。
同時有了容器還可以保證整個開發(fā)、測試和生產環(huán)境可以保持高度一致。
注意:
此外容器也和虛擬機一樣具有隔離性,各個容器之間的數據和內存空間相互隔離,可以保證一定的安全性。
Hyper-V、kvm和Xen等虛擬機管理程序都基于硬件防止機制。這就意味著他們對系統(tǒng)要求很高,然而Docker容器卻使用的是共享操作系統(tǒng)。也就是說它們使用系統(tǒng)資源方面比虛擬機管理程序要高效節(jié)省的多。
容器不是對硬件進行虛擬化處理,而是駐留在一個Linux實例上。
Docker可以解決虛擬機能夠解決的問題,同時也能夠解決虛擬機由于資源要求過高而無法解決的問題。
dock的特點:
1. 快速交付應用程序
開發(fā)者使用一個標準的p_w_picpaths來構建開發(fā)容器,開發(fā)完成之后,系統(tǒng)管理員就可以使用這個容器來部署代碼。
Docker可以快速創(chuàng)建容器,快速部署應用程序,并讓整個過程可見,使團隊中的其他成員更容易理解應用程序是如何創(chuàng)建和工作的。
Docker容器很輕!很快!容器的啟動時間是次秒級的,節(jié)約開發(fā)、測試、部署時間
2.更容易部署和擴展
docker容器可以在幾乎所有的環(huán)境中運行,物理機、虛擬機、公有云、私有云、個人電腦、服務器等等
docker容器兼容很多平臺,這樣就可以把一個應用程序從一個平臺遷移到另外一個
3.效率更高
docker容器不需要hypervisor,他是內核級的虛擬化。
4.快速部署也意味著更簡單的管理
通常只需要小小的改變就可以代替以往巨型和大量的更新工作
那么既然容器和虛擬機這么類似為啥不用虛擬機?
答:docker相對于VM還是有很多優(yōu)點的:
1.啟動速度快,容器通常在1秒內可以啟動,而VM要很久。
2.資源利用率高,一臺普通服務器可以跑上千個容器,而跑VM。。。。。。
3.性能開銷小,VM需要額外的CPU和內存來完成OS的功能,這一部分占據了額外的資源。
下面的圖片比較了Docker和傳統(tǒng)虛擬化方式的不同之處
可見容器是在操作系統(tǒng)層面上實現虛擬化,直接復用本地主機的操作系統(tǒng),而傳統(tǒng)方式則是在硬件層面實現。
二、docker的體系結構
docker使用c/s架構,docker daemon 作為server端接受client的請求,并處理(創(chuàng)建、運行、分發(fā)容器),他們可以運行在一個機器上,也通過socket或者RESTful API通信
Docker daemon 一般在宿主機后臺運行
Docker client以系統(tǒng)命令的形式存在,用戶用docker命令來跟docker daemon交互。
一、’Docker守護進程(Docker daemon)
如上圖分析所示,Docker守護進程運行在一臺主機上。用戶并不直接和守護進程進行交互,而是通過Docker客戶端間接和其他通信
二、ocker客戶端(Docker client)
Docker客戶端,實際上是Docker的二進制程序,是用戶與Docker交互方式。它接受用戶指令并且與背后的Docker守護進程通信。
三、.docker 內部:
要理解docker內部構建,需要理解以下三種操作:
Docker 鏡像-Docker p_w_picpaths
Docker 倉庫 -Docker registeries
Docker 容器-Docker container
1.Docker鏡像
Docker鏡像是Docker容器運行時的只讀模板,鏡像可以用來創(chuàng)建Docker容器。每一個鏡像由一系列的層(layes)組成。
Docker使用unionFS(聯合文件系統(tǒng))來將這些層聯合到單獨的鏡像中。
UnionFS允許獨立文件系統(tǒng)中的文件和文件夾(稱之為分支)被透明覆蓋,形成一個單獨連貫的文件系統(tǒng)。正因為有了這些層的存在,Docker是如此的輕量。當你改變了一個Docker鏡像,比如升級到某個程序到新的版本,一個新的層會被創(chuàng)建。因此,不用替換整個原先的鏡像或者重新建立(在使用虛擬機的時候你可能會這么做),只是一個新的層被添加或升級了。現在你不用程序發(fā)布整個鏡像,只需要升級,層使得分發(fā)Docker鏡像變得簡單和快速。
每個docker都有很多層次構成,docker使用 union file systems 將這些不同的層結合到一個p_w_picpath中去。
例如:CentOS鏡像中安裝nginx,就成了nginx鏡像,其實在此時docker鏡像的層級概念就體現出來了。底層一個CentOS操作系統(tǒng)鏡像,上面疊加一個nginx層,就完成了一個nginx鏡像的構建。層級概念就不難理解,此時我們一般稱CentOS操作系統(tǒng)鏡像為nginx鏡像層的父鏡像。
2.docker倉庫:
docker 倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。同樣的,docker倉庫也有公有和私有的概念。公有的docker倉庫名字是docker HUB。docker HUB提供了龐大的鏡像集合供使用。這些鏡像可以是自己創(chuàng)建,或者在別人的鏡像基礎上創(chuàng)建。
倉庫是集中存放鏡像文件的場所。有時候會把倉庫和倉庫注冊服務器(Registry)混為一談,并不嚴格區(qū)分。實際上,倉庫注冊服務器上往往存放著多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標簽(tag)。
倉庫分為公開倉庫(public)和私有倉庫(Private)兩種形式
最大的公開倉庫是Docker HUB,存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括Docker Pool等,
可以提供大陸用戶更穩(wěn)定快速地訪問。
當然,用戶也可以在本地網絡內創(chuàng)建一個私有倉庫。
當用戶創(chuàng)建了自己的鏡像之后就可以使用push命令將它上傳到公有或者私有倉庫,這樣下次在另一臺機器上使用這個鏡像時候,只需要從倉庫上pull下來就可以了。
注:Docker倉庫的概念更Git類似,注冊服務器可以理解為GitHUb這樣的托管服務。
3.Docker容器:
docker利用容器來運行應用,一個Docker容器包含了所有的某個應用運行所需要的環(huán)境。
每一個Docker容器都是從docker鏡像創(chuàng)建的。docker容器可以運行、開始、停止、移動和刪除。每一個docker容器都是獨立和安全的應用平臺。
容器是從鏡像創(chuàng)建的運行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。
可以把容器看做是一個簡易版的Linux運行環(huán)境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。
注:鏡像是只讀的,容器在啟動的時候創(chuàng)建一層可寫層作為最上層。
與虛擬機相比,容器有一個很大的差異,它們被設計用來運行單進程,無法很好的模擬一個完整的環(huán)境。docker設計者極力推崇一個容器一個進程的方式,如果你要選擇在一個容器中運行多個進程,那唯一情況是:出于調試目的。
容器中是設計來運行一個應用的,而非一臺機器。你可能會把容器當虛擬機用,但你將失去很多的靈活性,因為docker提供了用于分離應用與數據的工具,使得你可以快捷地更新運行中的代碼/系統(tǒng),而不影響數據。
Docker從0.9版本開始使用libcontainer替代lxc,libcontainer和Linux系統(tǒng)的交互圖如下:
四、Docker底層技術
Docker底層的2個核心技術分別是Namespace和Control groups
Namespace 用來隔離各個容器
(1.)pid Namespace
不同用戶的進程就是通過pid Namespace 隔離開的,且不同 Namespace 中可以有相同pid。
所有的LXC進程在Docker中的父進程為Docker進程,每個lxc進程具有不同的Namespace。
(2.)net Namespace
有了pid Namespace ,每個Namespace中的pid能夠相互隔離,但是網絡端口還是共享Host的端口。網絡隔離是通過net Namespace 實現的,每個net Namespace 有獨立的 network devices,IP address,IP routing tables,/proc/net 目錄。這樣每個container的網絡就能隔離開來。Docker 默認采用veth的方式將container中的虛擬網卡同host上的一個Docker bridge:docker0 連接在一起。
(3.) ipc Namespace
container 中進程交互還是采用Linux常見的進程間交互方法(interprocess communication - IPC),
括常見的信號量、消息隊列和共享內存。container的進程間交互實際上還是Host上具有相同pid
Namespace中的進程間交互。
(4.)mnt Namespace
類似chroot,將一個進程放到一個特定的目錄執(zhí)行。mnt Namespace 允許不同Namespace的進程看到的文
件結構不同,這樣每個 Namespace 中的進程所看到的文件目錄就被隔離開了。在container里頭,看到
的文件系統(tǒng),就是一個完整的Linux系統(tǒng),有/etc、/lib等,通過chroot實現。
(5.)uts Namespace
UTS(“UNIX Time-sharing System“)Namespace允許每個container擁有獨立的hostname和domain
name,使其在網絡上可以被視作一個獨立的節(jié)點而非Host上的一個進程。
(6.)user Namespace
每個container可以有不同的user 和 group id,也就是說可以在container內部用container內部的用戶執(zhí)
行程序而非Host上的用戶。
總結:
有了以上6種Namespace從進程、網絡、IPC、文件系統(tǒng)、UTS和用戶角度的隔離,一個container就可以對
外展現出一個獨立計算機的能力,并且不同ccontainer從OS層面實現了隔離。然而不同Namespace之間資
源還是相互競爭的,仍然需要類似ulimit來管理每個container所能使用的資源 --cgroup
Cgroups(Control groups)實現了對資源的配額和度量。