原文地址: http://blog.jboost.cn/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 (一個不只有技術干貨的公眾號,歡迎關注,及時獲取更新內容)
———————————————————————————————————————————————————————————————