文章目錄
- 九、初識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 應用部署的環境問題
大型項目元件較多,運作環境也較為複雜,部署時會碰到一些問題:
- 依賴關系複雜,容易出現相容性問題
- 開發、測試、生産環境有差異

例如一個項目中,部署時需要依賴于
node.js
、
Redis
、
RabbitMQ
、
MySQL
等,這些服務部署時所需要的函數庫、依賴項各不相同,甚至會有沖突,給部署帶來了極大的困難。
9.1.2 Docker解決依賴相容問題
而
Docker
确巧妙的解決了這些問題,
Docker
是如何實作的呢?
Docker
為了解決依賴的相容問題的,采用了兩個手段:
- 将應用的
、Libs(函數庫)
、Deps(依賴)
與配置
一起打包應用
- 将每個應用放到一個隔離容器去運作,避免互相幹擾
這樣打包好的應用包中,既包含應用本身,也保護應用所需要的
Libs
、
Deps
,無需再作業系統上安裝這些,自然就不存在不同應用之間的相容問題了。
雖然解決了不同應用的相容問題,但是開發、測試等環境會存在差異,作業系統版本也會有差異,怎麼解決這些問題呢?
9.1.3 Docker解決作業系統環境差異
要解決不同作業系統環境差異問題,必須先了解作業系統結構。以一個
Ubuntu
作業系統為例,結構如下:
結構包括:
- 計算機硬體:例如
、CPU
、記憶體
等磁盤
- 系統核心:所有
發行版的核心都是Linux
,例如CentOS、Ubuntu、Fedora等。核心可以與計算機硬體互動,對外提供核心指令,用于操作計算機硬體。Linux
- 系統應用:作業系統本身提供的
、應用
。這些函數庫是對核心指令的封裝,使用更加友善。函數庫
應用于計算機互動的流程如下:
1)應用調用作業系統應用(函數庫),實作各種功能
2)系統函數庫是對核心指令集的封裝,會調用核心指令
3)核心指令操作計算機硬體
Ubuntu
和
CentOS
都是基于
Linux核心
,無非是系統應用不同,提供的函數庫有差異:
此時,如果将一個
Ubuntu版本
的
MySQL應用
安裝到
CentOS系統
,
MySQL
在調用
Ubuntu
函數庫時,會發現找不到或者不比對,就會報錯了:
Docker如何解決不同系統環境的問題?
- Docker将
與所需要調用的使用者程式
一起打包系統(比如Ubuntu)函數庫
- Docker運作到不同作業系統時,直接
,借助于基于打包的函數庫
的作業系統
來運作Linux核心
如圖:
9.1.4 小結
Docker如何解決大型項目依賴關系複雜,不同元件依賴的相容性問題?
-
允許開發中将Docker
、應用
、依賴
、函數庫
一起打包,形成可移植鏡像配置
-
應用運作在Docker
中,使用容器
,互相隔離沙箱機制
Docker如何解決開發、測試、生産環境有差異的問題?
-
中包含完整運作環境,包括Docker鏡像
、系統函數庫
,是以可以在任意Linux作業系統上運作僅依賴系統的Linux核心
Docker是一個快速傳遞應用、運作應用的技術,具備下列優勢:
- 可以将程式及其依賴、運作環境一起打包為一個鏡像,可以遷移到任意Linux作業系統
- 運作時利用沙箱機制形成隔離容器,各個應用互不幹擾
- 啟動、移除都可以通過一行指令完成,友善快捷
9.2 Docker和虛拟機的差別
Docker可以讓一個應用在任何作業系統中非常友善的運作。而以前我們接觸的虛拟機,也能在一個作業系統中,運作另外一個作業系統,保護系統中的任何應用。
兩者有什麼差異呢?
虛拟機(
virtual machine
)是在作業系統中模拟硬體裝置,然後運作另一個作業系統,比如在
Windows 系統
裡面運作
Ubuntu 系統
,這樣就可以運作任意的
Ubuntu
應用了。
Docker僅僅是
封裝函數
庫,并
沒有模拟完整的作業系統
,如圖:
對比來看:
Docker和虛拟機的差異:
-
是一個系統程序;虛拟機是在作業系統中的作業系統docker
-
體積小、啟動速度快、性能好;虛拟機體積大、啟動速度慢、性能一般docker
9.3 Docker架構
9.3.1 鏡像和容器
鏡像(
Image
):Docker将
應用程式
及其所需的
依賴
、
函數庫
、
環境
、
配置
等檔案打包在一起,稱為*鏡像*。
容器(Container):鏡像中的
應用程式運作後形成的程序
就是容器,隻是Docker會給容器程序做隔離,對外不可見。
一切應用最終都是代碼組成,都是硬碟中的一個個的位元組形成的檔案,隻有運作時,才會加載到記憶體,形成程序。
而鏡像,就是把一個應用在硬碟上的檔案、及其運作環境、部分系統函數庫檔案一起打包形成的檔案包,這個檔案包是隻讀的。
容器呢,就是将這些檔案中編寫的程式、函數加載到記憶體中運作,形成程序,隻不過要隔離起來。是以一個鏡像可以啟動多次,形成多個容器程序。
例如你下載下傳了一個QQ,如果我們将QQ在磁盤上的運作檔案及其運作的作業系統依賴打包,形成QQ鏡像。然後你可以啟動多次,雙開、甚至三開QQ,跟多個同學聊天。
9.3.2 DockerHub
開源應用程式非常多,打包這些應用往往是重複的勞動。為了避免這些重複勞動,人們就會将自己打包的應用鏡像,例如
Redis
、
MySQL
鏡像放到網絡上,共享使用,就像
GitHub
的
代碼共享
一樣。
- DockerHub:
是一個官方的DockerHub
。這樣的平台稱為Docker鏡像的托管平台
。Docker Registry
- 國内也有類似于
的公開服務,比如 網易雲鏡像服務、阿裡雲鏡像庫等。DockerHub
我們一方面可以将自己的鏡像共享到
DockerHub
,另一方面也可以從
DockerHub
拉取鏡像:
9.3.3 Docker架構
我們要使用Docker來操作鏡像、容器,就必須要安裝Docker。
Docker是一個
CS架構
的程式,由兩部分組成:
- 服務端(
):Docker守護程序,負責處理Docker指令,管理鏡像、容器等server
- 用戶端(
):通過指令或client
向Docker服務端發送指令,可以在本地或遠端向服務端發送指令。RestAPI
如圖:
9.3.4 小結
鏡像:
- 将
及其應用程式
、依賴
、環境
打包在一起配置
容器:
- 鏡像運作起來就是容器,一個鏡像可以運作多個容器
Docker結構:
-
:接收指令或遠端請求,操作鏡像或容器服務端
-
:發送指令或者請求到Docker服務端用戶端
- 一個鏡像托管的伺服器,類似的還有阿裡雲鏡像服務,統稱為
DockerRegistry