咱們經過四W(what,when, why, how)原則去學習一下dockerpython
What
什麼是docker?linux
docker是一種虛擬化技術,太過專業的術語這裏不聊,反而容易亂。能夠將其比做相似vmware的虛擬軟件,一個docker容器裏面能夠包含一套完整的軟件運行環境。docker
When
何時須要使用docker技術,或者說docker技術的應用場景有哪些?安全
場景一:節省項目環境部署時間
1.單項目打包
每次部署項目到測試、生產等環境,都要部署一大堆依賴的軟件、工具,並且部署期間出現問題概率很大,不經意就花費了很長時間。
Docker主要理念就是環境打包部署,可在任意Docker Engine運行。前期咱們只須要將每一個項目環境打包到鏡像,push到鏡像倉庫,當有須要部署這個項目時,直接pull鏡像啓動容器,這個項目就能夠訪問了!一次構建屢次部署,一勞永逸。
2.整套項目打包
公司有一項這樣的業務:有一個產品能夠整套部署到客戶那裏,以往都是派一名實施工程師到客戶那部署。若是用了Docker,咱們能夠前期將這套項目封裝打包起來,實現一鍵部署,分分鐘鍾搞定,就不須要再派人過去了。好比官方的Docker Compose編排工具。
3.新開源技術試用
有時,咱們想調研一些開源項目,咱們能夠直接從公共鏡像倉庫pull項目官方作好鏡像啓動容器便可。
場景二:環境一致性
開發工程師在Windows系統上開發項目,測試、生產環境操做系統都是Linux系統,這就產生了環境不一致的狀況:項目在開發電腦本地運行沒問題,到了測試或生產環境就運行不起來,解決這問題最好方式就是這三處環境保持一致。軟件版本、操做系統、物理機、雲主機......試想下,能作到嗎?
Docker將項目環境打包成鏡像,能夠在任何Docker Engine上浪。此時Docker就是咱們這些項目的基石,Docker可移植性,保持運行狀態一致性,可想而知,是否更容易解決問題呢?
場景三:持續集成
一個項目版本快速迭代的測試場景,須要一個合理的CI(持續集成)/CD(持續部署)環境支撐。CI/CD是一個週期性自動化項目測試流程,包括構建、部署、測試、發佈等工做,不多須要人工干預。
項目測試流程大體以下圖:
Docker結合Jenkins構建持續集成環境大體以下圖:
Docker在上面這個圖的做用是項目鏡像構建和快速部署,打通測試環境與生產環境,高度保持多個環境之間一致性。
場景四:微服務
微服務是近幾年來IT圈內談論比較多的一個名詞,意義也很簡單:儘量細粒度拆分業務程序架構,由多個獨立服務組成業務系統。
Docker的容器設計原則:一個容器一個服務,容器之間相互隔離,不妨試想一下,若是容器做爲這些獨立服務的部署單元,是否是有點恰到好處呢?
場景五:彈性伸縮
說到彈性伸縮,一般是集羣模式下存在。像AWS AutoScaling,能夠自定義資源閾值,SLB自動添加EC2雲主機,應對業務訪問量突發狀況。
當適用Docker技術之後,這種彈性伸縮的單元就是雲主機之上的容器了。
容器集羣化管理已經有成熟的解決方案,好比:官方的Swarm,谷歌的K8S
因爲Docker容器快速啓動特性,能夠很快速的啓動幾十個、上百個容器來提供更多併發和資源利用率(若是宿主機資源不夠,還須要加主機到集羣中)。
總結:簡化部署流程,提升生產力!
Why
爲何使用docker?服務器
咱們來比較一下虛擬機和docker容器的架構架構
kvm虛擬機
![](http://static.javashuo.com/static/loading.gif)
docker容器
![](http://static.javashuo.com/static/loading.gif)
經過上面兩圖的比較,能夠發行架構上有兩個區別:併發
一、引擎不同,一個是hypervisor引擎,一個是docker daemon引擎微服務
二、虛擬機在hypervisor之上,須要一個guest os(客戶端操做系統);而docker沒有工具
docker容器與虛擬機的比較
既然架構上有區別了,那麼具體在性能等一些方面,確定會有所不一樣,這也是咱們why使用docker的緣由。性能
時間上:docker秒級啓動,kvm虛擬機分鐘級別(多了一層guest os,確定會拖延啓動的時間)
空間上:docker資源佔用小,部署起來比虛擬機更快速(docker鏡像一般以M爲單位,而虛擬機一般以G爲單位)
性能上:docker共享宿主機內核,系統級虛擬化,佔用資源少,容器性能接近物理機;虛擬機須要hypervisor支持來虛擬化一些設備,並且有完整的GuestOs,虛擬化開銷大,故而性能沒有容器的好
安全上:docker只是進程級的隔離(每一個容器是一個進程,進程之間是共享宿主機器內核的),因此 隔離性 和 穩定性 不如虛擬機
使用上:docker容器可運行在主流的任何linux發行版上(由於容器共享宿主機內核,不用考慮pu是否支持虛擬化技術);而kvm是基於硬件的徹底虛擬化,須要硬件的支持,若是cpu不支持虛擬化技術的話,虛擬機就沒法正確安裝
How
怎麼使用docker,這是最費腦子的環節了,須要記憶的東西比較多,拆分開來一一介紹,這裏只作一些基本概念的介紹
基本概念
倉庫(Registry)
集中存放鏡像文件的場所。
倉庫分:公有倉庫 和私有倉庫。
倉庫服務器上能夠放多個倉庫,每一個倉庫能夠包含多個鏡像。
鏡像(Image)
能夠理解成一個壓縮包
是一個只讀的模板。如:一個鏡像能夠包含一個完整的操做系統環境,裏面僅僅安裝了python環境。
鏡像能夠用來建立Docker容器,一個鏡像能夠建立不少容器。
容器(Container)
Docker利用容器來運行應用。
容器是從鏡像建立的運行實例。它能夠被啓動、開始、中止、刪除。
每一個容器都是相互隔離的、保證安全的平臺。
能夠把容器看作是一個簡易版的Linux環境和運行在其中的應用程序
記住一個原則:容器只作運算,不作存儲,就算連程序的代碼也不要放到docker裏(只是推薦,並不是必定要這樣)