docker 如日中天,這不是單純的炒概念,docker 確確實實解決了開發與運維的痛點,所以在企業開發中獲得了很是普遍的使用,本文對於 docker 的這些基本知識點再作一些簡單回顧。mysql
<!--more-->linux
根據 wikipedia 中的介紹:nginx
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 解決了哪些痛點:sql
傳統的軟件開發與發佈環境複雜,配置繁瑣,常常有讀者在微信上問:個人代碼開發環境能夠運行,一旦部署到服務器上就運行不了了。這個問題很常見,也確實很煩人,可是問題總要解決,開發環境、測試環境、生產環境,每一個環節都有可能出現這樣那樣的問題,若是可以在各個環境中實現一鍵部署,就會方便不少,例如一鍵安裝 linux 、一鍵安裝 mysql、一鍵安裝 nginx 等,docker 完全解決了這個問題。docker
說到容器,說到虛擬化,不少人總會想到虛擬機,想到 VMware、VirtualBox 等工具,不一樣於這些虛擬技術,docker 虛擬化更加輕量級,傳統的虛擬機都是先虛擬出一個操做系統,而後在操做系統上完成各類各樣的配置,這樣並不能充分的利用物理機的性能,docker 則是一種操做系統級別的虛擬技術,它運行在操做系統之上的用戶空間,全部的容器都共用一個系統內核甚至公共庫,容器引擎提供了進程級別的隔離,讓每一個容器都像運行在單獨的系統之上,可是又可以共享不少底層資源。所以 docker 更爲輕量、快速和易於管理。shell
有了前面介紹的兩個特色,程序可移植就是瓜熟蒂落的事情了。數據庫
前面介紹了 docker 與傳統虛擬機的差別,經過下表再來詳細瞭解下這種差別: 後端
||docker|虛擬機|
|:--|:---|:--|
|相同點|1. 均可在不一樣的主機之間遷移<br/>2. 都具有 root 權限<br/>3. 均可以遠程控制<br/>4. 都有備份、回滾操做<br/>|
|操做系統|在性能上有優點,能夠輕易的運行多個操做系統|能夠安裝任何系統,可是性能不及容器|
|原理|和宿主機共享內核,全部容器運行在容器引擎之上,容器並不是一個完整的操做系統,全部容器共享操做系統,在進程級進行隔離|每個虛擬機都創建在虛擬的硬件之上,提供指令級的虛擬,具有一個完整的操做系統|
|優勢|高效、集中。一個硬件節點能夠運行數以百計的的容器,很是節省資源,QoS 會盡可能知足,但不保證必定知足。內核由提供者升級,服務由服務提供者管理|對操做系統具備絕對權限,對系統版本和系統升級具備徹底的管理權限。具備一整套的的資源:CPU、RAM 和磁盤。QoS 是有保證的,每個虛擬機就像一個真實的物理機同樣,能夠實現不一樣的操做系統運行在同一物理節點上。|
|資源管理|彈性資源分配:資源能夠在沒有關閉容器的狀況下添加,數據卷也無需從新分配大小|虛擬機須要重啓,虛擬機裏邊的操做系統須要處理新加入的資源,如磁盤等,都須要從新分區。|
|遠程管理|根據操做系統的不一樣,能夠經過 shell 或者遠程桌面進行|遠程控制由虛擬化平臺提供,能夠在虛擬機啓動以前鏈接|
|缺點|對內核沒有控制權限,只有容器的提供者具有升級權限。只有一個內核運行在物理節點上,幾乎不能實現不一樣的操做系統混合。容器提供者通常僅提供少數的幾個操做系統|每一臺虛擬機都具備更大的負載,耗費更多的資源,用戶須要全權維護和管理。一臺物理機上可以運行的虛擬機很是有限|
|配置|快速,基本上是一鍵配置|配置時間長|
|啓動時間|秒級|分鐘級|
|硬盤使用|MB|GB|
|性能|接近原生態|弱於原生態|
|系統支持數量|單機支持上千個|通常很少於幾十個|安全
不一樣與傳統容器,docker 早起基於 LXC,後來基於自研的 libContainer,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 乾貨!