Docker入門掃盲【進來領(lǐng)取腦圖】

開篇
眼光不錯,點進來就是賺到,這篇文章絕對讓你有所收獲,讓你對Docker的理解更上一層樓
Docker這項技術(shù)其實大家或多或少都聽過的,或者是在你以往投簡歷的時候,劃水刷博客、刷論壇的時候,肯定也見到過這一門技術(shù),你要是真的沒聽過也沒見過,去問百度,問谷歌,問你們公司的運維,這個雖然可以說是屬于運維工程師的必備技能之一,但是作為一名專業(yè)的程序員,也是需要簡單的去了解這項技術(shù)的,也是面試利器之一
這個念頭,360行,行行都內(nèi)卷,你想啊,你要是把我這篇文章看完了,了解了這項技術(shù),那豈不是可以在面試的時候吹牛逼了

然后呢,繼續(xù)跟著我后續(xù)的文章(瘋狂暗示關(guān)注...),去學習了這個技術(shù),你和同內(nèi)卷者一起去面試,你會這個技術(shù),別人不會
那offer豈不是到手了??別人看你的眼神會...

接下來我們就來一起來學習這個Docker吧
你學習一個新技術(shù)一般是用什么樣的思路去學習呢?我學習的前期的思路肯定是需要先知其然,再只求所以然,大致歸類一下就是
1、Docker是什么?干啥的?
2、Docker是如何解決痛點的,如何解決問題的?
3、Docker的架構(gòu)、內(nèi)部原理和實現(xiàn)方式?
4、Docker的簡單使用?
我們先來看一下維基百科中的解釋
Docker 是一個開放源代碼軟件,是一個開放平臺,用于開發(fā)應用、交付(shipping)應用、運行應用。Docker允許用戶將基礎(chǔ)設施(Infrastructure)中的應用單獨分割出來,形成更小的顆粒(容器),從而提高交付軟件的速度。
Docker容器與虛擬機類似,但二者在原理上不同。容器是將操作系統(tǒng)層虛擬化,虛擬機則是虛擬化硬件,因此容器更具有便攜性、高效地利用服務器。 容器更多的用于表示 軟件的一個標準化單元。由于容器的標準化,因此它可以無視基礎(chǔ)設施(Infrastructure)的差異,部署到任何一個地方。另外,Docker也為容器提供更強的業(yè)界的隔離兼容
再來看一下百度百科的解釋

由百度詞條的定義,我們可以捕捉到幾個關(guān)鍵詞,應用容器,虛擬化,沙箱。
簡單的說,容器就是用于存儲的一個東西;虛擬化,就是將一臺計算機虛擬成多臺邏輯計算機;沙箱,是一個獨立的工作環(huán)境,在內(nèi)部的任何操作不會影響到外部??偨Y(jié)起來,docker能夠生成一個個空間,每個空間內(nèi)部裝載了一些應用及其依賴包,空間之間互不影響,這些空間能夠?qū)⒂嬎銠C切分成若干個邏輯(虛擬)計算機。
打個比方,docker類似集裝箱,各式各樣的貨物,經(jīng)過集裝箱的標準化進行托管,集裝箱與集裝箱之間沒有影響。本來docker公司就是設想,交付運行如同海運一般,以OS(操作系統(tǒng))為貨輪,進行集裝箱運輸。
怎么樣,聽起來這個說法會不會很熟悉?是不是覺得和虛擬機很像?確實,docker和虛擬機的基本思想是一致的,都是通過打包,隔離等手段,將物理計算機分成若干個虛擬計算機,彼此之間相互影響。但是兩者還是有區(qū)別的,了解兩者的區(qū)別,有助于我們理解docker技術(shù)的優(yōu)勢。

Docker的來歷
Docker 是世界領(lǐng)先的軟件容器平臺。開發(fā)人員利用 Docker 可以消除協(xié)作編碼時“在我的機器上可正常工作”的問題。運維人員利用 Docker 可以在隔離容器中并行運行和管理應用,獲得更好的計算密度。企業(yè)利用 Docker 可以構(gòu)建敏捷的軟件交付管道,以更快的速度、更高的安全性和可靠的信譽為 Linux 和 Windows Server 應用發(fā)布新功能。
在工作中一般會遇到最少四個不一樣的環(huán)境,我們寫代碼的環(huán)境叫做開發(fā)環(huán)境,然后我們自測沒問題了,發(fā)到測試環(huán)境去測試,測試環(huán)境一般會包含最少三個以上,來應對產(chǎn)品日益增加的需求
多個測試環(huán)境也就可以支持多個需求的并行進展,而且一般還有一個預上線環(huán)境(預發(fā)環(huán)境),這個屬于最接近于線上環(huán)境的環(huán)境了,包括數(shù)據(jù)也盡可能的去接近于線上環(huán)境的數(shù)據(jù),預上線環(huán)境就是無限接近于線上環(huán)境的環(huán)境了
對外使用的叫做線上環(huán)境(生產(chǎn)環(huán)境),這個環(huán)境是用于真實用戶的,我們作為一個軟件的普通使用者,操作的就是這個軟件的生產(chǎn)環(huán)境
一般開發(fā)人員開發(fā)完代碼之后,都會自測相應的接口和代碼,雖然我們測好了在開發(fā)環(huán)境,但是也避免不了發(fā)到測試環(huán)境會出現(xiàn)各種各樣的問題,因為各個環(huán)境之間也是有差異的,數(shù)據(jù)庫版本、JDK版本、各種配置文件的不同...
所以就有個笑話《千萬不要跟程序員說,你的代碼有bug》:
他的第一反應是你的環(huán)境有問題,第二就是你是傻逼不會用吧。你要跟他這么說:“這個程序運行的怎么運行的跟預期不一樣,是我操作有問題嗎?”。這貨就會第一反應“我擦,這是不是出bug了?”
總之,Docker主要就是為了讓程序員解決在協(xié)作編碼時"在我的機器上可正常工作”的苦惱
Docker
接下來我們解釋下Docker,要想解釋清楚Docker,就需要清楚容器Container的概念,要解釋容器,我們就需要先從操作系統(tǒng)說起了,首先我們知道操作系統(tǒng)管理的是軟件和硬件資源
硬件資源包含:內(nèi)存、存儲設備、CPU等
軟件資源包含:各類軟件的運行、進程的調(diào)度、線程的分配之類的工作
這里我們要做到的是為一個軟件提供一個環(huán)境環(huán)境,這個運行環(huán)境通常是由操作系統(tǒng)內(nèi)核提供,另一部分運行庫提供;隨著硬件的性能提升,以及軟件種類的豐富,有兩種情況變得很常見:
硬件性能過剩:很多計算機的硬件配置,即使不能完全滿足峰值性能的要求,也往往會有大量時間處于硬件資源閑置的狀態(tài)。例如一般家用電腦,已經(jīng)是四核、六核的配置了,除了3A游戲、視頻制作、3D渲染、高性能計算等特殊應用外,通常有90%以上時間CPU是閑置的。
軟件沖突:因為業(yè)務需要,兩個或者多個軟件之間沖突,或者需要同一個軟件的不同版本。例如早幾年做web前端的,要測試網(wǎng)頁在不同版本的IE上是否能正常顯示,然而Windows只能裝一個版本的IE。
為了解決軟件沖突,只能配置多個電腦,或者一個電腦裝多個操作系統(tǒng),通過重啟來解決,顯然這樣是不友好的
虛擬機和Docker
于是乎,在硬件性能過剩的情況下,硬件虛擬機這一概念就被提出來了,所謂的硬件虛擬化,就是通過某個特殊的軟件,仿真出一臺或者多臺計算機的各種硬件,用戶可以在一臺電腦,通過虛擬機即可按照、運行操作系統(tǒng)(一般叫來賓操作系統(tǒng),Guest OS)
虛擬機的一個缺點就是占用資源過多,比如一個Windows系統(tǒng)開機不運行任何軟件需要兩三個G,一個沒有圖形化的Linux也需要占用幾百兆的內(nèi)存,而且為了應用系統(tǒng)運行的性能,往往還要給每臺虛擬機留出更多的內(nèi)存容量
能不能所有的應用使用同一個的操作系統(tǒng)減少硬件資源的浪費,但是又能避免包括運行庫運行庫在內(nèi)的軟件沖突呢?

圖中,每一個App和Lib的組合,就是一個容器。也就是Docker圖標里面的一個集裝箱。
和虛擬機相比,容器有以下優(yōu)點:
迅速啟動:沒有虛擬機硬件的初始化,沒有Guest OS的啟動過程,可以節(jié)約很多啟動時間,這就是容器的“開箱即用”。
占用資源少:內(nèi)存占用、存儲空間占用都小的多。
相同配置的服務器,如果運行虛擬機只能運行十多臺的,通??梢赃\行上百個容器毫無壓力。
當然,和虛擬機相比,因為共用內(nèi)核,只靠cgroup隔離,應用之間的隔離是不如虛擬機徹底的,如果某個應用運行時導致內(nèi)核崩潰,所有的容器都會崩潰。
而虛擬機內(nèi)的應用崩潰,理論上是不會影響其它虛擬機以及上面運行的應用的,除非是硬件或者Hypervisor有Bug
Docker鏡像
Docker把App和Lib的文件打包成為一個鏡像,并且采用類似多次快照的存儲技術(shù),可以實現(xiàn):
多個App可以共用相同的底層鏡像(初始的操作系統(tǒng)鏡像)
App運行時的IO操作和鏡像文件隔離
通過掛載包含不同配置/數(shù)據(jù)文件的目錄或者卷(Volume),單個App鏡像可以同時用來運行無數(shù)個不同業(yè)務的容器

上圖是基于一個Alpine Linux的鏡像,分別建立了Nginx和MySQL的鏡像,并且掛載不同的配置/數(shù)據(jù)同時運行3個網(wǎng)站應用3個數(shù)據(jù)庫應用的示意圖。
最后的結(jié)果就是,絕大部分應用,開發(fā)者都可以通過docker build創(chuàng)建鏡像,通過docker push上傳鏡像,用戶通過docker pull下載鏡像,用docker run運行應用。
用戶不需要再去關(guān)心如何搭建環(huán)境,如何安裝,如何解決不同發(fā)行版的庫沖突——而且通常不會需要消耗更多的硬件資源,不會明顯降低性能
Docker的架構(gòu)
Docker使用C/S架構(gòu),Client 通過接口與Server進程通信實現(xiàn)容器的構(gòu)建,運行和發(fā)布。client和server可以運行在同一臺集群,也可以通過跨主機實現(xiàn)遠程通信。

鏡像image:Docker鏡像(Image)就是一個只讀的模板
例如:一個鏡像可以包含一個完整的操作系統(tǒng)環(huán)境。鏡像可以用來創(chuàng)建相應的Docker容器,一個鏡像也可以創(chuàng)建多個Docker容器。也可以直接找相應的好的鏡像去下載使用即可
鏡像(Image)就是一堆只讀層(read-only layer)的統(tǒng)一視角,也許這個定義有些難以理解,看看下面這張圖:

右邊我們看到了多個只讀層,它們重疊在一起。除了最下面一層,其它層都會有一個指針指向下一層,這些層是Docker內(nèi)部的實現(xiàn)細節(jié),
倉庫repository:倉庫(Repository)是集中存放鏡像文件的場所
有時候會把倉庫和倉庫注冊服務器(Registry)混為一談,并不嚴格區(qū)分。實際上,倉庫注冊服務器上往往存放著多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標簽(tag),倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。
最大的公開倉庫是Docker Hub,存放了數(shù)量龐大的鏡像供用戶下載。國內(nèi)的公開倉庫包括 時速云 、網(wǎng)易云等,可以提供大陸用戶更穩(wěn)定快速的訪問。當然,用戶也可以在本地網(wǎng)絡內(nèi)創(chuàng)建一個私有倉庫,當用戶創(chuàng)建了自己的鏡像之后就可以使用push命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上pull下來就可以了
Docker倉庫的概念跟Git類似,注冊服務器可以理解為GitHub這樣的托管服務
容器container:Docker利用容器(Container)來運行應用
容器是從鏡像創(chuàng)建的運行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。可以把容器看做是一個簡易版的Linux環(huán)境(包括root用戶權(quán)限、進程空間、用戶空間和網(wǎng)絡空間等)和運行在其中的應用程序

容器的定義和鏡像幾乎一模一樣,也是一堆層的統(tǒng)一視角,唯一區(qū)別在于容器的最上面那一層是可讀可寫的
三者之間的關(guān)系:

知識框圖

好了,以上就是全部內(nèi)容了,我是小魚仙,你們的學習成長小伙伴
我希望有一天能夠靠寫字養(yǎng)活自己,現(xiàn)在還在磨練,這個時間可能會有很多年,感謝你們做我最初的讀者和傳播者。請大家相信,只要給我一份愛,我終究會還你們一頁情的。

再次感謝大家能夠讀到這里,我后面會持續(xù)的更新技術(shù)文章以及一些記錄生活的靈魂文章,如果覺得不錯的,覺得【大魚同學】有點東西的話,求點贊、關(guān)注、分享三連
哦,對了!后續(xù)的更新文章我都會及時放到這里,歡迎大家點擊觀看,都是干貨文章啊,建議收藏,以后隨時翻閱查看
https://github.com/DayuMM2021/Java
