什么是Docker

說實話關(guān)于Docker是什么并太好說,下面我通過四點向你說明Docker到底是個什么東西。
- Docker是世界領(lǐng)先的軟件容器平臺。
- Docker使用Google公司推出的Go語言進行開發(fā)實現(xiàn),基于Linux內(nèi)核的cgroup,namespace,以及AUFS類的UnionFS等技術(shù),對進程進行封裝隔離,屬于操作系統(tǒng)層面的虛擬化技術(shù)。由于隔離的進程獨立于宿主和其它的隔離的進程,因此也稱其為容器。Docke最初實現(xiàn)是基于LXC。
- Docker能夠自動執(zhí)行重復性任務,例如搭建和配置開發(fā)環(huán)境,從而解放了開發(fā)人員以便他們專注在真正重要的事情上:構(gòu)建杰出的軟件。
- 用戶可以方便地創(chuàng)建和使用容器,把自己的應用放入容器。容器還可以進行版本管理、復制、分享、修改,就像管理普通的代碼一樣。
為什么要使用Docker
- Docker的鏡像提供了除內(nèi)核外完整的運行時環(huán)境,確保了應用運行環(huán)境一致性,從而不會再出現(xiàn)“這段代碼在我機器上沒問題啊”這類問題;——一致的運行環(huán)境
- 可以做到秒級、甚至毫秒級的啟動時間。大大的節(jié)約了開發(fā)、測試、部署的時間?!焖俚膯訒r間
- 避免公用的服務器,資源會容易受到其他用戶的影響。——隔離性
- 善于處理集中爆發(fā)的服務器使用壓力;——彈性伸縮,快速擴展
- 可以很輕易的將在一個平臺上運行的應用,遷移到另一個平臺上,而不用擔心運行環(huán)境的變化導致應用無法正常運行的情況。——遷移方便
- 使用Docker可以通過定制應用鏡像來實現(xiàn)持續(xù)集成、持續(xù)交付、部署?!掷m(xù)交付和部署
每當說起容器,我們就得將其和虛擬機做一個比較
容器VS虛擬機
作為一種新興的虛擬化方式,Docker跟傳統(tǒng)的虛擬化方式相比具有眾多的優(yōu)勢。

特性 |
容器 |
虛擬機 |
啟動 |
秒級 |
分鐘級 |
硬盤使用 |
一般為 MB |
一般為 GB |
性能 |
接近原生 |
弱于 |
系統(tǒng)支持量 |
單機支持上千個容器 |
一般幾十個 |
Docker系統(tǒng)架構(gòu)
Docker 使用客戶端-服務器(C/S)架構(gòu)模式,使用遠程API來管理和創(chuàng)建 Docker 容器。
Docker 容器通過 Docker 鏡像來創(chuàng)建。
容器與鏡像的關(guān)系類似于面向?qū)ο缶幊讨械膶ο笈c類。
Docker |
面向?qū)ο?/th>
|
容器 |
對象 |
鏡像 |
類 |
下面是對Docker中的一些架構(gòu)名稱的解釋
標題 |
說明 |
鏡像(Images) |
Docker 鏡像是用于創(chuàng)建 Docker 容器的模板。 |
容器(Container) |
容器是獨立運行的一個或一組應用。 |
客戶端(Client) |
Docker 客戶端通過命令行或者其他工具使用 Docker API 與 Docker 的守護進程通信。 |
主機(Host) |
一個物理或者虛擬的機器用于執(zhí)行 Docker 守護進程和容器。 |
倉庫(Registry) |
Docker 倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。Docker Hub 提供了龐大的鏡像集合供使用 |
Docker Machine |
Docker Machine是一個簡化Docker安裝的命令行工具,通過一個簡單的命令行即可在相應的平臺上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
什么是Docker鏡像
我們都知道,操作系統(tǒng)分為內(nèi)核和用戶空間。對于Linux而言,內(nèi)核啟動后,會掛載root 文件系統(tǒng)為其提供用戶空間支持。而Docker鏡像(Image),就相當于是一個root 文件系統(tǒng)。比如官方鏡像ubuntu:16.04 就包含了完整的一套 Ubuntu 16.04 最小系統(tǒng)的 root 文件系統(tǒng)。
Docker 鏡像是一個特殊的文件系統(tǒng),除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(shù)(如匿名卷、環(huán)境變量、用戶等)。鏡像不包含任何動態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會被改變。
采用分層存儲技術(shù)
因為鏡像包含操作系統(tǒng)完整的root 文件系統(tǒng),其體積往往是龐大的,因此在 Docker設(shè)計時,就充分利用Union FS的技術(shù),將其設(shè)計為分層存儲的架構(gòu)。鏡像只是一個虛擬的概念,其實際體現(xiàn)并非由一個文件組成,而是由一組文件系統(tǒng)組成,或者說,由多層文件系統(tǒng)聯(lián)合組成。
鏡像構(gòu)建時,會一層層構(gòu)建,前一層是后一層的基礎(chǔ)。每一層構(gòu)建完就不會再發(fā)生改變,后一層上的任何改變只發(fā)生在自己這一層。比如,刪除前一層文件的操作,實際不是真的刪除前一層的文件,而是僅在當前層標記為該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像。因此,在構(gòu)建鏡像的時候,需要額外小心,每一層盡量只包含該層需要添加的東西,任何額外的東西應該在該層構(gòu)建結(jié)束前清理掉。
分層存儲的特征還使得鏡像的復用、定制變的更為容易。甚至可以用之前構(gòu)建好的鏡像作為基礎(chǔ)層,然后進一步添加新的層,以定制自己所需的內(nèi)容,構(gòu)建新的鏡像。
什么是Docker容器
-
鏡像(Image )和容器(Container )的關(guān)系,就像是面向?qū)ο蟪绦蛟O(shè)計中的類 和實例 一樣,鏡像是靜態(tài)的定義,容器是鏡像運行時的實體。容器可以被創(chuàng)建、啟動、停止、刪除、暫停等。
-
容器的實質(zhì)是進程,但與直接在宿主執(zhí)行的進程不同,容器進程運行于屬于自己的獨立的命名空間。因此容器可以擁有自己的root 文件系統(tǒng)、自己的網(wǎng)絡(luò)配置、自己的進程空間,甚至自己的用戶ID空間。容器內(nèi)的進程是運行在一個隔離的環(huán)境里,使用起來,就好像是在一個獨立于宿主的系統(tǒng)下操作一樣,也就是我們常說的沙箱(沙盒)操作。這種特性使得容器封裝的應用比直接在宿主運行更加安全。也因為這種隔離的特性,很多人初學Docker時常常會混淆容器和虛擬機。
-
前面講過鏡像使用的是分層存儲,容器也是如此。每一個容器運行時,是以鏡像為基礎(chǔ)層,在其上創(chuàng)建一個當前容器的存儲層,我們可以稱這個為容器運行時讀寫而準備的存儲層為容器存儲層。
-
容器存儲層的生存周期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此,任何保存于容器存儲層的信息都會隨容器刪除而丟失。
-
按照 Docker 最佳實踐的要求,容器不應該向其存儲層內(nèi)寫入任何數(shù)據(jù),容器存儲層要保持無狀態(tài)化。所有的文件寫入操作,都應該使用 數(shù)據(jù)卷(Volume )、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網(wǎng)絡(luò)存儲)發(fā)生讀寫,其性能和穩(wěn)定性更高。
-
數(shù)據(jù)卷的生存周期獨立于容器,容器消亡,數(shù)據(jù)卷不會消亡。因此,使用數(shù)據(jù)卷后,容器刪除或者重新運行之后,數(shù)據(jù)卻不會丟失。
什么是Docker倉庫
-
鏡像構(gòu)建完成后,可以很容易的在當前宿主機上運行,但是,如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發(fā)鏡像的服務,Docker Registry 就是這樣的服務。
-
一個 Docker Registry 中可以包含多個倉庫(Repository );每個倉庫可以包含多個標簽(Tag );每個標簽對應一個鏡像。
-
通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標簽就常用于對應該軟件的各個版本。我們可以通過<倉庫名>:<標簽> 的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標簽,將以latest 作為默認標簽。
-
以Ubuntu 鏡像為例,ubuntu 是倉庫的名字,其內(nèi)包含有不同的版本標簽,如,14.04 ,16.04 。我們可以通過ubuntu:14.04 ,或者ubuntu:16.04 來具體指定所需哪個版本的鏡像。如果忽略了標簽,比如 ubuntu ,那將視為 ubuntu:latest 。
公有 Docker Registry
Docker Registry公開服務是開放給用戶使用、允許用戶管理鏡像的 Registry 服務。一般這類公開服務允許用戶免費上傳、下載公開的鏡像,并可能提供收費服務供用戶管理私有鏡像。
最常使用的 Registry公開服務是官方的Docker Hub ,這也是默認的Registry,并擁有大量的高質(zhì)量的官方鏡像。
私有 Docker Registry
除了使用公開服務外,用戶還可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 鏡像,可以直接使用做為私有 Registry 服務。
開源的 Docker Registry 鏡像只提供了 Docker Registry API 的服務端實現(xiàn),足以支持docker 命令,不影響使用。但不包含圖形界面,以及鏡像維護、用戶管理、訪問控制等高級功能。在官方的商業(yè)化版本 Docker Trusted Registry中,提供了這些高級功能。
Ubuntu 安裝Docker
使用腳本自動安裝
在測試或開發(fā)環(huán)境中 Docker 官方為了簡化安裝流程,提供了一套便捷的安裝腳本,Ubuntu 系統(tǒng)上可以使用這套腳本安裝:
$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror AzureChinaCloud
執(zhí)行這個命令后,腳本就會自動的將一切準備工作做好,并且把 Docker CE 的 Edge 版本安裝在系統(tǒng)中。
小貼士
測試Docker是否成功安裝
輸入命令:docker version ,如果出現(xiàn)了Server: Docker Engine - Community 就說明已經(jīng)成功安裝上了
輸入命令docker version 前,一定要記得切換到root 超級管理員狀態(tài)才能查看,因為普通用戶沒有權(quán)限查看
設(shè)置Docker鏡像加速器
國內(nèi)從 Docker Hub拉取鏡像有時會遇到困難,此時可以配置鏡像加速器。Docker官方和國內(nèi)很多云服務商都提供了國內(nèi)加速器服務
我使用的是Ubuntu 16.04版本的,就可以在/etc/docker/daemon.json 中寫入以下內(nèi)容(如果內(nèi)容不存在請新建該文件)
{
"registry-mirrors": [
"https://registry."
]
}
注意:一定要保證該文件符合json規(guī)范,否則Docker將不會啟動。
之后再重新啟動服務
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
來源:https://www./content-4-395301.html
|