阿龙的学习笔记--- Docker 的一些概念总结
借鑒這些文章:
- https://zhuanlan.zhihu.com/p/57024225
- https://wangguoping.blog.csdn.net/article/details/81044217
- https://www.zhihu.com/question/28300645
1.Docker
-
Docker是一種新興的虛擬化技術,能夠一定程度上的代替傳統虛擬機。不過,Docker 跟傳統的虛擬化方式相比具有眾多的優勢。我也將Docker類比于Python虛擬環境,可以有效的配置各個版本的開發環境,比如深度學習與Java環境。
-
Docker的思想來自于集裝箱,集裝箱解決了什么問題?在一艘大船上,可以把貨物規整的擺放起來。并且各種各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。那么我就不需要專門運送水果的船和專門運送化學品的船了。只要這些貨物在集裝箱里封裝的好好的,那我就可以用一艘大船把他們都運走。(所以為嘛Docker標志是這個呢!破案了)
-
兩個應用場景來說明:
- 在一個服務器上,我們要部署兩個程序,但依賴的環境不一樣,都安裝需要調試很久,還有可能會沖突。那么,我們可以在服務器上創建不同的虛擬機在不同的虛擬機上放置不同的應用,但是虛擬機開銷比較高。docker可以實現虛擬機隔離應用環境的功能,并且開銷比虛擬機小,小就意味著省錢了。
- 你開發軟件的時候用的是Ubuntu,但是運維管理的都是centos,運維在把你的軟件從開發環境轉移到生產環境的時候就會遇到一些Ubuntu轉centos的問題,比如:有個特殊版本的數據庫,只有Ubuntu支持,centos不支持,在轉移的過程當中運維就得想辦法解決這樣的問題。這時候要是有docker你就可以把開發環境直接封裝轉移給運維,運維直接部署你給他的docker就可以了。而且部署速度快。
2. 優勢
-
對比
-
使用開發人員已經掌握的技能打包軟件
許多公司為了管理各種工具來為它們支持的平臺生成軟件包,不得不提供一些軟件發布和構建工程師的崗位。像 rpm、mock、 dpkg 和 pbuilder 等工具使用起來并不容易,每一種工具都需要單獨學習。而 Docker 則把你所有需要的東西全部打包起來,定義為一個文件。
-
使用標準化的鏡像格式打包應用軟件及其所需的文件系統
過去,不僅需要打包應用程序,還需要包含一些依賴庫和守護進程等。然而,我們永遠不能百分之百地保證,軟件運行的環境是完全一致的。這就使得軟件的打包很難掌握,許多公司也不能可靠地完成這項工作。常有類似的事發生,使用 Scientific Linux 的用戶試圖部署一個來自社區的、僅在 Red Hat Linux 上經過測試的軟件包,希望這個軟件包足夠接近他們的需求。如果使用 Dokcer、只需將應用程序和其所依賴的每個文件一起部署即可。Docker 的分層鏡像使得這個過程更加高效,確保應用程序運行在預期的環境中。
-
測試打包好的構建產物并將其部署到運行任意系統的生產環境
當開發者將更改提交到版本控制系統的時候,可以構建一個新的 Docker 鏡像,然后通過測試,部署到生產環境,整個過程中無需任何的重新編譯和重新打包。
-
將應用軟件從硬件中抽象出來,無需犧牲資源
傳統虛擬化方式是在硬件層面實現虛擬化,需要有額外的虛擬機管理應用和虛擬機操作系統層。而docker容器是在操作系統層面上實現虛擬化,直接復用本地主機操作系統,更加輕量。
3. 基本概念
-
Docker三大核心元素:鏡像(Image)、容器(Container)、倉庫(Repository)
-
鏡像,從認識上簡單的來說,就是面向對象中的類,相當于一個模板。從本質上來說,鏡像相當于一個文件系統。Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之后也不會被改變。
-
容器,從認識上來說,就是類創建的實例,就是依據鏡像這個模板創建出來的實體。容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行于屬于自己的獨立的命名空間。因此 容器可以擁有自己的root文件系統,自己的網絡配置,自己的進程空間,甚至自己的用戶ID 空間。容器內的進程是運行在一個隔離的環境里,使用起來,就好像是在一個獨立于宿主的系統下操作一樣。 這種特性使得容器封裝的應用比直接在宿主運行更加安全。
-
倉庫,從認識上來說,就好像軟件包上傳下載站,有各種軟件的不同版本被上傳供用戶下載。鏡像構建完成后,可以很容易的在當前宿主機上運行,但是,如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry 就是這樣的服務。
-
-
分層存儲
-
因為鏡像包含操作系統完整的root 文件系統,其體積往往是龐大的,因此在Docker設計 時,就充分利用Union FS 的技術,將其設計為分層存儲的架構。所以嚴格來說,鏡像并非是像一個ISO 那樣的打包文件,鏡像只是一個虛擬的概念,其實際體現并非由一個文件組成,而是由一組文件系統組成,或者說,由多層文件系統聯合組成。
-
鏡像構建時,會一層層構建,前一層是后一層的基礎。每一層構建完就不會再發生改變,后一層上的任何改變只發生在自己這一層。比如,刪除前一層文件的操作,實際不是真的刪除前一層的文件,而是僅在當前層標記為該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像。因此,在構建鏡像的時候,需要額外小心,每一層盡量只包含該層需要添加的東西,任何額外的東西應該在該層構建結束前清理掉。
-
分層存儲的特征還使得鏡像的復用、定制變的更為容易。甚至可以用之前構建好的鏡像作為基礎層,然后進一步添加新的層,以定制自己所需的內容,構建新的鏡像。
-
4. 鏡像和容器的區別
-
鏡像類似程序文件是靜態的,容器相當于進程是動態的。簡單來說,鏡像是文件,容器是進程。容器是基于鏡像創建的,即容器中的進程依賴于鏡像中的文件。
-
docker 鏡像概念類似虛擬機的鏡像。是一個只讀的模板,一個獨立的文件系統,包括運行容器所需的數據,可以用來創建新的容器。可以理解為包含應用程序以及其相關依賴的一個基礎文件系統,在Docker容器啟動的過程中,它以只讀的方式被用于創建容器的運行環境。
-
docker容器概念類似虛擬機,可以執行包含啟動,停止,刪除等。每個容器間是相互隔離的。容器中會運行特定的運用,包含特定應用的代碼及所需的依賴文件。可以把容器看作一個簡易版的linux環境(包含root用戶權限,進程空間,用戶空間和網絡空間等)和運行在其中的應用程序。
-
如果把鏡像類比為類,docker容器看做是由docker鏡像創建的類的實例。
5. 關于鏡像深入一些:
-
與其他虛擬機鏡像管理不同,Docker將鏡像管理納入到了自身設計之中,也即所有的Docker鏡像都是按照Docker所設定的邏輯打包的,也是受到Docker Engine所控制的。不像是普通的虛擬機可以從網上下載iso作為鏡像,Docker需要特定的工具打包,管理等。
-
Docker鏡像層次模型,鏡像其實是由基于Union File System(統一文件系統)文件系統的一組鏡像層依次掛載而得,而每個鏡像層包含的其實是對上一鏡像層的修改,這些修改其實是發生在容器運行的過程中的。所以,也可以反過來理解,鏡像是對容器運行環境進行持久化存儲的結果。
-
由于上述的層次模型,不同鏡像甚至可以共用同一個鏡像層,達到節省空間等目的,所以Docker的大小也不大,單位在MB,而虛擬機則一般在GB。這也滿足Docker設計時輕量化的思想。
總結
以上是生活随笔為你收集整理的阿龙的学习笔记--- Docker 的一些概念总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 翻看了21天的公众号内容,只发现一个事实
- 下一篇: 公众号html编辑工具,公众号编辑器哪个