Docker

一、Docker 簡介

Docker 是什麼?

Docker 的英文本意是“搬運工”,在程序員的世界裏,Docker 搬運的是集裝箱Container),集裝箱裏裝的是任意類型的 App,開發者通過 Docker 可以將 App 變成一種標準化的、可移植的、自管理的組件,可以在任何主流系統中開發、調試和運行。

 

說白了,docker 是一種用了新穎方式實現的輕量級虛擬機,類似於 VM,但是在原理和應用上和

VM 的差別還是很大的.並且 docker 的專業叫法是應用容器(Application Container)

 

爲啥要用容器?

應用容器是個啥樣子呢,一個做好的應用容器長得就像一個裝好了一組特定應用的虛擬機一,比如我現在想用 mysql,那我就找個裝好了 mysql 的容器就可以了,然後運行起來,我就能使 mysql 了。

 

爲啥不能直接安裝一個 mysql?安裝一個 SQL Server 也可以啊,可是有的時候根據每個人電腦的不同,在安裝的時候可能會報出各種各樣的錯誤,萬一你的機器中毒了,你的電腦掛了,你所有的服務都需要重新安裝.但是有了docker,或者說有了容器就不同了,你就相當於有了一個可以運行起來的虛擬機,只要你能運行容器,mysql 的配置就省了.而且如果你想換個電腦,直接把容器端過來就可以使用容器裏面的服務.

 

 

Docker 基於 Go 語言開發,代碼託管在 Github 上,並遵循 Apache 2.0 開源協議。Docker  器可以封裝任何有效負載,幾乎可以在任何服務器之間進行一致性運行。換句話說,開發者構建的應用只需一次構建即可多平臺運行。運營人員只需配置他們的服務,即可運行所有的應用。

 

若是利用容器的話,那麼開發直接在容器裏開發,測試的時候把整個容器給測試,測好了把測試後容器再上線就好了.通過容器,整個開發,測試和生產環境可以保持高度一致。

 

此外容器也 VM 一樣具有一定得隔離性,各個容器之間的數據和內存空間相互隔離,可以保證一定的安全性。

 

Docker 可以解決虛擬機能夠解決的問題,同時也能夠解決虛擬機由於資源要求過高而無法解決的問題。

 

爲什麼要使用 docker

、快速交付應用程序

•開發者使用一個標準的 image 來構建開發容器,開發完成之後,系統管理員就可以使用這個容器來部署代碼

• docker 可以快速創建容器,快速迭代應用程序,並讓整個過程可見,使團隊中的其他成員更容易理解應用程序是如何創建和工作的。


• docker 容器很輕!很快!容器的啓動時間是次秒級的,節約開發、測試、部署的時間

、更容易部署和擴展

• docker 容器可以在幾乎所有的環境中運行,物理機、虛擬機、公有云、私有云、個人電腦、服務器等等。

• docker 容器兼容很多平臺,這樣就可以把一個應用程序從一個平臺遷移到另外一個。

、效率更高

• docker 容器不需要 hypervisor ,他是內核級的虛擬化。

、快速部署也意味着更簡單的管理

•通常只需要小小的改變就可以替代以往巨型和大量的更新工作。

 

Docker 的常用案例包括: 自動打包和部署應用

創建輕量、私有的 PaaS 環境自動化測試和持續集成/部署

部署並擴展 Web 應用、數據庫和後端服務器

 

那麼爲啥不用VM?

那麼既然容器和VM 這麼類似爲啥不用VM?docker 容器相對於 VM 還是有很多優點的:

1. 啓動速度快,容器通常在一秒內可以啓動. VM 要很久.

2. 資源利用率高,一臺普通服務器可以跑上千個容器,而跑 VM 就。。。。。。

3. 性能開銷小,VM 需要額外的 CPU 和內存來完成 OS 的功能,這一部分佔據了額外的資源. 爲啥相似的功能在性能上會有如此巨大的差距呢?看一下他們的設計圖,先看 VM :

 


下面的圖片比較了
Docker 和傳統虛擬化方式的不同之處,


blob.png

可見容器是在操作系統層面上實現虛擬化,直接複用本地主機的操作系統,而傳統方式則是在硬件層面實現。

 

Docker 優勢和劣勢

作爲一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具有衆多的優勢。首先,Docker 容器的啓動可以在秒級實現,這相比傳統的虛擬機方式要快得多。

其次,Docker 對系統資源的利用率很高,一臺主機上可以同時運行數千個 Docker 容器。容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘量小。傳統虛擬機方式運行 10 個不同的應用就要起 10 個虛擬機,而 Docker 只需要啓動 10 個隔離的應用即可。

 

具體說來,Docker 在如下幾個方面具有較大的優勢。更快速的交付和部署

對開發和運維devop人員來說,最希望的就是一次創建或配置,可以在任意地方正常運行。開發者可以使用一個標準的鏡像來構建一套開發容器,開發完成之後,運維人員可以直接使用這個容器來部署代碼。 Docker 可以快速創建容器,快速迭代應用程序,並讓整個過程全程可見,使團隊中的其他成員更容易理解應用程序是如何創建和工作的。 Docker 容器很輕很快!容器的啓動時間是秒級的,大量地節約開發、測試、部署的時間。

更高效的虛擬化

Docker 容器的運行不需要額外的 hypervisor 支持,它是內核級的虛擬化,因此可以實現更高的性能和效率。

更輕鬆的遷移和擴展

Docker 容器幾乎可以在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、個人電腦、服務器等。這種兼容性可以讓用戶把一個應用程序從一個平臺直接遷移到另外一個。更簡單的管理

使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發和更新,從而實現自動化並且高效的管理。

對比傳統虛擬機總結

特性

容器

虛擬機

啓動

秒級

分鐘級

硬盤使用

一般爲 MB

一般爲 GB

性能

接近原生

弱於

系統支持量

單機支持上千個容器


 

二、Docker 的體系結構

docker 使用 C/S 架構,docker daemon 作爲 server 端接受 client 的請求,並處理(創建、行、分發容器,他們可以運行在一個機器上,也通過 socket 或者 RESTful API  通信


blob.png

Docker daemon 一般在宿主主機後臺運行。

Docker client 以系統命令的形式存在,用戶用 docker 命令來跟 docker daemon 交互。

 

Docker 守護進程(Docker daemon

如上圖所示,Docker 守護進程運行在一臺主機上。用戶並不直接和守護進程進行交互,而是通過 Docker 客戶端間接和其通信。

Docker 客戶端(Docker client

Docker 客戶端,實際上是 docker 的二進制程序,是用戶與 Docker 交互方式。它接收用戶指令並且與背後的 Docker 守護進程通信。


blob.png

Docker 內部:

要理解 Docker 內部構建,需要理解以下三種部件:

Docker 鏡像 - Docker images

Docker  倉庫 - Docker registeries

Docker  容器 - Docker containers

 

Docker 鏡像  

 

Docker 鏡像是 Docker 容器運行時的只讀模板,鏡像可以用來創建 Docker 容器。每一個鏡


像由一系列的層 (layers) 組成。Docker 使用 UnionFS聯合文件系統來將這些層聯合到單獨的鏡像中。UnionFS 允許獨立文件系統中的文件和文件夾(稱之爲分支)被透明覆蓋,形成一個單獨連貫的文件系統。正因爲有了這些層的存在,Docker 是如此的輕量。當你改變了一個 Docker 鏡像,比如升級到某個程序到新的版本,一個新的層會被創建。因此,不用替換整個原先的鏡像或者重新建立(在使用虛擬機的時候你可能會這麼做),只是一個新的層被添加或升級了。現在你不用重新發布整個鏡像,只需要升級,層使得分發 Docker 鏡像變得簡單和快速。

每個 docker 都有很多層次構成,docker 使用  union file systems  將這些不同的層結合到一個 image 中去。



例如:
centos 鏡像中安裝 nginx,就成了 nginx 鏡像,其實在此時 Docker 鏡像的層級概念就體現出來了。底層一個 centos 操作系統鏡像,上面疊加一個 ngnx 層,就完成了一個 nginx 鏡像的構建。層級概念就不難理解,此時我們一般 centos 操作系統鏡像稱爲 nginx 鏡像層的父鏡像。

blob.png

Docker 倉庫  

 

Docker 倉庫用來保存鏡像,可以理解爲代碼控制中的代碼倉庫。同樣的,Docker 倉庫也有公有和私有的概念。公有的 Docker 倉庫名字是 Docker Hub。Docker Hub 提供了龐大的鏡像集合供使用。這些鏡像可以是自己創建,或者在別人的鏡像基礎上創建。

 

倉庫是集中存放鏡像文件的場所。有時候會把倉庫和倉庫註冊服務器Registry混爲一談, 並不嚴格區分。實際上,倉庫註冊服務器上往往存放着多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標籤tag)。

 

倉庫分爲公開倉庫(Public)和私有倉庫(Private)兩種形式。

最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括Docker Pool 等,可以提供大陸用戶更穩定快速的訪問。

 

當然,用戶也可以在本地網絡內創建一個私有倉庫。

當用戶創建了自己的鏡像之後就可以使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上 pull 下來就可以了。

*注:Docker 倉庫的概念跟 Git 類似,註冊服務器可以理解爲 GitHub 這樣的託管服務。

 




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章