對容器引擎Docker的認識

0?wx_fmt=gif

Docker是什麼?


KVM, Virtualbox, Vmware是虛擬出機器,讓每一個實例看到一個單獨的機器;而Docker是虛擬出操做系統,實現應用之間的隔離,讓各個應用以爲本身有一個本身的操做系統,並且彼此之間隔離。假設沒有Docker,而後有進程1和進程2,它們的運行將相似下圖,進程1和進程2共享kernel,它們是同一OS下2個進程,所以必須擁有不一樣PID,可是又共享網卡,共享IP地址,看到同樣的根文件系統(不chroot的狀況下)等,能夠用Linux IPC手段進程間通訊。html

0?wx_fmt=png


有Docker的狀況下,假設進程1和進程2運行於不一樣的容器,那麼進程1和進程2都以爲本身和對方沒有半毛錢關係,都以爲本身擁有本身的根文件系統,本身的網卡等,而後進程1和進程2的PID還能夠同樣,好比假設2個都是100。可是,此100非彼100。linux

0?wx_fmt=png


Virtualbox等虛擬機的思路則徹底不同,若是進程1和進程2運行於不一樣的虛擬機,則操做系統都是雙份的,它們感受本身在不一樣的虛擬電腦上面跑。nginx

0?wx_fmt=png


因爲可見,Docker達到了相似虛擬機的效果,可是又沒有虛擬機的開銷,它虛擬的層次更加高。Docker不虛擬機器,僅僅虛擬應用的運行環境。git

爲何Docker也能夠「虛擬化」?

虛擬化,本質上一種虛幻,給你一種幻覺,讓你以爲擁有的不少甚至擁有全世界,哪怕你實際是一隻螻蟻。github

通過本人多年研究,虛擬化的技術分爲2種,一種是虛擬一個世界,第二個是虛擬一個氛圍。web

好比咱們在現實生活裏面是個屌絲,可是在虛擬人生的遊戲裏面,咱們能夠是王思聰++,集美貌智慧財富正義於一輩子。虛擬人生的遊戲,構建一個整個的新世界,這個世界,人人有房住,天下沒有賊。那麼這個就是硬件都變了,你的內核都變了。這個是Virtualbox,KVM這種虛擬出一個新世界的思路。docker

虛擬一個氛圍,是Docker的作法。例如貴公司的Linux部門之前只有3,4個工程師,而後有一個manager,後來有30我的了,你就能夠分什麼內核組、驅動組、應用組等更多的組,而後又多出幾個manager。這種組,相似於名稱空間,在每個單獨名稱空間的manager,都以爲本身是個manager,因而他會爽那麼一點點。ubuntu

最開始是這樣的markdown


0?wx_fmt=png


後來是這樣的
架構

0?wx_fmt=png


若是這樣還不夠,還能夠搞聲卡驅動組manager,網卡驅動組manager,反正能夠不停地搞。你們在各自的container裏面佔山爲王。

Docker就是這樣的名稱空間讓各自在一樣的Linux平臺上面各自暗爽,裝到你本身的容器裏面爽。

安裝Docker

若是是Windows主機,能夠下載docker-toolbox一路安裝,安裝過程當中若是提示什麼錯,能夠把360等相似軟件關閉。Windows安裝好Docker後,使用Docker Quickstart Terminal運行。

0?wx_fmt=jpeg

若是是Ubuntu,能夠按照https://docs.docker.com/engine/installation/linux/ubuntu/網頁進行安裝。最簡單的Ubuntu 16.04就是命令:sudo apt-get update&& apt-get install docker。


Ubuntu安裝Docker後,能夠把當前用戶加到docker用戶組以便當前用戶也有權限操做docker client和host之間的通訊socket(以後請重啓docker相關服務):


sudo usermod -aG docker $USER


爲了裝逼須要,咱們在docker hub網頁註冊一個用戶名,我註冊的用戶名是21cnbao。這樣之後,就能夠本身提交本身的image了。


0?wx_fmt=jpeg


Docker的架構

Docker中可能涉及到3個機器或者更多機器,一個運行docker命令的client, 一個包含images並以容器(container)形式運行image的主機,一個docker的images倉庫。client與docker host上面的docker daemon通訊。固然docker client和host能夠運行於一臺機器(咱們作實驗的時候是一臺),默認的docker倉庫是Docker Hub。


0?wx_fmt=jpeg


通常的流程中,client發pull命令從倉庫把image拉到docker host,而後經過run命令指揮image到host上面弄一個container來跑這個image。

固然也能夠是相反的流程,client 經過build命令在host上面建立一個本身的image,而後經過push命令把image推到倉庫。以後這個image能夠被別的人或者本身pull。

image究竟是個什麼鬼?

Docker鏡像是一個特殊的文件系統,提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。image爲特定目的而生,好比弄了個nginx的image後,這個image就把nginx的東西一應俱全了,不管是張3、王5、六麻子仍是七癩子,不管它是什麼電腦,什麼操做系統,只要支持docker,它把這個nginx的image下載下來後,拿docker run命令就能夠弄容器跑nginx了。這樣,用戶就不用裝nginx以及它依賴的一切包了(一般裝一個軟件弄依賴也能把你弄地煩躁死了)。這樣看起來,Docker實在是居家旅行,殺人越貨之必備良器也!

 

鏡像構建時,會一層層疊加,前一層是後一層的基礎。

0?wx_fmt=png


每一層構建完就不會再發生改變,後一層上的任何改變只發生在本身這一層。好比,刪除前一層文件的操做,實際不是真的刪除前一層的文件,而是僅在當前層標記爲該文件已刪除。因此這個很相似git裏面這一次提交相對於上一次提交的diff:


$git diff
 layout/book_index_template.html                    |    8 ++-
 text/05_Installing_Git/0_Source.markdown           |  14 ++++++
 text/05_Installing_Git/1_Linux.markdown            |  17 +++++++
 text/05_Installing_Git/2_Mac_104.markdown          |  11 +++++
 text/05_Installing_Git/3_Mac_105.markdown          |   8 ++++
 text/05_Installing_Git/4_Windows.markdown          |   7 +++
 .../1_Getting_a_Git_Repo.markdown                  |    7 +++-
 .../0_Comparing_Commits_Git_Diff.markdown        |   45 +++++++++++++++++++-
 .../0_Hosting_Git_gitweb_repoorcz_github.markdown |   4 +-
 9files changed, 115 insertions(+), 6 deletions(-)

這些疊加的最後一層就是container,因此你在container裏面改了文件,其實不會進image。

0?wx_fmt=jpeg

相關文章
相關標籤/搜索