前言:
都2021年了,你還在為了安裝一個開發或者部署環境、軟體而花費半天的時間嗎?你還在解決開發環境能夠正常訪問,而釋出測試環境無法正常訪問的問題嗎?你還在為持續整合和持續交付(CI / CD)工作流程苦惱嗎?那還在猶豫是什麼,Docker能夠完美的解決你遇到這所有的問題。
Docker是什麼?
Docker 是一個開源的應用容器引擎,基於 Golang 語言開發,可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後釋出到任何流行的 Linux 伺服器。容器是一個沙箱機制,相互之間不會有影響(類似於我們手機上執行的 app),並且容器開銷是很低的。
Docker 是一個供開發人員和系統管理員構建、執行和與容器共享應用程式的平臺。使用容器部署應用程式稱為容器化。容器並不是新事物,但它們用於輕鬆部署應用程式卻是新鮮的。
注意:Docker並非是一個通用的容器工具,它依賴於已存在並執行的Linux核心環境。
Docker的優勢有哪些?
- 靈活性:即使是最複雜的應用程式也可以容器化。
- 輕量級:容器利用並共享主機核心,使它們在系統資源方面比虛擬機器更有效率。
- 可移植:您可以在本地構建,部署到雲上,並在任何地方執行。
- 鬆耦合:容器是高度自給自足和封裝的,允許您在不影響其他容器的情況下替換或升級其中一個。
- 可擴充套件:您可以跨資料中心增加和自動分發容器副本。
- 安全性:容器對程式應用主動約束和隔離,而不需要使用者進行任何配置。
Docker的作用?
Docker 是一個用於開發、傳送和執行應用程式的開放平臺。Docker 使您能夠將應用程式與基礎設施分開,以便您可以快速交付軟體。使用 Docker,您可以像管理應用程式一樣管理基礎設施。通過利用 Docker 的快速交付、測試和部署程式碼的方法,您可以顯著減少編寫程式碼和在生產中執行程式碼之間的延遲。Docker(opens new window)是個劃時代的開源專案,它徹底釋放了計算虛擬化的威力,極大提高了應用的維護效率,降低了雲端計算應用開發的成本!使用 Docker,可以讓應用的部署、測試和分發都變得前所未有的高效和輕鬆!無論是應用開發者、運維人員、還是其他資訊科技從業人員,都有必要認識和掌握 Docker,節約有限的生命。
Docker主要用來解決什麼問題?
Docker的出現主要就是為了解決:在我的機器上執行時是正常的,但為什麼到你的機器上就執行不正常了。
比如你寫一個Web應用,並且本地除錯沒有任何問題。這時候你想發給你的朋友試試看或者釋出部署到遠端的雲伺服器上檢視效果,那麼首先你需要配置和你本地相同的軟體環境,如資料庫,Web伺服器(IIS,Tomcat,Nginx),必要的外掛,庫等等。而這你還不能保證的你的軟體一定能夠執行起來,因為別人可能用完全不同的作業系統,即便是使用Linux每種發行版也會有微小的區別。
為了模擬完全相同的本地開發環境。
我們首先想到的就是虛擬機器,但是虛擬機器需要模擬硬體,執行整個作業系統不但體積臃腫記憶體佔用高,程式的效能也會受到影響。
如下圖是比較常用的虛擬機器:
Docker的脫穎而出:
這時候Dokcer就派上了用場,Docker在概念上與虛擬機器非常類似。但是Docker更輕量,它不會去模擬底層的硬體 ,只會為每一個應用提供完全隔離的執行環境。你可以在容器中配置不同的應用環境,並且不用的環境之間互相不影響,這個“環境”在Docker中也被稱作為Container(容器)。
Docker和虛擬機器技術的區別?
Docker 在容器的基礎上,進行了進一步的封裝,從檔案系統、網路互聯到程式隔離等等,極大的簡化了容器的建立和維護。使得 Docker
技術比虛擬機器技術更為輕便、快捷。
下面的圖片比較了 Docker 和傳統虛擬化方式的不同之處。傳統虛擬機器技術是虛擬出一套硬體後,在其上執行一個完整作業系統,在該系統上再執行所需應用程式;而容器內的應用程式直接執行於宿主的核心,容器內沒有自己的核心,而且也沒有進行硬體虛擬。因此容器要比傳統虛擬機器更為輕便。
如果想詳細瞭解,可以參考文章:docker與虛擬機器的區別?
Docker容器和虛擬機器的區別總結:
特性 |
docker容器 |
虛擬機器 |
啟動 |
秒級 |
分鐘級 |
硬碟使用 |
一般為MB |
一般為GB |
效能 |
接近原生(宿主機) |
弱於原生 |
系統支援量 |
單機支援上千個容器 |
一般幾十個 |
Docker中的三個重要概念
Docker中的三個重要概念分別是:Image(映象),Container(容器),Repository(倉儲)。
Image(映象)一個特殊的檔案系統
你可以把它理解成一個虛擬機器的快照(Snapshot),裡面包含了你要部署的應用程式以及它所關聯的所有庫。
作業系統分為核心和使用者空間。對於Linux而言,核心啟動後,會掛載root檔案系統為其提供使用者空間支援。而Docker映象(Image),就相當於是一個root檔案系統。Docker映象是一個特殊的檔案系統,除了提供容器執行時所需的程式、庫、資源、配置等檔案外,還包含了一些為執行時準備的一些配置引數(如匿名卷、環境變數、使用者等)。 映象不包含任何動態資料,其內容在構建之後也不會被改變。
Container(容器)映象執行時的實體
這裡的容器就像是一臺臺執行起來的虛擬機器,裡面執行了你的應用程式,每個容器是獨立執行的他們相互之間不影響。通過一個映象,我們可以建立許多個不同的Container容器。
映象(Image)和容器(Container)的關係,就像是物件導向程式設計中的類和類的例項一樣,映象是靜態的定義,容器是映象執行時的實體。容器可以被建立、啟動、停止、刪除、暫停等 。容器的實質是程式,但與直接在宿主執行的程式不同,容器程式執行於屬於自己的獨立的名稱空間。前面講過映象使用的是分層儲存,容器也是如此。容器儲存層的生存週期和容器一樣,容器消亡時,容器儲存層也隨之消亡。因此,任何儲存於容器儲存層的資訊都會隨容器刪除而丟失。
Repository(倉儲)集中存放映象檔案的地方
映象構建完成後,可以很容易的在當前宿主上執行,但是, 如果需要在其它伺服器上使用這個映象,我們就需要一個集中的儲存、分發映象的服務(就像Git倉庫一樣),Docker Registry就是這樣的服務。
一個Docker Registry中可以包含多個倉庫(Repository),每個倉庫可以包含多個標籤(Tag),每個標籤對應一個映象。所以說:映象倉庫是Docker用來集中存放映象檔案的地方類似於我們之前常用的程式碼倉庫。通常,一個倉庫會包含同一個軟體不同版本的映象,而標籤就常用於對應該軟體的各個版本 。我們可以通過<倉庫名>:<標籤>的格式來指定具體是這個軟體哪個版本的映象。如果不給出標籤,將以latest作為預設標籤。
Docker 架構及工作原理
Docker使用客戶端-伺服器架構。Docker 客戶端與 Docker 守護程式通訊,後者負責構建、執行和分發Docker容器等繁重的工作。Docker 客戶端和守護程式可以執行在同一個系統上,或者您可以將一個 Docker 客戶端連線到一個遠端 Docker 守護程式。Docker 客戶端和守護程式通過 UNIX 套接字或網路介面使用 REST API 進行通訊。
Dockerfile(自動化指令碼)
主要是用來建立我們之間講到的映象,這個過程就好比我們在虛擬機器中安裝作業系統和軟體一樣,只不過是通過Dockerfile這個自動化指令碼完成的。
Dockerfile詳解教程文章:Dockerfile製作自己的映象檔案?
Docker管理工具
Portainer(推薦)
介紹:Portainer是一個開源的、輕量級的Docker環境管理UI(是Web應用的形式),可以用來管理Docker宿主機和docker swarm叢集。
Github 上專案地址:https://github.com/portainer/portainer
支援的系統:Linux, Mac OS X, Windows。
功能特性:
- 管理倉庫、網路、資料卷、金鑰、映象、容器
- 管理你的配置,例如告警、監控
- 支援容器的健康檢查
- 容器的啟動、停止、恢復、刪除
- 檢查容器、檢視容器日誌、視覺化狀態檢視
- 進入容器控制檯
- 可以新增擴充套件
- 有一套 RBAC 基於角色的許可權控制系統
DockStation
介紹:DockStation是一個免費的、以開發人員為中心的用於管理基於 Docker的桌面應用程式。您可以僅使用 GUI 來監控、配置和管理服務和容器,而不是大量的 CLI 命令。
Github地址:https://github.com/DockStation/dockstation
支援的系統:Linux, Mac, Windows
功能特性:
- 可以非常方便的操作 Docker 和 DockerCompose。
- 可以幫助我們管理容器、Service服務(本地遠端都可以),並監控他們
- 可以輕鬆跟蹤 CPU、記憶體、網路、磁碟I/O、開放埠
- 可以把常用的操作組織成一個專案,通過專案的方式來檢查容器狀態,以圖形化的方式管理。
Docker Desktop
介紹:Docker Desktop 是一款易於安裝的應用程式,使您能夠構建和共享容器化應用程式和微服務。
官網地址:https://www.docker.com/products/docker-desktop
支援的系統:Mac, Windows
功能特性:
- 能夠以多種語言和框架在任何雲平臺上容器化和共享任何應用程式
- 輕鬆安裝和設定完整的 Docker 開發環境
- 包括最新版本的 Kubernetes
- 自動更新,讓您保持最新狀態和安全
- 在 Windows 上,能夠在 Linux 和 Windows Server 環境之間切換以構建應用程式
- 使用本機 Windows Hyper-V 虛擬化實現快速可靠的效能
- 能夠通過 Windows 機器上的 WSL 2 在 Linux 上本地工作
- 程式碼和資料的卷安裝,包括檔案更改通知和輕鬆訪問本地主機網路上執行的容器
- 使用支援的 IDE 進行容器內開發和除錯
參考文章: