1.我本地代碼運行沒問題啊,可是別人機器運行不了,從而致使環境不一致的問題php
2.那個兄弟又寫死循環了,怎麼這麼卡,在多用戶的操做系統下,會相互影響。html
天貓雙十一的狀況下,用戶量暴漲,從而致使運維成本太高的問題linux
Docker 是一個開源項目,誕生於 2013 年初,最初是dotCloud
公司內部的一個業餘項目。它基於 Google
公 司推出的 Go 語言實現。2013年3月,dotCloud
公司的創始人之一,Docker之父,28歲的Solomon Hykes
正式決定,將Docker項目開源。git
聽從了 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
),更重要的是容器性能開銷極低。web
先說docker是幹啥用的。由於如今物理服務器是很強大的,咱們若是在一臺物理機上只跑一個服務就浪費了。而同時跑不少服務他們之間又互相影響,好比一個服務出了內存泄漏把整個服務器的內存都佔滿了,其餘服務跟着倒黴。因此要把每一個服務都必須隔離起來,讓它們只使用本身那部分有限的CPU、內存、硬盤以及本身所依賴的軟件包。在容器技術以前,這個最先是用的是虛擬機--------業界的網紅。虛擬機技術的表明,是VMWare
和OpenStack
。因此,早先每一個服務之間是用虛擬機來實現隔離的,可是對資源有點浪費,因而就有了docker,一個機器上能夠裝十幾個到幾十個docker
,他們共享操做系統核心,佔用資源少,啓動速度快,但又能提供資源(CPU、內存、磁盤等)的必定程度的隔離。docker
簡單來講就是,不一樣的應用程序所依賴的環境不同,若是把他們依賴的軟件都安裝在一個服務器上,不只須要調試好久,並且可能會有衝突。tomcat
若是想把兩個應用程序隔離起來,能夠在服務器上建立不一樣的虛擬機,不一樣的虛擬機放不一樣的應用,可是虛擬機的開銷比較高。docker
做爲輕量級的虛擬機,是一個很好的工具。安全
## 服務器
引入:咱們知道,軟件的依賴環境大體包括配置文件、代碼、架構
IT 軟件中所說的 「Docker」
,是指容器虛擬化技術,docker自己並非容器,而是用於支持建立和使用 Linux 容器的工具。
在實際應用中是軟件部署的一種解決方案:做爲一個軟件集裝箱化平臺,可讓開發者構建應用程序時,將它與其依賴環境一塊兒打包到一個容器中,而後很容易地發佈和應用到任意平臺中也能夠實現虛擬化,容器是徹底使用沙箱機制,相互之間不會有任何接口。同時,也提高計算機硬件資源的利用率。
補充 說明:
# 沙箱機制(Sandboxie)
1、沙箱是什麼?
沙箱是一個虛擬系統程序,沙箱提供的環境相對於每個運行的程序都是獨立的,並且不會對現有的系統產生影響,即沙箱提供一個限制該應用程序對系統資源的訪問權限。
2、沙箱的應用
(1)搭建測試環境。沙箱的應用只能訪問本身的應用訪問目錄,而不能應用之間的資源進行共享,這樣就造成了一個相對安全的機制,因爲沙箱具備很是良好的獨立性、隔離性,因此可以搭建一些具備高風險的軟件進行測試。
(2)應用容器的利用,如Docker就是應用沙箱機制,這樣使得應用組件通過Docker的封裝,使得在項目的遷移、測試環境到生產環境的部署,保證了應用程序的運行環境保持一致性,同時也減小大量在環境搭建上的工做量。
首先,鯨魚是操做系統。要交付的應用程序是各類貨物,要將各類形狀和尺寸不一樣的貨物放到大鯨魚上,得考慮每件貨物怎麼安放(應用程序配套的環境),還得考慮貨物和貨物之間可否重疊起來(應用程序依賴的環境是否會衝突)。
如今使用了集裝箱(容器)把每件貨物都放到集裝箱裏,這樣大鯨魚能夠用一樣地方式安放、堆疊集裝了,省事省力。
即:打包放到鯨魚上,鯨魚放到服務器上。也就是搭建(建立)=》運輸(發送)=》運行:「build——ship——run」
,這樣在本身的電腦上怎麼運行,在服務器上也會怎麼運行。
去倉庫把鏡像拉到本地,而後用一條命令把鏡像運行起來,變成容器。
會將全部須要的內容放到不一樣的集裝箱中,誰須要這些環境就直接拿到這個集裝箱就能夠
運輸的標準化:docker有一個碼頭全部上傳的集裝箱都放在了這個碼頭上,當誰須要某一個環境,就直接指派大鯨魚去搬運這個集裝箱就能夠了
命令的標準化:docker提供了一系列的命令,幫助咱們去獲取集裝箱等等操做,固然,也能夠上傳等操做
提供了REST
的API
:衍生出了不少的圖形化界面,Rancher等
PS:REST API
是一組關於如何構建Web
應用程序API
的架構規則、標準或指導,REST API
遵循API
原則的架構風格。REST
是專門針對Web
應用程序而設計的,其目的在於下降開發的複雜度,提升系統的可伸縮性。
docker在運行集裝箱內的內容時,會在linux
的內核中單獨的開闢一片空間,這片空間不會影響到其餘程序
定義:Docker 鏡像能夠看做是一個特殊的文件系統(模板),除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)
做用:相似於虛擬機的快照,用來建立新的容器
特色:鏡像不包含任何動態數據,其內容在構建以後也不會被改變。
鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的類和實例同樣,鏡像是靜態 的定義,容器是鏡像運行時的實體。容器能夠被建立、啓動、中止、刪除、暫停等。
用來保存鏡像的倉庫,控制版本,相似於
解決運行環境不一致所致使的問題。這樣就不會產生「本地運行沒問題,可一到服務器上就不行了」的狀況。
限定最大的cpu
使用內存硬盤,這樣就起到了隔離的做用,避免產生「一塊代碼產生死循環,把磁盤佔滿了,其它程序也掛了」的狀況。
雙11時擴展機器用,下降運維人員的成本。
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 以及其餘容器技術,都屬於操做系統虛擬化範疇,操做系統細膩化最大的特色就是不須要額外的 supervisor 支持。Docker 虛擬化方式之因此有衆多優點,跟操做系統虛擬化技術自身的設計和實現分不開。
傳統方式是在硬件層面實現虛擬化,須要有額外的虛擬機管理應用和虛擬機操做系統層。Docker 容器時在操做系統層面實現虛擬化,直接複用本地主機的操做系統,所以更加輕量級。
在一個操做系統之上運行 / 安裝另外一種操做系統
應用程序, 操做系統和硬件三者之間的關係不變
資源佔用多
冗餘步驟多
啓動慢(分鐘級)
不是模擬一個完整的操做系統, 他是將軟件運行所須要的全部資源打包到一個隔離的容器
只須要軟件工做所須要的庫資源和設置
所以系統變得高效輕量, 且能保證任何環境中軟件都能始終如一的運行
docker pull
的時候,Docker damemon
先在本地倉庫中找,若是沒有,再去中央倉庫中拉取,拉取到本地倉庫就行了。
docker run
的時候,也是先在本地倉庫中找,若是有,直接放到容器裏用。不然,去中央倉庫中拉取。
Docker是一個Client-Server結構的系統
Docker守護進程運行在主機上,而後經過Socket鏈接從客戶端訪問, 守護進程從客戶端接受命令並管理運行在主機上的容器,而容器,就是一個運行時的環境
docker的理念:一次構建到處運行
對於開發和運維人員來講,最求之不得的效果可能就是一次建立和配置,以後能夠在任意地方、任意時間讓應用正常運行,而 Docker 偏偏能夠實現這一中級目標。具體來講,在開發和運維過程當中,Docker 具備如下幾個方面的優點:
更快的應用交付和部署
傳統的應用開發完成後,須要提供一堆安裝程序和配置說明文檔,安裝部署後需根據配置文檔進行繁雜的配置才能正常運行
使用Docker以後只須要交付少許容器鏡像文件,在正式生產環境加載鏡像並運行便可,應用安裝配置在鏡像裏已經內置好,大大節省部署配置和測試驗證時間
更便捷的升級和擴縮容
隨着微服務架構和Docker的發展,大量的應用會經過微服務方式架構,應用的開發構建將變成搭樂高積木同樣,每一個"Docker容"器將變成一塊"積木","應用的升級將變得很是容易"
當現有的容器不足以支撐業務處理時,可經過鏡像運行"新的容器進行快速擴容",使應用系統的擴容從原先的天級變成分鐘級甚至秒級
更簡單的運維繫統
應用容器化運行後,生產環境運行的應用可與開發、測試環境的應用"高度一致",容器會將應用程序相關的環境和狀態徹底封裝起來,不會由於底層基礎架構和操做系統的不一致性給應用帶來影響,產生新的BUG
當出現程序異常時,也能夠經過測試環境的相同容器進行快速定位和修復
更高效的計算資源被利用
Docker是內核級虛擬化,其不像傳統的虛擬化技術同樣須要額外的Hypervisor
支持,因此在一臺物理機上"能夠運行不少個容器實例",可大大"提高物理服務器的CPU和內存的利用率"
Docker自己並非容器,它是建立容器的工具,是應用容器引擎。
Docker 是一個容器運行載體或稱之爲管理引擎
image 文件生成的容器實例,自己也是一個文件,稱爲鏡像文件
同一個 image 文件,能夠生成多個同時運行的容器實例
一個容器運行一種服務,當咱們須要的時候,就能夠經過docker客戶端建立一個對應的運行實例,也就是咱們的容器
至於倉庫,就是放了一堆鏡像的地方,咱們能夠把鏡像發佈到倉庫中,須要的時候從倉庫中拉下來就能夠了