天天看點

【Spring Cloud】初識 Docker

文章目錄

  • ​​九、初識Docker​​
  • ​​9.1 什麼是Docker​​
  • ​​9.1.1 應用部署的環境問題​​
  • ​​9.1.2 Docker解決依賴相容問題​​
  • ​​9.1.3 Docker解決作業系統環境差異​​
  • ​​9.1.4 小結​​
  • ​​9.2 Docker和虛拟機的差別​​
  • ​​9.3 Docker架構​​
  • ​​9.3.1 鏡像和容器​​
  • ​​9.3.2 DockerHub​​
  • ​​9.3.3 Docker架構​​
  • ​​9.3.4 小結​​

九、初識Docker

9.1 什麼是Docker

微服務雖然具備各種各樣的優勢,但服務的拆分通用給部署帶來了很大的麻煩。

  • 分布式系統中,依賴的元件非常多,不同元件之間部署時往往會産生一些沖突
  • 在數百上千台服務中重複部署,環境不一定一緻,會遇到各種問題

9.1.1 應用部署的環境問題

大型項目元件較多,運作環境也較為複雜,部署時會碰到一些問題:

  • 依賴關系複雜,容易出現相容性問題
  • 開發、測試、生産環境有差異
【Spring Cloud】初識 Docker

例如一個項目中,部署時需要依賴于​

​node.js​

​、​

​Redis​

​、​

​RabbitMQ​

​、​

​MySQL​

​等,這些服務部署時所需要的函數庫、依賴項各不相同,甚至會有沖突,給部署帶來了極大的困難。

9.1.2 Docker解決依賴相容問題

而​

​Docker​

​确巧妙的解決了這些問題,​

​Docker​

​是如何實作的呢?

​Docker​

​為了解決依賴的相容問題的,采用了兩個手段:

  • 将應用的​

    ​Libs(函數庫)​

    ​、​

    ​Deps(依賴)​

    ​、​

    ​配置​

    ​與​

    ​應用​

    ​一起打包
  • 将每個應用放到一個隔離容器去運作,避免互相幹擾
【Spring Cloud】初識 Docker

這樣打包好的應用包中,既包含應用本身,也保護應用所需要的​

​Libs​

​、​

​Deps​

​,無需再作業系統上安裝這些,自然就不存在不同應用之間的相容問題了。

雖然解決了不同應用的相容問題,但是開發、測試等環境會存在差異,作業系統版本也會有差異,怎麼解決這些問題呢?

9.1.3 Docker解決作業系統環境差異

要解決不同作業系統環境差異問題,必須先了解作業系統結構。以一個​

​Ubuntu​

​作業系統為例,結構如下:

【Spring Cloud】初識 Docker

結構包括:

  • 計算機硬體:例如​

    ​CPU​

    ​​、​

    ​記憶體​

    ​​、​

    ​磁盤​

    ​等
  • 系統核心:所有​

    ​Linux​

    ​​發行版的核心都是​

    ​Linux​

    ​,例如CentOS、Ubuntu、Fedora等。核心可以與計算機硬體互動,對外提供核心指令,用于操作計算機硬體。
  • 系統應用:作業系統本身提供的​

    ​應用​

    ​​、​

    ​函數庫​

    ​。這些函數庫是對核心指令的封裝,使用更加友善。

應用于計算機互動的流程如下:

1)應用調用作業系統應用(函數庫),實作各種功能

2)系統函數庫是對核心指令集的封裝,會調用核心指令

3)核心指令操作計算機硬體

​Ubuntu​

​和​

​CentOS​

​都是基于​

​Linux核心​

​,無非是系統應用不同,提供的函數庫有差異:

【Spring Cloud】初識 Docker

此時,如果将一個​

​Ubuntu版本​

​的​

​MySQL應用​

​安裝到​

​CentOS系統​

​,​

​MySQL​

​在調用​

​Ubuntu​

​函數庫時,會發現找不到或者不比對,就會報錯了:

【Spring Cloud】初識 Docker

Docker如何解決不同系統環境的問題?

  • Docker将​

    ​使用者程式​

    ​與所需要調用的​

    ​系統(比如Ubuntu)函數庫​

    ​一起打包
  • Docker運作到不同作業系統時,直接​

    ​基于打包的函數庫​

    ​,借助于​

    ​作業系統​

    ​的​

    ​Linux核心​

    ​來運作

如圖:

【Spring Cloud】初識 Docker

9.1.4 小結

Docker如何解決大型項目依賴關系複雜,不同元件依賴的相容性問題?

  • ​Docker​

    ​允許開發中将​

    ​應用​

    ​、​

    ​依賴​

    ​、​

    ​函數庫​

    ​、​

    ​配置​

    ​一起打包,形成可移植鏡像
  • ​Docker​

    ​應用運作在​

    ​容器​

    ​中,使用​

    ​沙箱機制​

    ​,互相隔離

Docker如何解決開發、測試、生産環境有差異的問題?

  • ​Docker鏡像​

    ​中包含完整運作環境,包括​

    ​系統函數庫​

    ​、​

    ​僅依賴系統的Linux核心​

    ​,是以可以在任意Linux作業系統上運作

Docker是一個快速傳遞應用、運作應用的技術,具備下列優勢:

  • 可以将程式及其依賴、運作環境一起打包為一個鏡像,可以遷移到任意Linux作業系統
  • 運作時利用沙箱機制形成隔離容器,各個應用互不幹擾
  • 啟動、移除都可以通過一行指令完成,友善快捷

9.2 Docker和虛拟機的差別

Docker可以讓一個應用在任何作業系統中非常友善的運作。而以前我們接觸的虛拟機,也能在一個作業系統中,運作另外一個作業系統,保護系統中的任何應用。

兩者有什麼差異呢?

虛拟機(​

​virtual machine​

​)是在作業系統中模拟硬體裝置,然後運作另一個作業系統,比如在 ​

​Windows 系統​

​​裡面運作 ​

​Ubuntu 系統​

​​,這樣就可以運作任意的​

​Ubuntu​

​應用了。

Docker僅僅是​

​封裝函數​

​庫,并​

​沒有模拟完整的作業系統​

​,如圖:

【Spring Cloud】初識 Docker

對比來看:

【Spring Cloud】初識 Docker

Docker和虛拟機的差異:

  • ​docker​

    ​是一個系統程序;虛拟機是在作業系統中的作業系統
  • ​docker​

    ​體積小、啟動速度快、性能好;虛拟機體積大、啟動速度慢、性能一般

9.3 Docker架構

9.3.1 鏡像和容器

鏡像(​

​Image​

​):Docker将​

​應用程式​

​​及其所需的​

​依賴​

​​、​

​函數庫​

​​、​

​環境​

​​、​

​配置​

​等檔案打包在一起,稱為*鏡像*。

容器(Container):鏡像中的​

​應用程式運作後形成的程序​

​就是容器,隻是Docker會給容器程序做隔離,對外不可見。

一切應用最終都是代碼組成,都是硬碟中的一個個的位元組形成的檔案,隻有運作時,才會加載到記憶體,形成程序。

而鏡像,就是把一個應用在硬碟上的檔案、及其運作環境、部分系統函數庫檔案一起打包形成的檔案包,這個檔案包是隻讀的。

容器呢,就是将這些檔案中編寫的程式、函數加載到記憶體中運作,形成程序,隻不過要隔離起來。是以一個鏡像可以啟動多次,形成多個容器程序。

【Spring Cloud】初識 Docker

例如你下載下傳了一個QQ,如果我們将QQ在磁盤上的運作檔案及其運作的作業系統依賴打包,形成QQ鏡像。然後你可以啟動多次,雙開、甚至三開QQ,跟多個同學聊天。

9.3.2 DockerHub

開源應用程式非常多,打包這些應用往往是重複的勞動。為了避免這些重複勞動,人們就會将自己打包的應用鏡像,例如​

​Redis​

​、​

​MySQL​

​鏡像放到網絡上,共享使用,就像​

​GitHub​

​的​

​代碼共享​

​一樣。

  • DockerHub:​

    ​DockerHub​

    ​是一個官方的​

    ​Docker鏡像的托管平台​

    ​。這樣的平台稱為​

    ​Docker Registry​

    ​。
  • 國内也有類似于​

    ​DockerHub​

    ​ 的公開服務,比如 ​​網易雲鏡像服務​​、​​阿裡雲鏡像庫​​等。

我們一方面可以将自己的鏡像共享到​

​DockerHub​

​,另一方面也可以從​

​DockerHub​

​拉取鏡像:

【Spring Cloud】初識 Docker

9.3.3 Docker架構

我們要使用Docker來操作鏡像、容器,就必須要安裝Docker。

Docker是一個​

​CS架構​

​的程式,由兩部分組成:

  • 服務端(​

    ​server​

    ​):Docker守護程序,負責處理Docker指令,管理鏡像、容器等
  • 用戶端(​

    ​client​

    ​):通過指令或​

    ​RestAPI​

    ​向Docker服務端發送指令,可以在本地或遠端向服務端發送指令。

如圖:

【Spring Cloud】初識 Docker

9.3.4 小結

鏡像:

  • 将​

    ​應用程式​

    ​及其​

    ​依賴​

    ​、​

    ​環境​

    ​、​

    ​配置​

    ​打包在一起

容器:

  • 鏡像運作起來就是容器,一個鏡像可以運作多個容器

Docker結構:

  • ​服務端​

    ​:接收指令或遠端請求,操作鏡像或容器
  • ​用戶端​

    ​:發送指令或者請求到Docker服務端
  • 一個鏡像托管的伺服器,類似的還有阿裡雲鏡像服務,統稱為​

    ​DockerRegistry​