如果你還想從頭學起 Docker,可以看看這個系列的文章哦!
https://www.cnblogs.com/poloyy/category/1870863.html
備注
這里的概念直接引用官方的,咱們提取關鍵字信息來熟記即可
學習 Docker 前的必備知識
環境配置的煩惱
- 軟件開發最大的麻煩事之一,就是環境配置
- 相信每位編程初學者都會在環境配置上倒騰很久,而作為老師也會因為不同機器出現五花八門的環境配置問題而煩惱
- 想要軟件正常運行,那么系統的設置和各種庫、組件正確的安裝才能如期運行
- 舉例來說,安裝一個 Python 應用,計算機必須有 Python 引擎,還必須有各種依賴,可能還要配置環境變量
- 當你需要換機器的時候,你之前所配置的環境又要重頭來一遍,非常麻煩
很久以前的應用部署方式
介紹
在一個物理服務器上面安裝系統,直接部署應用
缺點
- 部署非常慢
- 成本非常高
- 資源浪費:部署的應用並不會占滿服務器資源,會有大部分的空閑資源
- 難於遷移和擴展:像上面說到的,換台服務器,環境又要重新配
- 可能會被限定硬件廠商:底層系統架構不同
虛擬化技術出現后的應用部署方式
虛擬化介紹
- 一個主機部署多個虛擬機,每個虛擬機可以部署多個應用
- 比如在 Windows 系統里面運行 Linux 系統的 VM
- 對於底層系統(主機)來說,虛擬機就是一個普通文件,不需要就刪掉,對主機沒有影響
虛擬化優點
- 資源池:一個物理機的資源分配到了不同的虛擬機
- 易擴展:添加物理主機或虛擬機
- 易雲化:阿里雲、AWS 提供虛擬化技術
虛擬化局限性
- 資源占用多:每一個虛擬機都是一個完整的操作系統,要給其分配資源,當虛擬機數量增多時,物理主機本身消耗的資源勢必增多
- 冗余步驟多:虛擬機是完整的操作系統,一些系統級別的操作步驟,往往無法跳過,比如用戶登錄
- 啟動慢:啟動操作系統需要多久,啟動虛擬機就需要多久。可能要等幾分鍾,應用程序才能真正運行
容器的基礎知識
容器為什么會出現
- 上面也講述了單機部署應用和虛擬機技術的局限性
- 容器的誕生就是為了解決這些局限性的
什么是容器
- 對應用軟件和其依賴的包進行標准化打包
- 應用之間相互隔離
- 共享同一個 OSKernel
- 可以運行在很多主流操作系統上
- 可以理解成:標准化軟件單元
容器解決了什么問題
- 解決了開發和運維之間的矛盾
- 在開發和運維之間搭建了一個橋梁,是實現 devops 的最佳解決方案
容器和虛擬機的區別
容器和虛擬機都具有相似的資源隔離和分配特點,但是功能不同,因為容器虛擬化了操作系統,而不是硬件,所以更加便攜和高效
比較點 | 容器 | VM |
抽象層 | 應用程序層的抽象,將代碼和依賴項打包在一起【容器是應用層面的隔離】 | 將一台服務器轉變為多台服務器的物理硬件層的抽象【虛擬化是物理資源層面的隔離】 |
OS內核 |
多個容器可以在同一台計算機上運行,並與其他容器共享OS內核 |
也允許多個VM在單台計算機上運行,但需要啟動單獨的虛擬機 OS |
OS數量 |
僅有一個物理機的OS,多個容器共享物理機的資源 |
多個OS(物理機一個OS,每個 VM 一個 OS),均獨享資源 |
運行數 | 一台物理機可以運行數百個容器 | 一台物理機最多可以運行十來個虛擬機 |
大小 | 容器鏡像的大小通常為幾十 MB | 包含操作系統、二進制文件、庫,至少也要幾個 GB |
啟動速度 | 可以在數秒內完成啟動 | 和物理機啟動時間一樣慢,可能要幾分鍾 |
資源利用率 | 可以處理更多的應用程序,消耗的資源比 VM 少 | |
隔離性 | 每個容器在用戶空間中作為隔離的進程運行 |
為什么 docker 比 vm 快
- docker 有着比虛擬機更少的抽象層
- docker 不需要 Hypervisor 實現硬件資源虛擬化
- 運行在 docker 容器上的程序直接使用的都是實際物理機的硬件資源
HostOS 和 GuestOS 的區別
- GuestOS:VM(虛擬機)里的系統
- HostOS:物理機里的系統
虛擬化 + 容器
- 其實就是 一台物理機上部署多個 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 實現 DevOps(開發、運維)
- 應用更快速的交付和部署,打包鏡像發布測試,一鍵運行,不再需要寫大量幫助文檔,安裝程序
- 更便捷的升級和擴縮容,部署應用就像搭積木一樣方便
- 更簡單的系統運維,開發和測試的環境高度一致
- 更搞笑的計算資源利用,內核級別的虛擬化,可以在一個物理機上運行很多個容器實例,服務器性能可以被壓榨到極致
Docker 架構
架構圖箭頭的意思大概是
- 在 Docker Client 敲 Docker 命令調用 Docker API 來操作 Host 上的 Docker 服務
- Docker 服務可以從倉庫拉鏡像到本機,也可以用本機鏡像創建一個容器並運行
倉庫(Registry)
- 集中存放鏡像文件的場所
- 每個鏡像文件有不同的標簽(不同的版本)
- 最大的開放倉庫是Docker Hub: https://hub.docker.com/ 存放了數量龐大的鏡像供用戶下載
- 國內的公開倉庫包括阿里雲,網易雲等
- 倉庫分為公開倉庫( public )和私有倉庫( private )兩種形式
鏡像(Images)
- 創建容器的模板
- 一個鏡像可以創建很多容器
容器(Containers)
- 容器是鏡像生成的運行實例
- Docker 利用容器獨立運行一個或一組應用(服務)
- 每個容器之間是相互隔離的
- 它可以被啟用、開始、停止、刪除
主機(HOST)
- 一個物理機或虛擬機
- 用於運行 Docker 守護進程和多個容器
- 可存放多個鏡像
- 也稱為宿主機,node節點
Docker 守護程序(daemon)
- 監聽 Docker API 請求
- 也會管理 Docker 對象,如:鏡像、容器、網絡、卷
- 守護程序還可以與其他守護程序通信以管理 Docker 服務
Docker 客戶端(client)
- 客戶端使用 Docker 命令或其他工具調用 Docker API
- 當然也可以在 HOST 直接敲 Docker 命令
- 客戶端可以與多個 Docker 守護程序通信