天天看點

Docker筆記(一):什麼是Docker

原文位址: 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相對傳統虛拟化技術的優勢如下:

  1. 更高的資源使用率:Docker不需要硬體虛拟與運作完整作業系統的開銷,是以資源使用率更高,同樣配置的主機,采用Docker往往可以運作更多數量的應用。
  2. 更高效的使用體驗:在作業系統上安裝一些常用軟體,如mysql,redis等,往往需要折騰好一陣,有些還要手動安裝各種依賴,而采用Docker,可能幾行指令就可以讓一個服務快速運作起來。
  3. 一緻的運作環境:Docker鏡像功能可以把程式運作需要的環境進行封裝,確定程式在開發、測試、生産環境都能保持一緻性,避免因環境不一緻導緻程式運作異常。
  4. CI/CD支援:使用Docker可以定制鏡像來實作持續內建、持續部署,如基于gitlab + jenkins pipeline + docker的自動化部署。
  5. 更輕松的維護:因為Docker保證了運作環境的一緻性,是以應用的遷移或縮放将變得很容易;Docker的分層存儲與鏡像技術,也使得應用重複部分的複用變得更簡單,基于基礎鏡像可以進一步擴充定義自己的鏡像,也可以直接使用官方鏡像來使用。

3. Docker的基本架構

Docker的基本架構圖如下

主要包括幾部分:

  1. Docker daemon(Docker守護程序 

    dockerd

    ):Docker的執行引擎,負責監聽處理Docker用戶端請求與管理Docker相關對象,如鏡像、容器、網絡、資料卷等。一個Docker守護程序可與其它Docker守護程序進行通信,作為Docker服務進行管理。
  2. Docker client(Docker用戶端 

    docker

    ):Docker用戶端(

    docker

     CLI指令)是大多數使用者用來與Docker守護程序互動的方式,比如你在指令行執行

    docker run

    ,Docker用戶端将發送該指令請求到Docker守護程序,由守護程序執行。Docker用戶端可通過REST API, UNIX Socket或網絡接口來與Docker守護程序進行通信,并且可與多個Docker守護程序進行通信。
  3. Docker Registry(Docker注冊中心):用來存儲Docker鏡像的倉庫,類似于Maven的Nexus。Docker官方提供了一個公共鏡像倉庫Docker Hub( https://hub.docker.com/ ),

    docker

    相關指令預設會從Docker Hub上搜尋與下載下傳鏡像,我們可以配置一些國内鏡像倉庫位址來進行加速,甚至搭建自己的私有鏡像倉庫。
  4. Docker Objects:Docker管理的對象,主要包括鏡像、容器、網絡、資料卷等。

4. Docker的用途

根據第二部分Docker的優勢及筆者的經驗來看,目前Docker主要用于

  1. 常用軟體服務的搭建運作,如Mysql、Redis、Nginx等
  2. 業務服務的釋出部署,尤其是基于SpringBoot的微服務
  3. CI/CD實作,結合Gitlab的webhook,Jenkins的pipeline,實作自動化內建與部署
  4. 快速的彈性伸縮,在容器叢集化管理的場景中,如Swarm、K8s解決方案中,可基于容器對服務進行快速的彈性伸縮來應對業務量的突發情況
  5. 執行環境封裝,如一些深度學習架構模型,打成Docker鏡像的方式進行釋出,可以快速在不同的環境中運作起來

5. 總結

在微服務架構、DevOps這些概念盛行的時代,容器化技術變得越來越重要,幾乎成為每一位開發人員需要掌握的技能。本系列文章是筆者基于自身實踐及相關文獻參考,對Docker相關技術進行整理,歡迎關注,共同學習。

我的個人部落格位址:http://blog.jboost.cn

我的微信公衆号:jboost-ksxy (一個不隻有技術幹貨的公衆号,歡迎關注,及時擷取更新内容)

———————————————————————————————————————————————————————————————