| 我的GitHub | 我的博客 | 我的微信 | 我的郵箱 |
|---|---|---|---|
| baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com |
目錄
Docker 簡介
- Docker 官方主頁
- Docker 官方博客
- Docker 官方文檔
- Docker Store
- Docker Cloud
- Docker Hub
- Docker 的源代碼倉庫
- Docker 發布版本歷史
- Docker 常見問題
- Docker 遠端應用 API
什么是容器
Docker 是世界領先的軟件容器平台,所以想要搞懂 Docker 的概念我們必須先從容器開始說起。
官方的解釋
一句話概括容器:容器就是將軟件打包成標准化單元,以用於開發、交付和部署。
- 容器鏡像是輕量的、可執行的獨立軟件包,包含軟件運行所需的所有內容:代碼、運行時環境、系統工具、系統庫和設置。
- 容器化軟件適用於基於 Linux 和 Windows 的應用,在任何環境中都能夠始終如一地運行。
- 容器賦予了軟件獨立性,使其免受外在環境差異的影響,從而有助於減少團隊間在相同基礎設施上運行不同軟件時的沖突。
通俗的解釋
容器就是一個存放東西的地方,就像書包可以裝各種文具、衣櫃可以放各種衣服、鞋架可以放各種鞋子一樣。我們現在所說的容器存放的東西可能更偏向於應用,比如網站、程序甚至是系統環境。

Docker 的一些概念
什么是 Docker
- Docker 是世界領先的
軟件容器平台。 - Docker 使用 Google 公司推出的 Go 語言 進行開發實現,基於
Linux 內核提供的CGroup功能和name space來實現的,以及 AUFS 類的UnionFS等技術,對進程進行封裝隔離,屬於操作系統層面的虛擬化技術。由於隔離的進程獨立於宿主和其它的隔離的進程,因此也稱其為容器。 Docker 能夠自動執行重復性任務,例如搭建和配置開發環境,從而解放了開發人員以便他們專注在真正重要的事情上:構建傑出的軟件。- 用戶可以方便地創建和使用容器,把自己的應用放入容器。容器還可以進行版本管理、復制、分享、修改,就像管理普通的代碼一樣。
Docker 思想
- 集裝箱
- 標准化: ① 運輸方式 ② 存儲方式 ③ API 接口
- 隔離
Docker 容器的特點
輕量
在一台機器上運行的多個 Docker 容器可以共享這台機器的操作系統內核;它們能夠迅速啟動,只需占用很少的計算和內存資源。鏡像是通過文件系統層進行構造的,並共享一些公共文件。這樣就能盡量降低磁盤用量,並能更快地下載鏡像。
標准
Docker 容器基於開放式標准,能夠在所有主流 Linux 版本、Microsoft Windows 以及包括 VM、裸機服務器和雲在內的任何基礎設施上運行。
安全
Docker 賦予應用的隔離性不僅限於彼此隔離,還獨立於底層的基礎設施。Docker 默認提供最強的隔離,因此應用出現問題,也只是單個容器的問題,而不會波及到整台機器。
為什么要用 Docker
- 一致的運行環境:Docker 的鏡像提供了
除內核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現 “這段代碼在我機器上沒問題啊” 這類問題 - 更快速的啟動時間:可以做到秒級、甚至毫秒級的啟動時間。大大的節約了開發、測試、部署的時間
- 隔離性:避免公用的服務器,資源會容易受到其他用戶的影響
- 彈性伸縮,快速擴展:善於處理集中爆發的服務器使用壓力
- 遷移方便:可以很輕易的將在一個平台上運行的應用,遷移到另一個平台上,而不用擔心運行環境的變化導致應用無法正常運行的情況
- 持續交付和部署:使用 Docker 可以通過定制應用鏡像來實現持續集成、持續交付、部署
容器 VS 虛擬機
每當說起容器,我們不得不將其與虛擬機做一個比較。就我而言,對於兩者無所謂誰會取代誰,而是兩者可以和諧共存。
簡單來說: 容器和虛擬機具有相似的資源隔離和分配優勢,但功能有所不同,因為容器虛擬化的是操作系統,而不是硬件,容器之間是共享同一套操作系統資源的,因此容器更容易移植,效率也更高。
兩者對比圖
傳統虛擬機技術是虛擬出一套硬件后,在其上運行一個完整操作系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行於宿主的內核,容器內沒有自己的內核,而且也沒有進行硬件虛擬。因此容器要比傳統虛擬機更為輕便.

容器與虛擬機總結

- 容器是一個
應用層抽象,用於將代碼和依賴資源打包在一起。多個容器可以在同一台機器上運行,共享操作系統內核,但各自作為獨立的進程在用戶空間中運行。與虛擬機相比,容器占用的空間較少(容器鏡像大小通常只有幾十兆),瞬間就能完成啟動。 - 虛擬機 (VM) 是一個
物理硬件層抽象,用於將一台服務器變成多台服務器。管理程序允許多個 VM 在一台機器上運行。每個 VM 都包含一整套操作系統、一個或多個應用、必要的二進制文件和庫資源,因此占用大量空間。而且 VM 啟動也十分緩慢。
通過 Docker 官網,我們知道了這么多 Docker 的優勢,但是大家也沒有必要完全否定虛擬機技術,因為兩者有不同的使用場景。虛擬機更擅長於徹底隔離整個運行環境。例如,雲服務提供商通常采用虛擬機技術隔離不同的用戶。而Docker 通常用於隔離不同的應用,例如前端,后端以及數據庫。
就我而言,對於兩者無所謂誰會取代誰,而是兩者可以和諧共存。
Build Ship and Run
如果你搜索 Docker 官網,會發現如下的字樣:Docker - Build, Ship, and Run Any App, Anywhere。那么 Build, Ship, and Run 到底是在干什么呢?

- Build 構建鏡像: 鏡像就像是集裝箱包括文件以及運行環境等等資源
- Ship 運輸鏡像:主機和倉庫間運輸,這里的倉庫就像是超級碼頭一樣
- Run 運行鏡像:運行的鏡像就是一個容器,
容器就是運行程序的地方
Docker 運行過程也就是去倉庫把鏡像拉到本地,然后用一條命令把鏡像運行起來變成容器。所以,我們也常常將 Docker 稱為碼頭工人或碼頭裝卸工,這和 Docker 的中文翻譯搬運工人如出一轍。
Docker 底層原理
虛擬化技術
簡單點來說,虛擬化技術可以這樣定義:
虛擬化技術是一種資源管理技術,是將計算機的各種實體資源,如CPU、內存、磁盤空間、網絡適配器等,予以抽象、轉換后呈現出來並可供分割、組合為一個或多個電腦配置環境。由此,打破實體結構間的不可切割的障礙,使用戶可以比原本的配置更好的方式來應用這些電腦硬件資源。這些資源的新虛擬部分是不受現有資源的架設方式,地域或物理配置所限制。一般所指的虛擬化資源包括計算能力和數據存儲。
Docker 原理
Docker 技術是基於 LXC 虛擬容器技術的。
LXC,其名稱來自 Linux 軟件容器Linux Containers的縮寫,一種操作系統層虛擬化(Operating system–level virtualization)技術,為 Linux 內核容器功能的一個用戶空間接口。它將應用軟件系統打包成一個軟件容器(Container),內含應用軟件本身的代碼,以及所需要的操作系統核心和庫。通過統一的名字空間和共用 API 來分配不同軟件容器的可用硬件資源,創造出應用程序的獨立沙箱運行環境,使得 Linux 用戶可以容易的創建和管理系統或應用容器。
LXC 技術主要是借助 Linux 內核中提供的 CGroup 功能和 name space 來實現的,通過 LXC 可以為軟件提供一個獨立的操作系統運行環境。
cgroup 和 namespace
namespace 是 Linux 內核用來隔離內核資源的方式。通過 namespace 可以讓一些進程只能看到與自己相關的一部分資源,進程之間根本就感覺不到對方的存在。具體的實現方式是把一個或多個進程的相關資源指定在同一個 namespace 中。Linux namespaces 是對全局系統資源的一種封裝隔離,使得處於不同 namespace 的進程擁有獨立的全局系統資源,改變一個 namespace 中的系統資源只會影響當前 namespace 里的進程,對其他 namespace 中的進程沒有影響。
CGroup 是 Control Groups 的縮寫,是 Linux 內核提供的一種可以限制、記錄、隔離進程組(process groups) 所使用的物理資源(如 cpu memory i/o 等等) 的機制。
cgroup 和 namespace 兩者對比:
兩者都是將進程進行分組,但是兩者的作用還是有本質區別。namespace 是為了隔離進程組之間的資源,而 cgroup 是為了對一組進程進行統一的資源監控和限制。
Docker 的三個基本概念
Docker 中有非常重要的三個基本概念,理解了這三個概念,就理解了 Docker 的整個生命周期。
- 鏡像
Image:一個特殊的文件系統 - 容器
Container:鏡像運行時的實體 - 倉庫
Repository:集中存放鏡像文件的地方
理解了這三個概念,就理解了 Docker 的整個生命周期
鏡像:一個特殊的文件系統
操作系統分為內核和用戶空間。對於 Linux 而言,內核啟動后,會掛載 root 文件系統為其提供用戶空間支持。而 Docker 鏡像(Image),就相當於是一個 root 文件系統。
Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時准備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之后也不會被改變。
Docker 設計時,就充分利用Union FS的技術,將其設計為分層存儲的架構。鏡像實際是由多層文件系統聯合組成。
鏡像構建時,會一層層構建,前一層是后一層的基礎。每一層構建完就不會再發生改變,后一層上的任何改變只發生在自己這一層。
比如,刪除前一層文件的操作,實際不是真的刪除前一層的文件,而是僅在當前層標記為該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像。因此,在構建鏡像的時候,需要額外小心,每一層盡量只包含該層需要添加的東西,任何額外的東西應該在該層構建結束前清理掉。
分層存儲的特征還使得鏡像的復用、定制變的更為容易。甚至可以用之前構建好的鏡像作為基礎層,然后進一步添加新的層,以定制自己所需的內容,構建新的鏡像。
容器:鏡像運行時的實體
鏡像(Image)和容器(Container)的關系,就像是面向對象程序設計中的 類 和 實例 一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。
容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行於屬於自己的獨立的 命名空間。前面講過鏡像使用的是分層存儲,容器也是如此。
容器存儲層的生存周期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此,任何保存於容器存儲層的信息都會隨容器刪除而丟失。
按照 Docker 最佳實踐的要求,容器不應該向其存儲層內寫入任何數據 ,容器存儲層要保持無狀態化。所有的文件寫入操作,都應該使用數據卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。數據卷的生存周期獨立於容器,容器消亡,數據卷不會消亡。因此,使用數據卷后,容器可以隨意刪除、重新 run ,數據卻不會丟失。
倉庫:集中存放鏡像文件的地方
鏡像構建完成后,可以很容易的在當前宿主上運行,但是,如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry就是這樣的服務。
一個 Docker Registry 中可以包含多個倉庫Repository;每個倉庫可以包含多個標簽(Tag);每個標簽對應一個鏡像。所以說:鏡像倉庫是 Docker 用來集中存放鏡像文件的地方,類似於我們之前常用的代碼倉庫。
通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標簽就常用於對應該軟件的各個版本。我們可以通過<倉庫名>:<標簽>的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標簽,將以 latest 作為默認標簽.。
這里補充一下 Docker Registry 公開服務和私有 Docker Registry 的概念:
Docker Registry 公開服務 是開放給用戶使用、允許用戶管理鏡像的 Registry 服務。一般這類公開服務允許用戶免費上傳、下載公開的鏡像,並可能提供收費服務供用戶管理私有鏡像。
最常使用的 Registry 公開服務是官方的Docker Hub,這也是默認的 Registry,並擁有大量的高質量的官方鏡像。
在 Docker Hub 的搜索結果中,有幾項關鍵的信息有助於我們選擇合適的鏡像:
- OFFICIAL Image :代表鏡像為 Docker 官方提供和維護,相對來說穩定性和安全性較高。
- Stars :和點贊差不多的意思,類似 GitHub 的 Star。
- Dowloads :代表鏡像被拉取的次數,基本上能夠表示鏡像被使用的頻度。
當然,除了直接通過 Docker Hub 網站搜索鏡像這種方式外,我們還可以通過 docker search 這個命令搜索 Docker Hub 中的鏡像,搜索的結果是一致的。
在國內訪問Docker Hub可能會比較慢,國內也有一些雲服務商提供類似於Docker Hub的公開服務。
除了使用公開服務外,用戶還可以在 本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry 鏡像,可以直接使用做為私有 Registry 服務。開源的 Docker Registry 鏡像只提供了 Docker Registry API 的服務端實現,足以支持 docker 命令,不影響使用。但不包含圖形界面,以及鏡像維護、用戶管理、訪問控制等高級功能。
Docker 和 K8S
Docker
2010年,幾個搞IT的年輕人,在美國舊金山成立了一家名叫dotCloud的公司。
這家公司主要提供基於PaaS的雲計算技術服務。具體來說,是和LXC有關的容器技術。
LXC,就是Linux容器虛擬技術Linux container
后來,dotCloud公司將自己的容器技術進行了簡化和標准化,並命名為——Docker。
Docker技術誕生之后,並沒有引起行業的關注。而dotCloud公司,作為一家小型創業企業,在激烈的競爭之下,也步履維艱。
正當他們快要堅持不下去的時候,腦子里蹦出了"開源"的想法。
什么是"開源"?開源,就是開放源代碼。也就是將原來內部保密的程序源代碼開放給所有人,然后讓大家一起參與進來,貢獻代碼和意見。
有的軟件是一開始就開源的。也有的軟件,是混不下去,創造者又不想放棄,所以選擇開源。自己養不活,就吃"百家飯"嘛。
2013年3月,dotCloud公司的創始人之一,Docker之父,28歲的Solomon Hykes正式決定,將Docker項目開源。

不開則已,一開驚人。
越來越多的IT工程師發現了Docker的優點,然后蜂擁而至,加入Docker開源社區。
Docker的人氣迅速攀升,速度之快,令人瞠目結舌。
開源當月,Docker 0.1 版本發布。此后的每一個月,Docker都會發布一個版本。到2014年6月9日,Docker 1.0 版本正式發布。
此時的Docker,已經成為行業里人氣最火爆的開源技術,沒有之一。甚至像Google、微軟、Amazon、VMware這樣的巨頭,都對它青睞有加,表示將全力支持。
Docker火了之后,dotCloud公司干脆把公司名字也改成了Docker Inc.。
Docker和容器技術為什么會這么火爆?說白了,就是因為它"輕"。
在容器技術之前,業界的網紅是虛擬機。虛擬機技術的代表,是VMWare和OpenStack。
相信很多人都用過虛擬機。虛擬機,就是在你的操作系統里面,裝一個軟件,然后通過這個軟件,再模擬一台甚至多台"子電腦"出來。
在"子電腦"里,你可以和正常電腦一樣運行程序,例如開QQ。如果你願意,你可以變出好幾個"子電腦",里面都開上QQ。"子電腦"和"子電腦"之間,是相互隔離的,互不影響。
虛擬機屬於虛擬化技術。而Docker這樣的容器技術,也是虛擬化技術,屬於輕量級的虛擬化。
虛擬機雖然可以隔離出很多"子電腦",但占用空間更大,啟動更慢,虛擬機軟件可能還要花錢(例如VMWare)。
而容器技術恰好沒有這些缺點。它不需要虛擬出整個操作系統,只需要虛擬一個小規模的環境(類似"沙箱")。
它啟動時間很快,幾秒鍾就能完成。而且,它對資源的利用率很高(一台主機可以同時運行幾千個Docker容器)。此外,它占的空間很小,虛擬機一般要幾GB到幾十GB的空間,而容器只需要MB級甚至KB級。
容器和虛擬機的對比

正因為如此,容器技術受到了熱烈的歡迎和追捧,發展迅速。
我們具體來看看Docker。
大家需要注意,Docker本身並不是容器,它是創建容器的工具,是應用容器引擎。
想要搞懂Docker,其實看它的兩句口號就行。
第一句,是Build, Ship and Run。
也就是,搭建、發送、運行,三板斧。
舉個例子:
我來到一片空地,想建個房子,於是我搬石頭、砍木頭、畫圖紙,一頓操作,終於把這個房子蓋好了。
結果,我住了一段時間,想搬到另一片空地去。這時候,按以往的辦法,我只能再次搬石頭、砍木頭、畫圖紙、蓋房子。
但是,跑來一個老巫婆,教會我一種魔法。
這種魔法,可以把我蓋好的房子復制一份,做成鏡像,放在我的背包里。
等我到了另一片空地,就用這個"鏡像",復制一套房子,擺在那邊,拎包入住。
怎么樣?是不是很神奇?
所以,Docker 的第二句口號就是:Build once,Run anywhere。搭建一次,到處能用)。
Docker技術的三大核心概念,分別是:
- 鏡像
Image:例如為知筆記鏡像 - 容器
Container:Docker 是創建容器的工具,是應用容器引擎 - 倉庫
Repository:例如 Docker Hub
我剛才例子里面,那個放在包里的"鏡像",就是Docker鏡像。而我的背包,就是Docker倉庫。我在空地上,用魔法造好的房子,就是一個Docker容器。
說白了,這個Docker鏡像,是一個特殊的文件系統。它除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時准備的一些配置參數(例如環境變量)。鏡像不包含任何動態數據,其內容在構建之后也不會被改變。
也就是說,每次變出房子,房子是一樣的,但生活用品之類的,都是不管的。誰住誰負責添置。
每一個鏡像可以變出一種房子。那么,我可以有多個鏡像呀!
也就是說,我蓋了一個歐式別墅,生成了鏡像。另一個哥們可能蓋了一個中國四合院,也生成了鏡像。還有哥們,蓋了一個非洲茅草屋,也生成了鏡像。。。
這么一來,我們可以交換鏡像,你用我的,我用你的,豈不是很爽?
於是乎,就變成了一個大的公共倉庫。
負責對Docker鏡像進行管理的,是Docker Registry服務(類似倉庫管理員)。
不是任何人建的任何鏡像都是合法的。萬一有人蓋了一個有問題的房子呢?
所以,Docker Registry服務對鏡像的管理是非常嚴格的。
最常使用的Registry公開服務,是官方的Docker Hub,這也是默認的 Registry,並擁有大量的高質量的官方鏡像。
K8S
好了,說完了Docker,我們再把目光轉向K8S。
就在Docker容器技術被炒得熱火朝天之時,大家發現,如果想要將Docker應用於具體的業務實現,是存在困難的——編排、管理和調度等各個方面,都不容易。於是,人們迫切需要一套管理系統,對Docker及容器進行更高級更靈活的管理。
就在這個時候,K8S出現了。
K8S,就是基於容器的集群管理平台,它的全稱,是kubernetes。
Kubernetes 這個單詞來自於希臘語,含義是舵手或領航員。K8S是它的縮寫,用"8"字替代了"ubernete"這8個字符。
和Docker不同,K8S的創造者,是眾人皆知的行業巨頭——Google。
然而,K8S並不是一件全新的發明。它的前身,是Google自己搗鼓了十多年的Borg系統。
K8S是2014年6月由Google公司正式公布出來並宣布開源的。
同年7月,微軟、Red Hat、IBM、Docker、CoreOS、 Mesosphere和Saltstack 等公司,相繼加入K8S。
之后的一年內,VMware、HP、Intel等公司,也陸續加入。
2015年7月,Google正式加入OpenStack基金會。與此同時,Kuberentes v1.0正式發布。
目前,kubernetes的版本已經發展到V1.13。
2020-06-18
