docker 如日中天,這不是單純的炒概念,docker 確確實實解決了開發與運維的痛點,因此在企業開發中得到了非常廣泛的使用,本文對於 docker 的這些基本知識點再做一些簡單回顧。
什麼是 docker
根據 wikipedia 中的介紹:
Docker 是一個開放原始碼軟體專案,讓應用程式佈署在軟體容器下的工作可以自動化進行,藉此在 Linux 作業系統上,提供一個額外的軟體抽象層,以及作業系統層虛擬化的自動管理機制。
Docker 利用 Linux 核心中的資源分離線制,例如 cgroups ,以及 Linux 核心名字空間(name space),來建立獨立的軟體容器(containers)。這可以在單一 Linux 實體下運作,避免啟動一個虛擬機器造成的額外負擔。Linux 核心對名字空間的支援完全隔離了工作環境中應用程式的視野,包括程式樹、網路、使用者 ID 與掛載檔案系統,而核心的 cgroup 提供資源隔離,包括 CPU 、儲存器、block I/O 與網路。從 0.9 版本起,Dockers 在使用抽象虛擬是經由 libvirt 的 LXC 與 systemd - nspawn 提供介面的基礎上,開始包括 libcontainer 庫做為以自己的方式開始直接使用由 Linux 核心提供的虛擬化的設施。
依據行業分析公司“451研究”:“Dockers 是有能力打包應用程式及其虛擬容器,可以在任何 Linux 伺服器上執行的依賴性工具,這有助於實現靈活性和便攜性,應用程式在任何地方都可以執行,無論是公有云、私有云、單機等。” 。
這裡的介紹有點繞口,讓我來介紹下 docker 解決了哪些痛點:
簡化環境管理
傳統的軟體開發與釋出環境複雜,配置繁瑣,經常有讀者在微信上問:我的程式碼開發環境可以執行,一旦部署到伺服器上就執行不了了。這個問題很常見,也確實很煩人,但是問題總要解決,開發環境、測試環境、生產環境,每個環節都有可能出現這樣那樣的問題,如果能夠在各個環境中實現一鍵部署,就會方便很多,例如一鍵安裝 linux 、一鍵安裝 mysql、一鍵安裝 nginx 等,docker 徹底解決了這個問題。
虛擬化更加輕量級
說到容器,說到虛擬化,很多人總會想到虛擬機器,想到 VMware、VirtualBox 等工具,不同於這些虛擬技術,docker 虛擬化更加輕量級,傳統的虛擬機器都是先虛擬出一個作業系統,然後在作業系統上完成各種各樣的配置,這樣並不能充分的利用物理機的效能,docker 則是一種作業系統級別的虛擬技術,它執行在作業系統之上的使用者空間,所有的容器都共用一個系統核心甚至公共庫,容器引擎提供了程式級別的隔離,讓每個容器都像執行在單獨的系統之上,但是又能夠共享很多底層資源。因此 docker 更為輕量、快速和易於管理。
程式可移植
有了前面介紹的兩個特點,程式可移植就是順理成章的事情了。
docker 和虛擬機器
前面介紹了 docker 與傳統虛擬機器的差異,通過下表再來詳細瞭解下這種差異:
docker | 虛擬機器 | |
---|---|---|
相同點 | 1. 都可在不同的主機之間遷移 2. 都具備 root 許可權 3. 都可以遠端控制 4. 都有備份、回滾操作 |
|
作業系統 | 在效能上有優勢,可以輕易的執行多個作業系統 | 可以安裝任何系統,但是效能不及容器 |
原理 | 和宿主機共享核心,所有容器執行在容器引擎之上,容器並非一個完整的作業系統,所有容器共享作業系統,在程式級進行隔離 | 每一個虛擬機器都建立在虛擬的硬體之上,提供指令級的虛擬,具備一個完整的作業系統 |
優點 | 高效、集中。一個硬體節點可以執行數以百計的的容器,非常節省資源,QoS 會盡量滿足,但不保證一定滿足。核心由提供者升級,服務由服務提供者管理 | 對作業系統具有絕對許可權,對系統版本和系統升級具有完全的管理許可權。具有一整套的的資源:CPU、RAM 和磁碟。QoS 是有保證的,每一個虛擬機器就像一個真實的物理機一樣,可以實現不同的作業系統執行在同一物理節點上。 |
資源管理 | 彈性資源分配:資源可以在沒有關閉容器的情況下新增,資料卷也無需重新分配大小 | 虛擬機器需要重啟,虛擬機器裡邊的作業系統需要處理新加入的資源,如磁碟等,都需要重新分割槽。 |
遠端管理 | 根據作業系統的不同,可以通過 shell 或者遠端桌面進行 | 遠端控制由虛擬化平臺提供,可以在虛擬機器啟動之前連線 |
缺點 | 對核心沒有控制許可權,只有容器的提供者具備升級許可權。只有一個核心執行在物理節點上,幾乎不能實現不同的作業系統混合。容器提供者一般僅提供少數的幾個作業系統 | 每一臺虛擬機器都具有更大的負載,耗費更多的資源,使用者需要全權維護和管理。一臺物理機上能夠執行的虛擬機器非常有限 |
配置 | 快速,基本上是一鍵配置 | 配置時間長 |
啟動時間 | 秒級 | 分鐘級 |
硬碟使用 | MB | GB |
效能 | 接近原生態 | 弱於原生態 |
系統支援數量 | 單機支援上千個 | 一般不多於幾十個 |
docker 與傳統容器
不同與傳統容器,docker 早起基於 LXC,後來基於自研的 libContainer,docker 對於傳統容器做了許多優化,如下:
- 跨平臺的可移植性
- 面向應用
- 版本控制
- 元件複用
- 共享性
- 工具生態系統
docker 應用場景
- 加速本地開發
- 自動打包和部署應用
- 建立輕量、私有的PaaS環境
- 自動化測試和持續整合/部署
- 部署並擴充套件Web應用、資料庫和後端伺服器
- 建立安全沙盒
- 輕量級的桌面虛擬化
docker 核心元件
docker 中有三大核心元件:
- 映象
映象是一個只讀的靜態模版,它儲存了容器需要的環境和應用的執行程式碼,可以將映象看成是容器的程式碼,當程式碼執行起來之後,就成了容器,映象和容器的關係也類似於程式和程式的關係。
- 容器
容器是一個執行時環境,是映象的一個執行狀態,它是映象執行的動態表現。
- 庫
庫是一個特定的使用者儲存映象的目錄,一個使用者可以建立多個庫來儲存自己的映象。
docker相關技術
- 隔離性
- 可度量性
- 移植性
- 安全性
docker 安裝
相對而言,Linux 上安裝 Docker 是最容易的,其次是 Mac ,最後是 Windows ,Windows 因此要裝的東西比較多,官方也提供了兩個不同的安裝包,支援不同的 Windows 的不同版本,一個是針對 Win10 的安裝載入程式,還有一個是相容性較好的 Toolbox ,但是在 Windows 上執行 Docker ,後期在虛擬目錄等方面還會遇到各種問題,所以這裡鬆哥是非常不建議大家在 Windows 中安裝 Docker ,有 Mac 的上 Mac (Mac 上安裝 Docker 就像安裝普通軟體一樣),沒有 Mac 的裝 Linux 虛擬機器,再裝 Docker 即可,這裡我就先以 CentOS 上安裝 Docker 為例,來說說 Docker 安裝。
分別執行如下安裝命令:
# 首先安裝 Docker
yum -y install docker
# 然後啟動 Docker 服務
service docker start
# 測試安裝是否成功
docker -v
安裝完成後,看到如下頁面,表示安裝成功:
總結
本文主要向大家介紹了 Docker 的基本概念以及 Docker 的安裝 ,下篇文章我們向大家介紹 Docker 中基本的容器操作。有問題歡迎留言討論。
參考資料:
[1] 曾金龍,肖新華,劉清.Docker開發實踐[M].北京:人民郵電出版社,2015.
關注公眾號牧碼小子,專注於 Spring Boot+微服務以及前後端分離等全棧技術,定期視訊教程分享,關注後回覆 Java ,領取鬆哥為你精心準備的 Java 乾貨!