Docker的前世今生

學(xué)習(xí)K8S之前,需要先了解Docker

Docker歷史

2010 年,幾個(gè)搞 IT 的年輕人,在美國舊金山成立了一家名叫 dotCloud 的公司。dotCloud 的平臺(tái)即服務(wù)(Platform-as-a-Service, PaaS)提供商。底層技術(shù)上,dotCloud 平臺(tái)利用了 Linux 的 LXC 容器技術(shù)。


Docker logo

為了方便創(chuàng)建和管理這些容器,dotCloud 基于 Google 公司推出的 Go 語言開發(fā)了一套內(nèi)部工具,之后被命名為 Docker。Docker 就是這樣誕生的。

LXC 是 Docker 的底層基石,但是在 Docker 0.9 版本的時(shí)候,Docker 見異思遷了,引入了基于 Go 語言構(gòu)建的 Libcontainer 的 execution driver。有了 Libcontainer 這個(gè)項(xiàng)目,Docker 不再需要依賴于 Linux 部件(LXC,libvirt,systemd-nspawn...)就可以處理 namespaces、control groups、capabilities、apparmor profiles、network interfaces。這下,LXC 淪為可選項(xiàng)。

在 Docker 1.8 中 LXC 被 deprecated,在 Docker 1.10,LXC 徹底出局。Docker 推出 Libcontainer 自己集成了 Linux 內(nèi)核中的很多特性,作為一個(gè)獨(dú)特、穩(wěn)定且不受制于 Linux 的 Library,獨(dú)立的時(shí)代終于到來了。

Docker logo變遷

如同 Docker 的 Logo 一樣,Docker 的思想來源于集裝箱。集裝箱解決了什么問題?在一艘大船上,可以把貨物規(guī)整的擺放起來,并且各種各樣的貨物被集裝箱標(biāo)準(zhǔn)化,集裝箱與集裝箱之間互不影響。那么就不需要專門運(yùn)送水果的船和專門運(yùn)送化學(xué)用品的船了。只要這些貨物封裝在不同的集裝箱里,就可以用一艘大船把它們都運(yùn)走。

Docker 技術(shù)誕生之后,并沒有引起行業(yè)的關(guān)注。而 dotCloud 公司,作為一家小型創(chuàng)業(yè)企業(yè),在激烈的競爭之下,也步履維艱。

正當(dāng)他們快要堅(jiān)持不下去的時(shí)候,腦子里蹦出了“開源”的想法。什么是“開源”?開源,就是開放源代碼。也就是將原來內(nèi)部保密的程序源代碼開放給所有人,然后讓大家一起參與進(jìn)來,貢獻(xiàn)代碼和意見。

有的軟件一開始就是開源的。也有的軟件,是混不下去,創(chuàng)造者又不想放棄,所以選擇開源。自己養(yǎng)不活,就吃“百家飯”嘛。2013 年 3 月,dotCloud 公司的創(chuàng)始人之一,Docker 之父,28 歲的 Solomon?Hykes 正式?jīng)Q定,將 Docker 項(xiàng)目開源。

Docker創(chuàng)始人

不開則已,一開驚人。越來越多的 IT 工程師發(fā)現(xiàn)了 Docker 的優(yōu)點(diǎn),然后蜂擁而至,加入 Docker 開源社區(qū)。Docker 的人氣迅速攀升,速度之快,令人瞠目結(jié)舌。

開源當(dāng)月, Docker 0.1 版本發(fā)布。此后的每一個(gè)月, Docker 都會(huì)發(fā)布一個(gè)版本。到 2014 年 6 月 9 日, Docker 1.0 版本正式發(fā)布。

此時(shí)的 Docker,已經(jīng)成為行業(yè)里人氣最火爆的開源技術(shù),沒有之一。甚至像 Google、微軟、Amazon、 VMware 這樣的巨頭們都對它青睞有加,表示將全力支持。

Docker 火了之后, dotCloud 公司干脆把公司名字也改成了 Docker Inc. 。

Docker是一個(gè)用于開發(fā),發(fā)布和運(yùn)行應(yīng)用程序的開放平臺(tái)。Docker使您能夠?qū)?yīng)用程序與基礎(chǔ)架構(gòu)分開,從而可以快速交付軟件。借助Docker,您可以以與管理應(yīng)用程序相同的方式來管理基礎(chǔ)架構(gòu)。通過利用Docker的方法來快速交付,測試和部署代碼,您可以大大減少編寫代碼和在生產(chǎn)環(huán)境中運(yùn)行代碼之間的延遲。

Docker平臺(tái)

Docker提供了在松散隔離的環(huán)境(稱為容器)中打包和運(yùn)行應(yīng)用程序的功能。隔離和安全性使您可以在給定主機(jī)上同時(shí)運(yùn)行多個(gè)容器。容器是輕量級的,因?yàn)樗鼈儾恍枰芾沓绦虻念~外負(fù)載,而是直接在主機(jī)的內(nèi)核中運(yùn)行。這意味著與使用虛擬機(jī)相比,在給定的硬件組合上可以運(yùn)行更多的容器。您甚至可以在實(shí)際上是虛擬機(jī)的主機(jī)中運(yùn)行Docker容器!

Docker提供了工具和平臺(tái)來管理容器的生命周期:

  • 使用容器開發(fā)應(yīng)用程序及其支持組件。
  • 容器成為分發(fā)和測試您的應(yīng)用程序的單元。
  • 準(zhǔn)備就緒后,可以將應(yīng)用程序作為容器或協(xié)調(diào)服務(wù)部署到生產(chǎn)環(huán)境中。無論您的生產(chǎn)環(huán)境是本地?cái)?shù)據(jù)中心,云提供商還是兩者的混合,其工作原理都相同。

Docker引擎

Docker Engine是具有以下主要組件的客戶端-服務(wù)器應(yīng)用程序:

  • 服務(wù)器是一種長期運(yùn)行的程序,稱為守護(hù)程序進(jìn)程( dockerd命令)。

  • REST API,它指定程序可以用來與守護(hù)程序進(jìn)行通信并指示其操作的接口。

  • 命令行界面(CLI)客戶端(docker命令)。

、

CLI使用Docker REST API通過腳本或直接CLI命令控制或與Docker守護(hù)程序交互。許多其他Docker應(yīng)用程序都使用基礎(chǔ)API和CLI。

守護(hù)程序創(chuàng)建和管理Docker 對象,例如圖像,容器,網(wǎng)絡(luò)和卷。

注意:Docker已獲得開源Apache 2.0許可證的許可。

有關(guān)更多詳細(xì)信息,請參閱下面的Docker體系結(jié)構(gòu)。

我可以將Docker用于什么?

快速,一致地交付您的應(yīng)用程序

Docker通過允許開發(fā)人員使用提供您的應(yīng)用程序和服務(wù)的本地容器在標(biāo)準(zhǔn)化環(huán)境中工作,從而簡化了開發(fā)生命周期。容器非常適合持續(xù)集成和持續(xù)交付(CI / CD)工作流程。

考慮以下示例方案:

  • 您的開發(fā)人員在本地編寫代碼,并使用Docker容器與同事共享他們的工作。
  • 他們使用Docker將其應(yīng)用程序推送到測試環(huán)境中,并執(zhí)行自動(dòng)和手動(dòng)測試。
  • 當(dāng)開發(fā)人員發(fā)現(xiàn)錯(cuò)誤時(shí),他們可以在開發(fā)環(huán)境中對其進(jìn)行修復(fù),然后將其重新部署到測試環(huán)境中以進(jìn)行測試和驗(yàn)證。
  • 測試完成后,將修補(bǔ)程序推送到生產(chǎn)環(huán)境就像將更新的映像推送到生產(chǎn)環(huán)境一樣簡單。

響應(yīng)式部署和擴(kuò)展

Docker基于容器的平臺(tái)允許高度可移植的工作負(fù)載。Docker容器可以在開發(fā)人員的本地筆記本電腦上,數(shù)據(jù)中心中的物理或虛擬機(jī),云提供商或混合環(huán)境中運(yùn)行。

Docker的可移植性和輕量級的特性還使您可以輕松地動(dòng)態(tài)管理工作負(fù)載,并根據(jù)業(yè)務(wù)需求指示實(shí)時(shí)擴(kuò)展或拆除應(yīng)用程序和服務(wù)。

在同一硬件上運(yùn)行更多工作負(fù)載

Docker輕巧快速。它為基于虛擬機(jī)管理程序的虛擬機(jī)提供了可行,經(jīng)濟(jì)高效的替代方案,因此您可以利用更多的計(jì)算能力來實(shí)現(xiàn)業(yè)務(wù)目標(biāo)。Docker非常適合高密度環(huán)境以及中小型部署,在這些部署中您需要用更少的資源做更多的事情。

Docker架構(gòu)

Docker使用客戶端-服務(wù)器架構(gòu)。Docker 客戶端與Docker 守護(hù)程序進(jìn)行對話,該守護(hù)程序完成了構(gòu)建,運(yùn)行和分發(fā)Docker容器的繁重工作。Docker客戶端和守護(hù)程序可以 在同一系統(tǒng)上運(yùn)行,或者您可以將Docker客戶端連接到遠(yuǎn)程Docker守護(hù)程序。Docker客戶端和守護(hù)程序在UNIX套接字或網(wǎng)絡(luò)接口上使用REST API進(jìn)行通信。

[圖片上傳失敗...(image-9fdf7b-1601093037017)

Docker守護(hù)程序

Docker守護(hù)程序(dockerd)偵聽Docker API請求并管理Docker對象,例如圖像,容器,網(wǎng)絡(luò)和卷。守護(hù)程序還可以與其他守護(hù)程序通信以管理Docker服務(wù)。

Docker客戶端

Docker客戶端(docker)是許多Docker用戶與Docker交互的主要方式。當(dāng)您使用諸如之類的命令時(shí)docker run,客戶端會(huì)將這些命令發(fā)送到dockerd,以執(zhí)行這些命令。該docker命令使用Docker API。Docker客戶端可以與多個(gè)守護(hù)程序通信。

Docker注冊表

Docker 注冊表存儲(chǔ)Docker映像。Docker Hub是任何人都可以使用的公共注冊表,并且Docker配置為默認(rèn)在Docker Hub上查找映像。您甚至可以運(yùn)行自己的私人注冊表。

使用docker pulldocker run命令時(shí),所需的圖像將從配置的注冊表中提取。使用該docker push命令時(shí),會(huì)將映像推送到配置的注冊表。

Docker對象

使用Docker時(shí),您正在創(chuàng)建和使用映像,容器,網(wǎng)絡(luò),卷,插件和其他對象。本節(jié)是其中一些對象的簡要概述。

圖片

一個(gè)圖像是用于創(chuàng)建一個(gè)碼頭工人容器指令的只讀模板。通常,一個(gè)映像基于另一個(gè)映像,并進(jìn)行一些其他自定義。例如,您可以基于該ubuntu 映像構(gòu)建映像,但是安裝Apache Web服務(wù)器和您的應(yīng)用程序,以及運(yùn)行該應(yīng)用程序所需的配置詳細(xì)信息。

您可以創(chuàng)建自己的圖像,也可以僅使用其他人創(chuàng)建并在注冊表中發(fā)布的圖像。要構(gòu)建自己的映像,您可以 使用簡單的語法創(chuàng)建一個(gè)Dockerfile,以定義創(chuàng)建映像并運(yùn)行它所需的步驟。Dockerfile中的每條指令都會(huì)在映像中創(chuàng)建一個(gè)層。當(dāng)您更改Dockerfile并重建映像時(shí),僅重建那些已更改的層。與其他虛擬化技術(shù)相比,這是使映像如此輕巧,小型和快速的部分原因。

貨柜

容器是圖像的可運(yùn)行實(shí)例。您可以使用Docker API或CLI創(chuàng)建,啟動(dòng),停止,移動(dòng)或刪除容器。您可以將容器連接到一個(gè)或多個(gè)網(wǎng)絡(luò),將存儲(chǔ)連接到它,甚至根據(jù)其當(dāng)前狀態(tài)創(chuàng)建一個(gè)新映像。

默認(rèn)情況下,容器與其他容器及其主機(jī)之間的隔離度相對較高。您可以控制容器的網(wǎng)絡(luò),存儲(chǔ)或其他基礎(chǔ)子系統(tǒng)與其他容器或主機(jī)的隔離程度。

容器由其映像以及在創(chuàng)建或啟動(dòng)時(shí)為其提供的任何配置選項(xiàng)定義。刪除容器后,未存儲(chǔ)在永久性存儲(chǔ)中的狀態(tài)更改將消失。

示例docker run命令

以下命令運(yùn)行一個(gè)ubuntu容器,以交互方式附加到本地命令行會(huì)話,然后運(yùn)行/bin/bash

$ docker run -i -t ubuntu /bin/bash

當(dāng)您運(yùn)行此命令時(shí),會(huì)發(fā)生以下情況(假設(shè)您使用的是默認(rèn)注冊表配置):

  1. 如果您在ubuntu本地沒有該映像,則Docker會(huì)將其從已配置的注冊表中拉出,就像您已docker pull ubuntu手動(dòng)運(yùn)行一樣。

  2. Docker會(huì)創(chuàng)建一個(gè)新容器,就像您已docker container create 手動(dòng)運(yùn)行命令一樣。

  3. Docker將一個(gè)讀寫文件系統(tǒng)分配給容器,作為其最后一層。這允許運(yùn)行中的容器在其本地文件系統(tǒng)中創(chuàng)建或修改文件和目錄。

  4. Docker創(chuàng)建了一個(gè)網(wǎng)絡(luò)接口以將容器連接到默認(rèn)網(wǎng)絡(luò),因?yàn)槟粗付ㄈ魏尉W(wǎng)絡(luò)選項(xiàng)。這包括為容器分配IP地址。默認(rèn)情況下,容器可以使用主機(jī)的網(wǎng)絡(luò)連接連接到外部網(wǎng)絡(luò)。

  5. Docker啟動(dòng)容器并執(zhí)行/bin/bash。因?yàn)槿萜魇墙换ナ竭\(yùn)行的,并且已附加到您的終端(由于-i-t 標(biāo)志),所以您可以在輸出記錄到終端時(shí)使用鍵盤提供輸入。

  6. 當(dāng)您鍵入exit以終止/bin/bash命令時(shí),容器將停止但不會(huì)被刪除。您可以重新啟動(dòng)或刪除它。

服務(wù)

服務(wù)允許你擴(kuò)展在多個(gè)碼頭工人守護(hù)進(jìn)程的容器,這是所有工作一起作為一個(gè)有多個(gè)管理人員工人。群的每個(gè)成員都是Docker守護(hù)程序,所有守護(hù)程序都使用Docker API進(jìn)行通信。服務(wù)允許您定義所需的狀態(tài),例如在任何給定時(shí)間必須可用的服務(wù)副本的數(shù)量。默認(rèn)情況下,該服務(wù)在所有工作節(jié)點(diǎn)之間是負(fù)載平衡的。對于消費(fèi)者而言,Docker服務(wù)似乎是一個(gè)單獨(dú)的應(yīng)用程序。Docker Engine在Docker 1.12及更高版本中支持集群模式。

底層技術(shù)

Docker用Go編寫,并利用Linux內(nèi)核的多個(gè)功能來交付其功能。

命名空間

Docker使用一種稱為namespaces提供容器的隔離工作區(qū)的技術(shù)。運(yùn)行容器時(shí),Docker會(huì)為該容器創(chuàng)建一組 名稱空間。

這些名稱空間提供了一層隔離。容器的每個(gè)方面都在單獨(dú)的名稱空間中運(yùn)行,并且其訪問僅限于該名稱空間。

Docker Engine在Linux上使用以下名稱空間:

  • pid命名空間:進(jìn)程隔離(PID:進(jìn)程ID)。
  • net命名空間:管理網(wǎng)絡(luò)接口(NET:網(wǎng)絡(luò))。
  • ipc命名空間:管理訪問IPC資源(IPC:進(jìn)程間通信)。
  • mnt命名空間:管理文件系統(tǒng)掛載點(diǎn)(MNT:摩)。
  • uts命名空間:隔離內(nèi)核和版本標(biāo)識符。(UTS:Unix時(shí)間共享系統(tǒng))。

對照組

Linux上的Docker引擎還依賴于另一種稱為控制組cgroups)的技術(shù)。cgroup將應(yīng)用程序限制為一組特定的資源。控制組允許Docker Engine將可用的硬件資源共享給容器,并有選擇地實(shí)施限制和約束。例如,您可以限制特定容器可用的內(nèi)存。

聯(lián)合文件系統(tǒng)

聯(lián)合文件系統(tǒng)或UnionFS是通過創(chuàng)建圖層進(jìn)行操作的文件系統(tǒng),使其非常輕便且快速。Docker Engine使用UnionFS為容器提供構(gòu)建模塊。Docker Engine可以使用多個(gè)UnionFS變體,包括AUFS,btrfs,vfs和DeviceMapper。

容器格式

Docker Engine將名稱空間,控制組和UnionFS組合到一個(gè)稱為容器格式的包裝器中。默認(rèn)容器格式為libcontainer。將來,Docker可以通過與BSD Jails或Solaris Zones等技術(shù)集成來支持其他容器格式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容