在各類技術大會(互聯網架構,雲計算等等),哪都少不了docker的身影。docker爲啥這麼火?由於它解決了大部分企業的痛點:快速的持續集成,服務的彈性伸縮,部署簡單,方便了運維,並且爲企業節省了機器資源,下降了成本。如今在不少企業(騰訊/京東/阿里/小紅書等等)都大規模使用docker。做爲開發工程師,我們或多或少須要接觸docker,由於我們的程序運行在docker容器當中,瞭解docker,有益無害。下面咱們就進入docker的世界吧~java
docker logolinux
docker的官網是:https://www.docker.com/,上圖是docker的logo:一條鯨魚馱着一些集裝箱在大海中遨遊!(這個logo很是有意思,蘊含了docker的核心思想,稍後分析)nginx
docker官網對docker的一句話定義是:web
「Docker is the world’s leading software containerization platform.」spring
(docker是全球領先的軟件容器化平臺)docker
大白話就是:docker是一個用來裝應用的容器,就像杯子能夠裝水,書包能夠放書,筆筒能夠放筆....你能夠把任何你想獲得的程序放到docker中!macos
docker是跨平臺的,支持linux/macos/windows,不過docker是在ubuntu系統上開發的,對於ubuntu支持最好。ubuntu
docker logo裏面是一條鯨魚馱着一些集裝箱在海中遨遊。windows
想一下,若是沒有集裝箱,那麼貨物是零散的存放,運輸過程當中說不定出現破損或者丟失,若是採用集裝箱,由於是密閉的,標準的,貨物運輸會很安全。api
鯨魚,游到碼頭拿貨(取集裝箱),而後出發,運輸集裝箱到目的地。這種存儲貨物/運輸貨物的方式很標準,保證從一個地方到另外一個地方,不會出現問題。
之前,A機器上運行的程序想部署一套到其餘機器上去,若是採起傳統到方式進行文件拷貝等,有可能出現問題,採用集裝箱的方式進行運輸就能夠避免。
既然,集裝箱是標準的,就是說它的操做也是標準的,好比打開,關閉。這就意味着咱們對應用的啓動、中止等將是統一的命令。(不管是nginx,tomcat等等,它們的啓動,中止都將是統一的命令!這裏說的就是docker的api接口的標準化)
集裝箱和集裝箱之間有隔離性,就好像虛擬機似的。咱們知道虛擬機能夠有本身的內存/CPU/硬盤/網卡等,docker差很少,不過docker的容器更佳輕量級,它的建立、銷燬很是快。【docker的隔離性最底層仍是依賴linux的lxc(Linux Container容器是一種內核虛擬化技術)機制來實現的】
docker思想
「程序在我這裏運行好好的,咋在你那裏就不行了呢?」
一個普通的java web程序跑起來,須要哪些依賴?
操做系統os/jdk/webserver/代碼/配置文件/...
好比,程序中調用了系統命令,如今os變了;
好比,jdk版本,編譯使用的是1.8版本,機器上安裝的是jdk1.6,沒法識別class版本;
好比,tomcat版本,有些舊版本的配置新版本不支持;...
針對這種問題,docker的處理方式是,把os/jdk/webserver/代碼等等一個個的放到集裝箱中去,打包放到鯨魚上,由鯨魚給咱們送到目的地去,也就是說docker解決了運行環境不一致帶來的問題!
「哪一個大哥又寫死循環了,系統又變慢了...」
傳統的方式中,咱們一臺機器上部署了不少服務,極可能因爲其餘服務出現死循環佔領cpu,日誌狂打磁盤爆滿等狀況致使咱們本身的服務出現異常。
而docker的隔離性能夠徹底避免這樣的問題,由於docker在啓動的時候,就給限定了最大能使用的cpu,內存,硬盤,若是超出就kill掉。
「雙十一來了,又要部署幾千臺服務,過完節後,還得下線這麼多,累死了...」
對於大部分系統而言,流量並非均勻的,好比電商系統,在11.11大促期間,就須要臨時擴容機器,以後在下掉,若是是成百上千臺,那就給運維帶來很是大的工做量,有了docker就變得簡單了,從5臺服務器變成500臺,5000臺...都是分分鐘的事情。(也就是說docker解決了快速擴容,彈性伸縮)
在上面咱們大白話說了那麼多,如今咱們須要用專業術語來揭開docker的3大核心概念了:鏡像/倉庫/容器。
鏡像(images),就是上面咱們說的集裝箱;
倉庫(repository),就是碼頭;
容器(container),就是運行程序的地方;
docker運行一個程序的過程是:去倉庫把鏡像拉到本地,而後用命令把鏡像運行起來,變成容器!(build構建鏡像;ship運輸鏡像;run運行的鏡像就是一個容器)
簡單示例它們之間的關係
本質來講,鏡像就是一系列的文件,docker利用linux的ufs(聯合文件系統)機制進行存儲來達到分層的效果。好比/test1目錄下有a和b兩個文件,test2目錄下有c和d兩個文件,那麼利用ufs能夠達到/test下有a、b、c、d四個文件,即ufs是一種分層的文件系統,能夠將不一樣的目錄掛到同一個虛擬文件系統下。每一層鏡像層加載完畢後,會被當作同一個目錄,至關於只有一個文件系統,docker的這種文件系統就被稱做爲鏡像。
容器,上面已經說起過,就是一個進程,能夠把容器想象成一個虛擬機,會有本身的文件系統。注意容器是可寫的,而鏡像是隻讀的,由於運行中的程序大部分有寫的需求,好比寫日誌,修改一些文件什麼的。若是容器須要對鏡像層的某些文件做修改,該如何處理呢?那麼就把鏡像層中的文件拷貝到容器中,在容器中進行修改,當咱們的應用讀取文件的時候,是從對頂層容器開始查找,若是沒有才會開始查找下一層(這樣咱們就能讀取到修改的文件了。)
倉庫,這裏有點相似maven倉庫的概念,其實就是爲了傳輸鏡像。https://hub.docker.com/這個是docker官網給咱們提供的遠程倉庫地址,固然公司內部通常會有本身的私有鏡像中心。
上圖中,能夠清楚的看到,同一個鏡像能夠生成多個容器運行,容器之間是相互獨立的。
好了,到這裏,本篇博客爲你們介紹了docker的一些初步知識,下一篇將帶你們實踐docker以及分析一個springboot項目的docker化。