微服務雖然具備各種各樣的優勢,但服務的拆分通用給部署帶來了很大的麻煩。 分散式系統中,依賴的元件非常多,不同元件之間部署時往往會產生一些衝突。在數百上千臺服務中重複部署,環境不一定一致,會遇到各種問題。
一、Docker的優勢
(1)應用部署的環境問題(依賴相容問題)
大型專案元件較多,執行環境也較為複雜,部署時會碰到一些問題:
- 依賴關係複雜,容易出現相容性問題
- 開發、測試、生產環境有差異
例如一個專案中,部署時需要依賴於node.js、Redis、RabbitMQ、MySQL等,這些服務部署時所需要的函式庫、依賴項各不相同,甚至會有衝突。給部署帶來了極大的困難。
(2)Docker為了解決依賴相容問題,採用了兩個手段:
- 將應用的Libs(函式庫)、Deps(依賴)、配置與應用一起打包
- 將每個應用放到一個隔離**容器**去執行,避免互相干擾
這樣打包好的應用包中,既包含應用本身,也保護應用所需要的Libs、Deps,無需再作業系統上安裝這些,自然就不存在不同應用之間的相容問題了。
雖然解決了不同應用的相容問題,但是開發、測試等環境會存在差異,作業系統版本也會有差異,怎麼解決這些問題呢?
(3)Docker解決作業系統環境差異
要解決不同作業系統環境差異問題,必須先了解作業系統結構。以一個Ubuntu作業系統為例,結構包括:
1)計算機硬體:例如CPU、記憶體、磁碟等
2)系統核心:所有Linux發行版的核心都是Linux,例如CentOS、Ubuntu、Fedora等。核心可以與計算機硬體互動,對外提供**核心指令**,用於操作計算機硬體。
3)系統應用:作業系統本身提供的應用、函式庫。這些函式庫是對核心指令的封裝,使用更加方便。
應用於計算機互動的流程如下:
1)應用呼叫作業系統應用(函式庫),實現各種功能
2)系統函式庫是對核心指令集的封裝,會呼叫核心指令
3)核心指令操作計算機硬體
Ubuntu和CentOSpringBoot都是基於Linux核心,無非是系統應用不同,提供的函式庫有差異:
此時,如果將一個Ubuntu版本的MySQL應用安裝到CentOS系統,MySQL在呼叫Ubuntu函式庫時,會發現找不到或者不匹配,就會報錯了:
Docker如何解決不同系統環境的問題?
1 ) Docker將使用者程式與所需要呼叫的系統(比如Ubuntu)函式庫一起打包
2 ) Docker執行到不同作業系統時,直接基於打包的函式庫,藉助於作業系統的Linux核心來執行
如圖:
總結:
1、Docker如何解決大型專案依賴關係複雜,不同元件依賴的相容性問題?
1) Docker允許開發中將應用、依賴、函式庫、配置一起**打包**,形成可移植映象
2)Docker應用執行在容器中,使用沙箱機制,相互**隔離**
2、Docker如何解決開發、測試、生產環境有差異的問題?
1)Docker映象中包含完整執行環境,包括系統函式庫,僅依賴系統的Linux核心,因此可以在任意Linux作業系統上執行
3、Docker是一個快速交付應用、執行應用的技術,具備下列優勢:
1)可以將程式及其依賴、執行環境一起打包為一個映象,可以遷移到任意Linux作業系統
2)執行時利用沙箱機制形成隔離容器,各個應用互不干擾
3)啟動、移除都可以透過一行命令完成,方便快捷
二、Docker和虛擬機器的區別
Docker可以讓一個應用在任何作業系統中非常方便的執行。而以前我們接觸的虛擬機器,也能在一個作業系統中,執行另外一個作業系統,保護系統中的應用。
兩者有什麼差異呢?
虛擬機器(virtual machine)是在作業系統中模擬硬體裝置,然後執行另一個作業系統,比如在 Windows 系統裡面執行 Ubuntu 系統,這樣就可以執行任意的Ubuntu應用了。
Docker僅僅是封裝函式庫,並沒有模擬完整的作業系統,如下圖:
Docker和虛擬機器的差異:
1)docker是一個系統程序;虛擬機器是在作業系統中的作業系統
2)docker體積小、啟動速度快、效能好;虛擬機器體積大、啟動速度慢、效能一般
三、Docker架構
1)映象和容器
Docker中有幾個重要的概念:
映象(Image):Docker將應用程式及其所需的依賴、函式庫、環境、配置等檔案打包在一起,稱為映象。
容器(Container):映象中的應用程式執行後形成的程序就是容器,只是Docker會給容器程序做隔離,對外不可見。
一切應用最終都是程式碼組成,都是硬碟中的一個個的位元組形成的檔案。只有執行時,才會載入到記憶體,形成程序。
而映象,就是把一個應用在硬碟上的檔案、及其執行環境、部分系統函式庫檔案一起打包形成的檔案包。這個檔案包是隻讀的。
容器呢,就是將這些檔案中編寫的程式、函式載入到記憶體中允許,形成程序,只不過要隔離起來。因此一個映象可以啟動多次,形成多個容器程序。
2)DockerHub
開源應用程式非常多,打包這些應用往往是重複的勞動。為了避免這些重複勞動,人們就會將自己打包的應用映象,例如Redis、MySQL映象放到網路上,共享使用,就像GitHub的程式碼共享一樣。
DockerHub:DockerHub是一個官方的Docker映象的託管平臺。這樣的平臺稱為Docker Registry。
國內也有類似於DockerHub 的公開服務,比如網易雲映象服務、阿里雲映象庫等。
我們一方面可以將自己的映象共享到DockerHub,另一方面也可以從DockerHub拉取映象:
3)Docker架構
我們要使用Docker來操作映象、容器,就必須要安裝Docker。
Docker是一個CS架構的程式,由兩部分組成:
服務端(server):Docker守護程序,負責處理Docker指令,管理映象、容器等
客戶端(client):透過命令或RestAPI向Docker服務端傳送指令。可以在本地或遠端向服務端傳送指令。
如圖:
企業部署一般都是採用Linux作業系統,而其中又數CentOS發行版佔比最多,因此我們在CentOS下安裝Docker。