Docker(1)- 什麼是 Docker

如果你還想從頭學起 Docker,可以看看這個系列的文章哦!

//www.cnblogs.com/poloyy/category/1690628.html

 

備註

這裡的概念直接引用官方的,咱們提取關鍵字資訊來熟記即可

 

學習 Docker 前的必備知識

環境配置的煩惱

  • 軟體開發最大的麻煩事之一,就是環境配置
  • 相信每位編程初學者都會在環境配置上倒騰很久,而作為老師也會因為不同機器出現五花八門的環境配置問題而煩惱
  • 想要軟體正常運行,那麼系統的設置和各種庫、組件正確的安裝才能如期運行
  • 舉例來說,安裝一個 Python 應用,電腦必須有 Python 引擎,還必須有各種依賴,可能還要配置環境變數
  • 當你需要換機器的時候,你之前所配置的環境又要重頭來一遍,非常麻煩

 

很久以前的應用部署方式

介紹

在一個物理伺服器上面安裝系統,直接部署應用

 

缺點

  • 部署非常慢
  • 成本非常高
  • 資源浪費:部署的應用並不會佔滿伺服器資源,會有大部分的空閑資源
  • 難於遷移和擴展:像上面說到的,換台伺服器,環境又要重新配
  • 可能會被限定硬體廠商:底層系統架構不同

 

虛擬化技術出現後的應用部署方式

虛擬化介紹

  • 一個主機部署多個虛擬機,每個虛擬機可以部署多個應用
  • 比如在 Windows 系統裡面運行 Linux 系統的 VM
  • 對於底層系統(主機)來說,虛擬機就是一個普通文件,不需要就刪掉,對主機沒有影響

 

虛擬化優點

  • 資源池:一個物理機的資源分配到了不同的虛擬機
  • 易擴展:添加物理主機或虛擬機
  • 易雲化:阿里雲、AWS 提供虛擬化技術

 

虛擬化局限性

  • 資源佔用多:每一個虛擬機都是一個完整的作業系統,要給其分配資源,當虛擬機數量增多時,物理主機本身消耗的資源勢必增多
  • 冗餘步驟多:虛擬機是完整的作業系統,一些系統級別的操作步驟,往往無法跳過,比如用戶登錄
  • 啟動慢:啟動作業系統需要多久,啟動虛擬機就需要多久。可能要等幾分鐘,應用程式才能真正運行

 

容器的基礎知識

容器為什麼會出現

  • 上面也講述了單機部署應用和虛擬機技術的局限性
  • 容器的誕生就是為了解決這些局限性的

 

什麼是容器

  • 對應用軟體和其依賴的包進行標準化打包
  • 應用之間相互隔離
  • 共享同一個 OSKernel
  • 可以運行在很多主流作業系統上
  • 可以理解成:標準化軟體單元

 

容器解決了什麼問題 

  • 解決了開發和運維之間的矛盾
  • 在開發和運維之間搭建了一個橋樑,是實現 devops 的最佳解決方案

 

容器和虛擬機的區別

容器和虛擬機都具有相似的資源隔離和分配特點,但是功能不同,因為容器虛擬化了作業系統,而不是硬體,所以更加隨身和高效

容器 VM
應用程式層的抽象,將程式碼和依賴項打包在一起【容器是應用層面的隔離】 將一台伺服器轉變為多台伺服器的物理硬體的抽象【虛擬化是物理資源層面的隔離】

多個容器可以在同一台電腦上運行,並與其他容器共享OS內核

也允許多個VM在單台電腦上運行,但需要啟動單獨的虛擬機 OS

僅有一個物理機的OS,多個容器共享物理機的資源

多個OS(物理機一個OS,每個 VM 一個 OS),均獨享資源
一台物理機可以運行數個容器 一台物理機最多可以運行十來個虛擬機
容器鏡像的大小通常為幾十 MB 包含作業系統、二進位文件、庫,至少也要幾個 GB
可以在數秒內完成啟動 和物理機啟動時間一樣慢,可能要幾分鐘
可以處理更多的應用程式,消耗的資源比 VM 少  
每個容器在用戶空間中作為隔離的進程運行  

 

虛擬化 + 容器

  • 其實就是 一台物理機上部署多個 VM,每個 VM 上又可以有多個容器
  • 容器和 VM 一起結合使用,在部署和管理應用程式時提供了很大的靈活性

 

Docker 的詳細介紹

Docker 簡介

  • Docker 是一個開源的應用容器引擎,基於 Go 語言
  • 可以打包應用以及依賴包到一 個輕量級、可移植的容器中
  • Docker 打包好了的容器,可以發布到任何流行的 Linux 機器上,也可以實現虛擬化
  • 容器是完全使用沙箱機制,相互之間不會有任何介面(獨立)
  • 容器性能開銷極低
  • Docker 使用客戶端-伺服器 (C/S) 架構模式,使用遠程 API 來管理和創建 Docker 容器
  • Docker 是實現容器技術的一種工具
  • Docker 容器還可以進行版本管理、複製、分享、修改,就像管理普通的程式碼一樣

 

工作中的應用場景

  • Web 應用的自動化打包和發布
  • 自動化測試和持續集成、發布(我們的重點)
  • 組建微服務架構,通過多個容器,一台機器可以跑多個服務,因此在本機可以模擬出微服務架構

 

將軟體打包到容器中,以進行開發,運輸和部署

  • 容器是打包程式碼及其所有依賴項的軟體的標準單元,所以該軟體可以從一個電腦環境快速可靠地在另一個電腦環境進行運行
  • Docker 容器鏡像是一個輕量級、獨立的、可執行的軟體包,它包含運行應用程式所需的一切:運行環境、系統工具、系統庫、配置 
  • 容器鏡像在運行時成為容器
  • 容器化軟體都可用於基於 Linux 和 Windows 的應用程式,始終運行相同
  • 容器將軟體與其環境隔離開來,即使存在差異,但軟體仍然可以運行

 

在 Docker 鏡像上運行的 Docker 容器的優勢

  • 標準:Docker 創建了容器的行業標準,因此它們可以在任何地方移植
  • 輕巧:容器共享機器的作業系統內核,因此不需要每個應用程式都用作業系統,從而提高了伺服器效率,並降低了伺服器資源的消耗
  • 安全:容器中的應用程式更安全,Docker 提供業界最強大的默認隔離功能

 

Docker 的組成

 

Docker 架構圖

架構圖箭頭的意思大概是

  • 在 Docker Client 敲 Docker 命令調用 Docker API 來操作 Host 上的 Docker 服務
  • Docker 服務可以從倉庫拉鏡像到本機,也可以用本機鏡像創建一個容器並運行

 

倉庫(Registry)

  • 集中存放鏡像文件的場所
  • 每個鏡像文件有不同的標籤(不同的版本)
  • 最大的開放倉庫是Docker Hub: //hub.docker.com/ 存放了數量龐大的鏡像供用戶下載
  • 中國的公開倉庫包括阿里雲,網易雲等
  • 倉庫分為公開倉庫(public)和私有倉庫(private)兩種形式

 

鏡像(Images)

  • 創建容器的模板
  • 一個鏡像可以創建很多容器

 

容器(Containers)

  • 容器是鏡像生成的運行實例
  • Docker 利用容器獨立運行一個或一組應用(服務)
  • 每個容器之間是相互隔離的
  • 它可以被啟用、開始、停止、刪除

 

主機(HOST)

  • 一個物理機或虛擬機
  • 用於運行 Docker 守護進程和多個容器
  • 可存放多個鏡像
  • 也稱為宿主機,node節點

 

Docker 服務端(daemon)

Docker 守護進程,運行 Docker 容器

 

Docker 客戶端(client)

  • 客戶端使用 Docker 命令或其他工具調用 Docker API
  • 當然也可以在 HOST 直接敲 Docker 命令