摘要:將一個輕量級的容器虛擬化平臺和一組標(biāo)準(zhǔn)工作流程工具進(jìn)行集成,來幫助你方便地管理和部署應(yīng)用。主要包括哪些組件主要包括兩個組件開源的容器虛擬化平臺用于分享和管理容器的軟件即服務(wù)平臺。
【編者的話】本文來自 Docker 的官方文檔,詳細(xì)介紹了 Docker 的體系結(jié)構(gòu)、重要概念、內(nèi)部工作機理等內(nèi)容,推薦不了解 Docker 內(nèi)部原理的同學(xué)閱讀。
什么是 Docker?Docker 是一個用于開發(fā)、交付和運行應(yīng)用的開放平臺,Docker 設(shè)計用來更快的交付你的應(yīng)用程序。Docker 可以將你的應(yīng)用程序和基礎(chǔ)設(shè)施層隔離,并且還可以將你的基礎(chǔ)設(shè)施當(dāng)作程序一樣進(jìn)行管理。Docker 可以幫助你更塊地打包你代碼、測試以及部署,并且也可以減少從編寫代碼到部署運行代碼的周期。
Docker 將一個輕量級的容器虛擬化平臺和一組標(biāo)準(zhǔn)工作流程、工具進(jìn)行集成,來幫助你方便地管理和部署應(yīng)用。
核心是,Docker 提供了一種在安全隔離的容器中運行近乎所有應(yīng)用的方式,這種隔離性和安全性允許你在同一主機上同時運行多個容器,而容器的這種輕量級特性,意味著你可以節(jié)省更多的硬件資源,因為你不必消耗運行 hypervisor 所需要的額外負(fù)載。
基于容器虛擬化的工具或者平臺可以為你提供如下幫助:
將應(yīng)用程序(包括支撐的組件)放入Docker容器中;
將這些容器打包并分發(fā)給你的團隊,以便于后續(xù)的開發(fā)和測試;
將這些容器部署到生產(chǎn)環(huán)境中,生產(chǎn)環(huán)境可以是本地的數(shù)據(jù)中心,也可以在云端。
我可以用 Docker 做些什么? 快速分發(fā)你的應(yīng)用Docker是開發(fā)過程中較為理想的助手,它允許你在包含了你的應(yīng)用和服務(wù)的本地容器中進(jìn)行開發(fā),然后幫你完成集成和部署。
例如,你的開發(fā)人員可以在本地編寫代碼然后通過Docker與其他同事共享,當(dāng)他們完成了各自的開發(fā)任務(wù)后,可以將他們的代碼推送到一個測試的環(huán)境中進(jìn)行測試,完成測試后便可以將相應(yīng)的Docker鏡像部署到生產(chǎn)環(huán)境中。
更方便地進(jìn)行部署和調(diào)整規(guī)模Docker這種基于容器的平臺具有高度的便攜性,它可以無縫地運行于開發(fā)者的本地主機、數(shù)據(jù)中心其它的物理機或虛擬機、或者云端。
Docker的便攜性和其天然的輕量特性易于實現(xiàn)動態(tài)地負(fù)載管理,你可以利用Docker快速地增減應(yīng)用和服務(wù)的部署規(guī)模,Docker的速度保證了這種規(guī)模的調(diào)整近乎實時。
更高密度的部署應(yīng)用和運行更多的應(yīng)用由于Docker輕量并且快速,因此相對于基于Hypervisor的虛擬機的部署方式,Docker提供了一種更可行和劃算的替代方案,這對于高密度部署環(huán)境尤其有用,例如在構(gòu)建私有云或PaaS。當(dāng)然,當(dāng)你想在有限的資源里部署更多的應(yīng)用時,Docker對于中小型的部署也非常有用。
Docker 主要包括哪些組件?Docker主要包括兩個組件:
Docker:開源的容器虛擬化平臺;
Docker Hub :用于分享和管理Docker容器的軟件即服務(wù)平臺。
注:Docker在Apache 2.0開源協(xié)議下進(jìn)行授權(quán)。
Docker 的架構(gòu)?Docker是Client/Server的架構(gòu),Docker客戶端與Docker daemon進(jìn)行交互,daemon負(fù)責(zé)構(gòu)建、運行和發(fā)布Docker容器??蛻舳丝梢院头?wù)端運行在同一個系統(tǒng)中,也可以連接遠(yuǎn)程的daemon。Docker的客戶端的daemon通過RESTful API進(jìn)行socket通信。
[
Docker 守護進(jìn)程就像上圖所示,Docker守護進(jìn)程(daemon)在主機上運行,用戶不能直接和守護進(jìn)程打交道,但是可以通過Docker客戶端與其進(jìn)行交互。
Docker 客戶端Docker客戶端——docker二進(jìn)制文件的功能之一——是Docker的初始用戶界面,它接收用戶的命令并反饋,并且與Docker的守護進(jìn)行交互。
Docker 內(nèi)部機制理解Docker的內(nèi)部機制,你需要明白如下三個組件:
Docker鏡像
Docker注冊中心
Docker容器
Docker 鏡像Docker鏡像是一個只讀的模板。例如,一個鏡像可以包含安裝了Apache Web服務(wù)應(yīng)用的Ubuntu操作系統(tǒng)。鏡像可以用來創(chuàng)建Docker容器。Docker提供了構(gòu)建新鏡像或升級原有鏡像的較為便利的方式,或者你也可以下載別人已經(jīng)創(chuàng)建好的鏡像。Docker鏡像是Docker的構(gòu)建組件。
Docker 注冊中心Docker注冊中心用于上傳和下載鏡像,分為公共注冊中心和私有注冊中心兩種。公共注冊中心為Docker Hub,它提供了大量的現(xiàn)成鏡像,你可以構(gòu)建自己的鏡像并上傳到上面,也可以在上面下載別人構(gòu)建的鏡像。Docker注冊中心是Docker的發(fā)布組件。
Docker 容器Docker容器就像是一個文件夾,它包含了一個應(yīng)用程序運行所需要的所有內(nèi)容。每個容器都是基于Docker鏡像構(gòu)建。我們可以運行、開始、停止、遷移或者是刪除Docker容器。每個容器均是一個隔離的、安全的應(yīng)用平臺。Docker容器是Docker的運行組件。
Docker 怎樣工作的至此,我們已經(jīng)知道了:
你可以構(gòu)建用于存儲你的應(yīng)用程序的鏡像;
你可以從Docker鏡像中創(chuàng)建容器用來運行你的應(yīng)用;
你可以通過Docker Hub或者你自己的注冊中心來共享Docker鏡像。
那我們看看 Docker 是怎么將這些元素組合在一起工作的。
Docker 鏡像是如何工作的我們已經(jīng)知道Docker鏡像實質(zhì)上是一些用于加載Docker容器的只讀模板,每個鏡像包括很多層。Docker利用union file systems將這些層組合為一個鏡像。Union file systems允許相互隔離的文件或目錄透明的疊加在一起,而呈現(xiàn)為一個統(tǒng)一的文件系統(tǒng)。
Docker如此輕量化的原因也是由于這些層的存在。當(dāng)你對一個Docker鏡像進(jìn)行修改時——例如將一個應(yīng)用升級為一個新的版本——會構(gòu)建一個新的層,因此,與虛擬機的替換整個鏡像或完全構(gòu)建的方式不同,Docker僅對相關(guān)的層進(jìn)行添加或升級。所以你僅需要發(fā)布鏡像的更新部分而不必發(fā)布整個鏡像,這種方式使得鏡像的發(fā)布更加快速和簡單。
每個鏡像始于一個基礎(chǔ)鏡像,例如:ubuntu便是一個基礎(chǔ)的Ubuntu鏡像,fedora是一個基礎(chǔ)的Fedora鏡像。你也可以將你自己制作的鏡像作為基礎(chǔ)鏡像,例如你可以將一個Apache鏡像作為一個Web應(yīng)用的基礎(chǔ)鏡像。
注意:Docker一般從Docker Hub上獲取基礎(chǔ)鏡像。Docker鏡像從這些基礎(chǔ)鏡像中按照一系列的步驟進(jìn)行制作,我們稱這些步驟為指令,每個指令在你的鏡像中創(chuàng)建一個新的層,指令包括以下行為:
運行一條命令;
添加一個文件或目錄;
創(chuàng)建一個環(huán)境變量;
從此鏡像中加載一個容器時需要運行的進(jìn)程。
這些指令存儲在Dockerfile中,Docker在構(gòu)建鏡像過程中讀取這個Dockerfile,運行里面的指令并返回最終的鏡像。
Docker注冊中心如何工作的Docker注冊中心是Docker鏡像的存儲中心,當(dāng)你構(gòu)建完一個鏡像后便可以將其推送到Docker Hub或你自己的注冊中心。
利用Docker客戶端,你可以搜索已經(jīng)發(fā)布的鏡像,然后將其拉取到你的Docker主機上,以便于基于這些鏡像構(gòu)建容器。
Docker Hub為鏡像提供了公共的和私有的存儲空間。公共的存儲空間任何人均可以在上面搜索和下載,私有存儲空間僅對你本人或你的團隊開放搜索以及拉取下載,你可以通過這里注冊一個私有的存儲空間。
容器是如何工作的一個容器包括操作系統(tǒng)、用戶添加的文件以及相關(guān)的元數(shù)據(jù)。我們知道,每個容器都是從鏡像中構(gòu)建出來的,這個鏡像告訴Docker容器用到什么資源、當(dāng)容器加載時啟動哪個進(jìn)程以及容器啟動時的其它配置。Docker鏡像是只讀的,當(dāng)Docker從一個鏡像運行一個容器時,它會在鏡像的上層添加一個用于運行應(yīng)用的可讀寫的層(利用的就是上文提到的union file system)。
運行一個容器時到底發(fā)生了什么不管是通過Docker命令還是API調(diào)用的方式,Docker客戶端都會通知Docker的守護進(jìn)程運行一個容器。
sudo docker run -i -t ubuntu /bin/bash
我們來看一下這個命令,Docker客戶端利用docker命令并結(jié)合run選項來啟動一個容器,一個最小配置的Docker客戶端運行一個容器需要告訴Docker守護進(jìn)程以下事項:
此容器基于什么鏡像來構(gòu)建,此處是ubuntu——一個基礎(chǔ)的Ubuntu鏡像;
需要在容器中運行的命令,此處是/bin/bash——在容器中啟動一個Bash Shell。
那么我們看看運行上述命令時到底發(fā)生了什么?
按照順序,Docker依次干了如下事情:
拉取ubuntu鏡像 : Docker首先檢查一下ubuntu鏡像在本地服務(wù)器上存不存在,如果不存在,則自動從Docker Hub中下載,如果已經(jīng)存在則直接利用這個鏡像來啟動一個新的容器。
創(chuàng)建一個新的容器: 如果Docker本地服務(wù)器中存在這個鏡像,那么就據(jù)此來啟動一個容器。
分配一個文件每戶并且將其掛載到一個可讀寫的層: 容器在此文件系統(tǒng)中被創(chuàng)建,并且將其作為一個可讀寫的層添加到鏡像中。
分配一個網(wǎng)絡(luò)或橋接的接口: 創(chuàng)建一個網(wǎng)絡(luò)的接口以便于Docker容器能夠訪問本機。
設(shè)置一個IP地址: 為此容器從地址池中找到并綁定一個IP地址。
執(zhí)行指定的進(jìn)程: 運行你的應(yīng)用程序,然后;
獲取并提供應(yīng)用程序的輸出: 連接標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤接口,這樣你便可以觀察到程序運行的一切。
現(xiàn)在你已經(jīng)運行了一個容器,這樣你便可以管理你的容器、與應(yīng)用程序進(jìn)行交互,當(dāng)運行結(jié)束是停止或者刪除你的容器。
底層技術(shù)問題Docker是用Go語言實現(xiàn)的,用到了一些Linux內(nèi)核的特性實現(xiàn)上述功能。
命名空間(namespaces)Docker在為容器提供一個隔離的工作空間時,用到了命名空間的技術(shù),當(dāng)你運行一個容器時,Docker會為此容器創(chuàng)建一組命名空間。
這樣便可以提供一個隔離的層:每個容器運行在自己的命名空間中,而外部不能訪問這個層。
Docker用到的一些命名空間有:
pid命名空間: 用于隔離進(jìn)程(PID:Process ID);
net命名空間: 用于管理網(wǎng)絡(luò);
ipc命名空間: 用于訪問IPC資源(IPC:InterProcess Communication);
mnt命名空間: 用于管理掛載點(MNT:Mount);
uts命名空間: 用于隔離內(nèi)核和版本標(biāo)識(UTS:Unix Timesharing System)。
控制組(Control Groups)Docker還用到了另外一項技術(shù)叫cgroups或者叫控制組(control groups)。實現(xiàn)程序運行環(huán)境的隔離的關(guān)鍵在于使這些程序只用到它們需要的資源,這就能夠保證這些容器是主機服務(wù)環(huán)境小社會中的好市民??刂平M允許Docker在不同的容器之間共享硬件資源,需要時添加一些限制和約束,例如限制一個容器最大訪問內(nèi)存量。
統(tǒng)一文件系統(tǒng)(Union file systems)統(tǒng)一文件系統(tǒng)或者說是UnionFS,是創(chuàng)建層的時候用到的文件系統(tǒng),使文件系統(tǒng)非常輕量和快速。Docker使用統(tǒng)一文件系統(tǒng)為容器構(gòu)建blocks,Docker可以使用幾種不同的文件系統(tǒng):AUFS、btrfs、vfs以及DeviceMapper。
容器格式Docker容器將這些組件合并在一起,我們稱之為容器格式,容器的缺省格式稱為libcontainer。Docker還支持利用LXC技術(shù)的傳統(tǒng)Linux容器格式,未來還將會支持其它的容器格式,例如:與BSD Jails或者Solaris Zones實現(xiàn)整合。
下一步安裝Docker,請參照 installation section
Docker用戶指南,請參照 深入學(xué)習(xí)Docker
原文鏈接:Understanding Docker(翻譯:deerlux 校對:李穎杰)
譯者介紹:deerlux@163.com,現(xiàn)就職于一家軍工科研機構(gòu),深度的技術(shù)控、Linux控、python控。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/26379.html
摘要:至于很具體的操作指令,比如怎么安裝,怎么和來跑一個簡單的,請參考官方文檔部分的或者也可參考文末的一些參考資料參考資料官方文檔入門教程系列簡明教程使用演示中文系列資源從入門到實踐作者更多文章個人網(wǎng)站 docker入門概覽 標(biāo)簽 : docker [TOC] 本文對docker進(jìn)行大致介紹,包括概述,安裝,簡單使用,架構(gòu),基本原理等方面 寫在前面 本文是自己學(xué)習(xí)docker的一個記錄...
摘要:分鐘快速入門教程一歡迎來到世界與虛擬化在沒有的時代,我們會使用硬件虛擬化虛擬機以提供隔離。倉庫分為公開倉庫和私有倉庫,最大的公開倉庫是官方倉庫,國內(nèi)的公開倉庫也有很多選擇,例如阿里云等。 30 分鐘快速入門 Docker 教程 一、歡迎來到 Docker 世界 1. Docker 與虛擬化 在沒有 Docker 的時代,我們會使用硬件虛擬化(虛擬機)以提供隔離。這里,虛擬機通過在操作系...
摘要:分鐘快速入門教程一歡迎來到世界與虛擬化在沒有的時代,我們會使用硬件虛擬化虛擬機以提供隔離。倉庫分為公開倉庫和私有倉庫,最大的公開倉庫是官方倉庫,國內(nèi)的公開倉庫也有很多選擇,例如阿里云等。 原文地址:梁桂釗的博客博客地址:http://blog.720ui.com 歡迎關(guān)注公眾號:「服務(wù)端思維」。一群同頻者,一起成長,一起精進(jìn),打破認(rèn)知的局限性。 30 分鐘快速入門 Docker 教程...
摘要:分鐘快速入門教程一歡迎來到世界與虛擬化在沒有的時代,我們會使用硬件虛擬化虛擬機以提供隔離。倉庫分為公開倉庫和私有倉庫,最大的公開倉庫是官方倉庫,國內(nèi)的公開倉庫也有很多選擇,例如阿里云等。 原文地址:梁桂釗的博客博客地址:http://blog.720ui.com 歡迎關(guān)注公眾號:「服務(wù)端思維」。一群同頻者,一起成長,一起精進(jìn),打破認(rèn)知的局限性。 30 分鐘快速入門 Docker 教程...
閱讀 648·2023-04-26 02:59
閱讀 757·2023-04-25 16:02
閱讀 2228·2021-08-05 09:55
閱讀 3699·2019-08-30 15:55
閱讀 4812·2019-08-30 15:44
閱讀 1851·2019-08-30 13:02
閱讀 2267·2019-08-29 16:57
閱讀 2347·2019-08-26 13:35