原文地址: http://blog.jboost.cn/2019/07/13/docker-1.html
1. 前言
接觸Docker也有兩年多了,斷斷續續玩過一些應用場景,如安裝一些常用工具服務,部署業務專案,基於gitlab+jenkins pipeline+docker的CI/CD實現等。瞭解其基本知識與操作,但不能說深度掌握,故藉此系列進行梳理與學習,也希望對有意學習Docker的人提供參考。
2. Docker簡介
Docker最初是dotCloud公司(後來也改名為Docker)的一個內部專案,於2013年3月開源。Docker使用Google推出的Go語言實現,基於Linux核心的cgroup、namespace、Union FS等技術(先不用急著瞭解這些都是啥),對程式進行隔離,是作業系統層面的虛擬化技術。相對於傳統的硬體層面的虛擬化技術(虛擬機器),Docker顯得更為輕量化。下圖為傳統虛擬機器與Docker的結構對比
由上圖可看出傳統虛擬機器技術是在硬體層面虛擬出一套硬體(CPU、記憶體、磁碟、網路卡等)後,在其上執行一個完整的作業系統,再在作業系統上執行應用程式;而Docker的應用程式是直接執行在宿主機的核心上,也不需要進行硬體虛擬,因此,Docker要比傳統虛擬機器更為輕便。
總結Docker相對傳統虛擬化技術的優勢如下:
- 更高的資源利用率:Docker不需要硬體虛擬與執行完整作業系統的開銷,所以資源利用率更高,同樣配置的主機,採用Docker往往可以執行更多數量的應用。
- 更高效的使用體驗:在作業系統上安裝一些常用軟體,如mysql,redis等,往往需要折騰好一陣,有些還要手動安裝各種依賴,而採用Docker,可能幾行命令就可以讓一個服務快速執行起來。
- 一致的執行環境:Docker映象功能可以把程式執行需要的環境進行封裝,確保程式在開發、測試、生產環境都能保持一致性,避免因環境不一致導致程式執行異常。
- CI/CD支援:使用Docker可以定製映象來實現持續整合、持續部署,如基於gitlab + jenkins pipeline + docker的自動化部署。
- 更輕鬆的維護:因為Docker保證了執行環境的一致性,因此應用的遷移或縮放將變得很容易;Docker的分層儲存與映象技術,也使得應用重複部分的複用變得更簡單,基於基礎映象可以進一步擴充套件定義自己的映象,也可以直接使用官方映象來使用。
3. Docker的基本架構
Docker的基本架構圖如下
主要包括幾部分:
- Docker daemon(Docker守護程式
dockerd
):Docker的執行引擎,負責監聽處理Docker客戶端請求與管理Docker相關物件,如映象、容器、網路、資料卷等。一個Docker守護程式可與其它Docker守護程式進行通訊,作為Docker服務進行管理。 - Docker client(Docker客戶端
docker
):Docker客戶端(docker
CLI命令)是大多數使用者用來與Docker守護程式互動的方式,比如你在命令列執行docker run
,Docker客戶端將傳送該命令請求到Docker守護程式,由守護程式執行。Docker客戶端可通過REST API, UNIX Socket或網路介面來與Docker守護程式進行通訊,並且可與多個Docker守護程式進行通訊。 - Docker Registry(Docker註冊中心):用來儲存Docker映象的倉庫,類似於Maven的Nexus。Docker官方提供了一個公共映象倉庫Docker Hub( https://hub.docker.com/ ),
docker
相關命令預設會從Docker Hub上搜尋與下載映象,我們可以配置一些國內映象倉庫地址來進行加速,甚至搭建自己的私有映象倉庫。 - Docker Objects:Docker管理的物件,主要包括映象、容器、網路、資料卷等。
4. Docker的用途
根據第二部分Docker的優勢及筆者的經驗來看,目前Docker主要用於
- 常用軟體服務的搭建執行,如Mysql、Redis、Nginx等
- 業務服務的釋出部署,尤其是基於SpringBoot的微服務
- CI/CD實現,結合Gitlab的webhook,Jenkins的pipeline,實現自動化整合與部署
- 快速的彈性伸縮,在容器叢集化管理的場景中,如Swarm、K8s解決方案中,可基於容器對服務進行快速的彈性伸縮來應對業務量的突發情況
- 執行環境封裝,如一些深度學習框架模型,打成Docker映象的方式進行釋出,可以快速在不同的環境中執行起來
- …
5. 總結
在微服務架構、DevOps這些概念盛行的時代,容器化技術變得越來越重要,幾乎成為每一位開發人員需要掌握的技能。本系列文章是筆者基於自身實踐及相關文獻參考,對Docker相關技術進行整理,歡迎關注,共同學習。
我的個人部落格地址:http://blog.jboost.cn
我的微信公眾號:jboost-ksxy (一個不只有技術乾貨的公眾號,歡迎關注,及時獲取更新內容)
———————————————————————————————————————————————————————————————