1 概述php
linux容器是一類解決方案,如lxc,docker。lxc是容器管理功能。mysql
lxc是容器解決方案較早的實現者,docker是後續的實現者。linux
docker進一步輕量化lxc需求,把作好的系統模板作成一個磁盤映像文件,安裝的過程至關因而複製鏡像文件。sql
能夠作一個centos鏡像,二級mysql鏡像和php鏡像。docker
docker的一個程序只用於運行一個進程。因此在docker裏就不須要init進程(用來管理全部的進程,可是這裏只有一個進程)。若是一個用戶空間只有一個子進程,就不須要容器了。centos
應用程序的分發和發佈服務器
docker實現應用分發的結構。docker負責把集裝箱安裝和卸載。架構
lxc沒有解決程序分發的問題,docker藉助於鏡像文件,把依賴的文件都打包到鏡像文件裏,實現更簡單的安裝過程。框架
docker把要啓動的環境都打包成一個包,作成鏡像文件,這個鏡像文件只須要放到指定的路徑下,就能夠被啓動,不須要釋放文件。鏡像文件啓動後是在一個獨立環境下運行的進程。ide
docker把最終須要運行的文件都放到了一塊兒。讓多個進程通訊,即讓容器間通訊便可。
若是當前主機奔潰,要新建一個環境
依賴相同的文件,在用戶空間來看。是不同的,可是,在底層多是同一個。
docker能重構程序分發的技術。
這裏開發鏡像就變成尤爲重要。
任何一個物理主機down機,就須要用虛擬化的主機,如vsphere技術,或者是k8s。實現物理機的快速遷移。
實現彈性擴展和壓縮。跨多主機的容器編排和框架,就PaaS,平臺級服務。是一個雲環境
一個docker容器只是用來運行一個程序。
分層構建,啓動容器,在本地放置相應的鏡像文件。分層構建能夠複用。依賴於特殊的存儲設備,本地不支持分層構建的存儲機制,所以須要在內核的基礎上用相應技術實現。
docker最開始是lxc的二次封裝,引擎爲lxc,提高了lxc的應用和便捷,可是,後續又從新研發了容器引擎,拋棄了lxc。以後,docker自有的容器技術爲libcontainer,後續升級爲runC,runC是開放式的工業化標準,容器標準爲OCI,有兩個規範,runtime-sepc和image-sepc,最新的docker遵循runC標準
Docker的競爭對手coreOS,coreOS也是一個容器技術,經過rkt實現
2 Docker架構
在一臺主機上安裝docker deamon 和docker client,啓動守護進程,經過client的命令行工具,client發起命令,鏈接到docker deamon進程,deamon來接收命令,在本地啓動一個容器,能夠從互聯網上拉一個鏡像下來,後期能夠根據本身的分發需求,封裝鏡像
相關名詞解釋以下
Docker host:運行容器的主機
registry:放置鏡像的倉庫集合的服務器,爲docker的registry。docker有鏡像託管的鏡像,能夠在docker hub上註冊帳號,帳號可公共可私有。目前docker hub倉庫沒有收費。
client:是用來觸發容器的運行
docker daemon爲服務端,用來啓動容器,接收遠程的控制請求
docker是c/s架構的應用。docker便是客戶端也是服務器端,重點是看哪一個工具實現
Docker deamon 和docker基於http或者https協議進行通訊
Docker架構以下
docker鏡像文件是隻讀的,防止一個容器被修改影響另外一個容器。因爲鏡像是分層構建的,能夠臨時構建一層可讀可寫的,覆蓋在鏡像的最上層。這裏文件能夠被刪除或者更改,用戶看到的任何修改都是在這一層修改的,對原生鏡像沒有任何的修改。
所以每一個容器的讀寫操做都是在最上層的讀寫層上實現的。萬一容器被刪除,全部的數據都沒有,包括這個讀寫層上的數據。可是這樣不利於遷移和分發,由於過去運行過程的中間數據沒有在鏡像裏,這個讀寫層儘可能放臨時文件,重要的文件,須要經過掛載到外部存儲的捲來實現,這樣遷移的時候,容器和重要數據均可以被正常的加載。
容器自身有生命週期,數據在捲上,關閉容器後,若是要從新打開,只須要把新的鏡像關聯到對應的卷便可加載相應的數據,將數據和鏡像分離。