1.我原生程式碼執行沒問題啊,但是別人機器執行不了,從而導致環境不一致的問題
2.那個兄弟又寫死迴圈了,怎麼這麼卡,在多使用者的作業系統下,會相互影響。
-
天貓雙十一的情況下,使用者量暴漲,從而導致運維成本過高的問題
二、docker的由來
Docker 是一個開源專案,誕生於 2013 年初,最初是dotCloud
公司內部的一個業餘專案。它基於 Google
公 司推出的 Go 語言實現。2013年3月,dotCloud
公司的創始人之一,Docker之父,28歲的Solomon Hykes
正式決定,將Docker專案開源。
遵從了 Apache 2.0 協議,專案程式碼在 GitHub
上進行 維護。Docker 自開源後受到廣泛的關注和討論,以至於 dotCloud
公司後來都改名為 Docker Inc。Redhat
已經 在其 RHEL6.5
中集中支援 Docker;Google 也在其 PaaS
產品中廣泛應用。Docker 專案的目標是實現輕量級的 作業系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC
)等技術。在 LXC
的基礎上 Docker 進行了進一 步的封裝,讓使用者不需要去關心容器的管理,使得操作更為簡便。使用者操作 Docker 的容器就像操作一個快速輕量級的虛擬機器一樣簡單。Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然 後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面 (類似iPhone
的 app
),更重要的是容器效能開銷極低。
三、為什麼要有docker?(why?)
先說docker是幹啥用的。因為現在物理伺服器是很強大的,我們如果在一臺物理機上只跑一個服務就浪費了。而同時跑很多服務他們之間又互相影響,比如一個服務出了記憶體洩漏把整個伺服器的記憶體都佔滿了,其他服務跟著倒黴。所以要把每個服務都必須隔離起來,讓它們只使用自己那部分有限的CPU、記憶體、硬碟以及自己所依賴的軟體包。在容器技術之前,這個最早是用的是虛擬機器--------業界的網紅。虛擬機器技術的代表,是VMWare
和OpenStack
。所以,早先每個服務之間是用虛擬機器來實現隔離的,但是對資源有點浪費,於是就有了docker,一個機器上可以裝十幾個到幾十個docker
,他們共享作業系統核心,佔用資源少,啟動速度快,但又能提供資源(CPU、記憶體、磁碟等)的一定程度的隔離。
簡單來說就是,不同的應用程式所依賴的環境不一樣,如果把他們依賴的軟體都安裝在一個伺服器上,不僅需要除錯很久,而且可能會有衝突。
如果想把兩個應用程式隔離起來,可以在伺服器上建立不同的虛擬機器,不同的虛擬機器放不同的應用,但是虛擬機器的開銷比較高。docker
作為輕量級的虛擬機器,是一個很好的工具。
##
四、什麼是
引入:我們知道,軟體的依賴環境大致包括配置檔案、程式碼、
-
IT 軟體中所說的
“Docker”
,是指容器虛擬化技術,docker本身並不是容器,而是用於支援建立和使用 Linux 容器的工具。 -
在實際應用中是軟體部署的一種解決方案:作為一個軟體集裝箱化平臺,可以讓開發者構建應用程式時,將它與其依賴環境一起打包到一個容器中,然後很容易地釋出和應用到任意平臺中也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何介面。同時,也提升計算機硬體資源的利用率。
補充 說明:
# 沙箱機制(Sandboxie)
一、沙箱是什麼?
沙箱是一個虛擬系統程式,沙箱提供的環境相對於每一個執行的程式都是獨立的,而且不會對現有的系統產生影響,即沙箱提供一個限制該應用程式對系統資源的訪問許可權。
二、沙箱的應用
(1)搭建測試環境。沙箱的應用只能訪問自己的應用訪問目錄,而不能應用之間的資源進行共享,這樣就形成了一個相對安全的機制,由於沙箱具有非常良好的獨立性、隔離性,所以能夠搭建一些具有高風險的軟體進行測試。
(2)應用容器的利用,如Docker就是應用沙箱機制,這樣使得應用元件經過Docker的封裝,使得在專案的遷移、測試環境到生產環境的部署,保證了應用程式的執行環境保持一致性,同時也減少大量在環境搭建上的工作量。
示例
-
首先,鯨魚是作業系統。要交付的應用程式是各種貨物,要將各種形狀和尺寸不同的貨物放到大鯨魚上,得考慮每件貨物怎麼安放(應用程式配套的環境),還得考慮貨物和貨物之間能否重疊起來(應用程式依賴的環境是否會衝突)。
-
現在使用了集裝箱(容器)把每件貨物都放到集裝箱裡,這樣大鯨魚可以用同樣地方式安放、堆疊集裝了,省事省力。
-
即:打包放到鯨魚上,鯨魚放到伺服器上。也就是搭建(建立)=》運輸(傳送)=》執行:
“build——ship——run”
,這樣在自己的電腦上怎麼執行,在伺服器上也會怎麼執行。
用docker執行一個程式的過程:
去倉庫把映象拉到本地,然後用一條命令把映象執行起來,變成容器。
五、docker的思想
集裝箱:
-
會將所有需要的內容放到不同的集裝箱中,誰需要這些環境就直接拿到這個集裝箱就可以
標準化
-
運輸的標準化:docker有一個碼頭所有上傳的集裝箱都放在了這個碼頭上,當誰需要某一個環境,就直接指派大鯨魚去搬運這個集裝箱就可以了
-
命令的標準化:docker提供了一系列的命令,幫助我們去獲取集裝箱等等操作,當然,也可以上傳等操作
-
提供了
REST
的API
:衍生出了很多的圖形化介面,Rancher等-
PS:
REST API
是一組關於如何構建Web
應用程式API
的架構規則、標準或指導,REST API
遵循API
原則的架構風格。REST
是專門針對Web
應用程式而設計的,其目的在於降低開發的複雜度,提高系統的可伸縮性。
-
隔離
-
docker在執行集裝箱內的內容時,會在
linux
的核心中單獨的開闢一片空間,這片空間不會影響到其他程式
六、docker的核心
docker三大核心:映象、容器、倉庫
映象:(Image)=>複製的程式
定義:Docker 映象可以看作是一個特殊的檔案系統(模板),除了提供容器執行時所需的程式、庫、資源、配置等檔案外,還包含了一些為執行時準備的一些配置引數(如匿名卷、環境變數、使用者等)
作用:類似於虛擬機器的快照,用來建立新的容器
特點:映象不包含任何動態資料,其內容在構建之後也不會被改變。
容器:(Container)=>集裝箱
-
映象(Image)和容器(Container)的關係,就像是物件導向程式設計中的類和例項一樣,映象是靜態 的定義,容器是映象執行時的實體。容器可以被建立、啟動、停止、刪除、暫停等。
倉庫: (Repository)=存放映象的地方
用來儲存映象的倉庫,控制版本,類似於
七、docker的作用
-
解決執行環境不一致所導致的問題。這樣就不會產生“本地執行沒問題,可一到伺服器上就不行了”的情況。
-
限定最大的
cpu
使用記憶體硬碟,這樣就起到了隔離的作用,避免產生“一塊程式碼產生死迴圈,把磁碟佔滿了,其它程式也掛了”的情況。 -
雙11時擴充套件機器用,降低運維人員的成本。
總結:
docker
的標準化讓快速擴充套件,彈性伸縮變得簡單
使用之前:
每次釋出一個程式,都要走一遍以下的流程:
使用之後:
遷移的時候,只需要在新的伺服器上啟動需要的容器就可以了,
無論新舊伺服器是否是同一類別的平臺。這無疑幫助我們節約了大量的寶貴時間,並降低部署過程出現問題的風險。
八、docker與虛擬機器的比較
作為一個作為一種輕量級的虛擬化方式,Docker 在執行應用上跟傳統的虛擬機器的方式相比具有如下顯著優勢:
-
Docker 容器啟動很快,啟動和停止可以實現秒級,相比傳統的虛擬機器方式(分鐘級)要快速很多。
-
Docker 容器對系統資源需求很少,一臺主機上可以同時執行數千個 Docker 容器。
-
Docker 通過類似 git 設計理念的操作來方便使用者獲取、分發和更新應用映象,儲存複用,增量更新。
-
Docker 通過
Dockerfile
支援靈活的自動化建立和部署機制,可以提高工作效率,並標準化流程。
特性 | 容器 | 虛擬機器 |
---|---|---|
啟動速度 | 秒級 | 分鐘級 |
隔離級別 | 程式級 | 作業系統級別 |
隔離策略 | CGroups |
Hypervisor |
效能 | 接近原生 | 較好 |
記憶體 | MB級 | GB級 |
系統資源 | 0~5% | 5~15% |
映象儲存 | KB-MB | GB-TB |
硬碟適應 | MB級 | GB級 |
叢集規模 | 上萬 | 上百 |
執行密度 | 單臺主機支援上千個 | 單臺主機支援幾個 |
隔離性 | 安全隔離 | 完全隔離 |
遷移 | 優秀 | 一般 |
高可用策略 | 彈性、負載、動態 | 備份、容災、遷移 |
docker
比VM
快的原因:
-
docker有著比虛擬機器更少的抽象層
-
由於docker不需要
Hypervisor
實現硬體資源虛擬化,執行在docker容器上的程式直接使用的都是實際物理機的硬體資源 因此在CPU、記憶體利用率上docker將會在效率上有明顯優勢
-
-
docker
利用的是宿主機的核心,而不需要Centos
-
因此當新建一個容器時,docker不需要和虛擬機器一樣重新載入這個作業系統核心 進而避免尋找、載入作業系統核心比較費時費資源的過程
-
-
當新建個虛擬機器時,虛擬機器軟體需要載入
Centos
這個新建過程是"分鐘級別的"-
docker由於直接利用宿主機的作業系統,則省略了這個個過程因此新建一個docker容器只需要"幾秒鐘"
-
九、docker與虛擬化
Docker 以及其他容器技術,都屬於作業系統虛擬化範疇,作業系統細膩化最大的特點就是不需要額外的 supervisor 支援。Docker 虛擬化方式之所以有眾多優勢,跟作業系統虛擬化技術自身的設計和實現分不開。
傳統方式是在硬體層面實現虛擬化,需要有額外的虛擬機器管理應用和虛擬機器作業系統層。Docker 容器時在作業系統層面實現虛擬化,直接複用本地主機的作業系統,因此更加輕量級。
虛擬機器技術:
-
在一個作業系統之上執行 / 安裝另一種作業系統
-
應用程式, 作業系統和硬體三者之間的關係不變
缺點:
-
資源佔用多
-
冗餘步驟多
-
啟動慢(分鐘級)
容器虛擬化技術:
-
不是模擬一個完整的作業系統, 他是將軟體執行所需要的所有資源打包到一個隔離的容器
-
只需要軟體工作所需要的庫資源和設定
-
因此係統變得高效輕量, 且能保證任何環境中軟體都能始終如一的執行
十、docker的執行原理
docker的基本架構圖:
低層原理
原理解析
-
docker pull
的時候,Docker damemon
先在本地倉庫中找,如果沒有,再去中央倉庫中拉取,拉取到本地倉庫就好了。 -
docker run
的時候,也是先在本地倉庫中找,如果有,直接放到容器裡用。否則,去中央倉庫中拉取。
docker的工作方式:
-
Docker是一個Client-Server結構的系統
-
Docker守護程式執行在主機上,然後通過Socket連線從客戶端訪問, 守護程式從客戶端接受命令並管理執行在主機上的容器,而容器,就是一個執行時的環境
十一、docker理念(在開發和運維之間的優勢):
docker的理念:一次構建處處執行
對於開發和運維人員來說,最夢寐以求的效果可能就是一次建立和配置,之後可以在任意地方、任意時間讓應用正常執行,而 Docker 恰恰可以實現這一中級目標。具體來說,在開發和運維過程中,Docker 具有以下幾個方面的優勢:
-
更快的應用交付和部署
-
傳統的應用開發完成後,需要提供一堆安裝程式和配置說明文件,安裝部署後需根據配置文件進行繁雜的配置才能正常執行
-
使用Docker之後只需要交付少量容器映象檔案,在正式生產環境載入映象並執行即可,應用安裝配置在映象裡已經內建好,大大節省部署配置和測試驗證時間
-
-
更便捷的升級和擴縮容
-
隨著微服務架構和Docker的發展,大量的應用會通過微服務方式架構,應用的開發構建將變成搭樂高積木一樣,每個"Docker容"器將變成一塊"積木","應用的升級將變得非常容易"
-
當現有的容器不足以支撐業務處理時,可通過映象執行"新的容器進行快速擴容",使應用系統的擴容從原先的天級變成分鐘級甚至秒級
-
-
更簡單的運維繫統
-
應用容器化執行後,生產環境執行的應用可與開發、測試環境的應用"高度一致",容器會將應用程式相關的環境和狀態完全封裝起來,不會因為底層基礎架構和作業系統的不一致性給應用帶來影響,產生新的BUG
-
當出現程式異常時,也可以通過測試環境的相同容器進行快速定位和修復
-
-
更高效的計算資源被利用
-
Docker是核心級虛擬化,其不像傳統的虛擬化技術一樣需要額外的
Hypervisor
支援,所以在一臺物理機上"可以執行很多個容器例項",可大大"提升物理伺服器的CPU和記憶體的利用率"
-
十二、docker總結:
-
Docker本身並不是容器,它是建立容器的工具,是應用容器引擎。
-
Docker 是一個容器執行載體或稱之為管理引擎
-
image 檔案生成的容器例項,本身也是一個檔案,稱為映象檔案
-
同一個 image 檔案,可以生成多個同時執行的容器例項
-
一個容器執行一種服務,當我們需要的時候,就可以通過docker客戶端建立一個對應的執行例項,也就是我們的容器
-
至於倉庫,就是放了一堆映象的地方,我們可以把映象釋出到倉庫中,需要的時候從倉庫中拉下來就可以了
附贈寶典祕籍
以下是一些關於docker的參考資料,有興趣的可以看看: