Docker 官方文件 理解 Docker

2021-09-07 12:08:42 字數 3975 閱讀 7663

docker 是乙個用於開發、交付和執行應用的開放平台,docker 設計用來更快的交付你的應用程式。docker 能夠將你的應用程式和基礎設施層隔離。而且還能夠將你的基礎設施當作程式一樣進行管理。docker 能夠幫助你更塊地打包你**、測試以及部署,而且也能夠降低從編寫**到部署執行**的週期。

docker 將乙個輕量級的容器虛擬化平台和一組標準工作流程、工具進行整合,來幫助你方便地管理和部署應用。

核心是,docker 提供了一種在安全隔離的容器中執行近乎全部應用的方式,這樣的隔離性和安全性同意你在同一主機上同一時候執行多個容器,而容器的這樣的輕量級特性,意味著你能夠節省很多其它的硬體資源,由於你不必消耗執行 hypervisor 所須要的額外負載。

基於容器虛擬化的工具或者平台能夠為你提供例如以下幫助:

docker是開發過程中較為理想的助手。它同意你在包括了你的應用和服務的本地容器中進行開發。然後幫你完畢整合和部署。

比如,你的開發者能夠在本地編寫**然後通過docker與其它同事共享,當他們完畢了各自的開發任務後,能夠將他們的**推送到乙個測試的環境中進行測試,完畢測試後便能夠將對應的docker映象部署到生產環境中。

docker這樣的基於容器的平台具有高度的便攜性,它能夠無縫地執行於開發人員的本地主機、資料中心其他的物理機或虛擬機器、或者雲端。

docker的便攜性和其天然的輕量特性易於實現動態地負載管理,你能夠利用docker高速地增減應用和服務的部署規模,docker的速度保證了這樣的規模的調整近乎實時。

因為docker輕量而且高速,因此相對於基於hypervisor的虛擬機器的部署方式。docker提供了一種更可行和划算的替代方案,這對於高密度部署環境尤事實上用,比如在構建私有雲或paas。當然,當你想在有限的資源裡部署很多其它的應用時,docker對於中小型的部署也很實用。

docker主要包含兩個元件:

注:docker在apache 2.0開源協議下進行授權。

docker是client/server的架構,dockerclient與docker daemon進行互動,daemon負責構建、執行和公布docker容器。client能夠和服務端執行在同乙個系統中。也能夠連線遠端的daemon。docker的client的daemon通過restful api進行socket通訊。

[就像上圖所看到的,docker守護程序(daemon)在主機上執行,使用者不能直接和守護程序打交道,可是能夠通過dockerclient與其進行互動。

dockerclient——docker二進位制檔案的功能之中的乙個——是docker的初始使用者介面,它接收使用者的命令並反饋,而且與docker的守護進行互動。

理解docker的內部機制。你須要明確例如以下三個元件:

docker映象是乙個僅僅讀的模板。比如,乙個映象能夠包括安裝了apache web服務應用的ubuntu作業系統。映象能夠用來建立docker容器。

docker容器就像是乙個目錄。它包括了乙個應用程式執行所須要的全部內容。

每乙個容器都是基於docker映象構建。

我們能夠執行、開始、停止、遷移或者是刪除docker容器。

每乙個容器均是乙個隔離的、安全的應用平台。docker容器是docker的執行元件。

至此,我們已經知道了:

你能夠構建用於儲存你的應用程式的映象。

你能夠從docker映象中建立容器用來執行你的應用;

你能夠通過docker hub或者你自己的註冊中心來共享docker映象。

那我們看看 docker 是怎麼將這些元素組合在一起工作的。

我們已經知道docker映象實質上是一些用於載入docker容器的僅僅讀模板,每乙個映象包含非常多層。

docker利用union file systems將這些層組合為乙個映象。union file systems同意相互隔離的檔案或資料夾透明的疊加在一起。而呈現為乙個統一的檔案系統。

docker如此輕量化的原因也是因為這些層的存在。當你對乙個docker映象進行改動時——比如將乙個應用公升級為乙個新的版本號——會構建乙個新的層。因此,與虛擬機器的替換整個映象或全然構建的方式不同。docker僅對相關的層進行加入或公升級。所以你僅須要公布映象的更新部分而不必公布整個映象,這樣的方式使得映象的公布更加高速和簡單。

每乙個映象始於乙個基礎映象,比如:ubuntu便是乙個基礎的ubuntu映象,fedora是乙個基礎的fedora映象。

你也能夠將你自己製作的映象作為基礎映象,比如你能夠將乙個apache映象作為乙個web應用的基礎映象。

注意:docker一般從docker hub上獲取基礎映象。docker映象從這些基礎映象中依照一系列的步驟進行製作。我們稱這些步驟為指令,每乙個指令在你的映象中建立乙個新的層。指令包含下面行為:

這些指令儲存在dockerfile中。docker在構建映象過程中讀取這個dockerfile,執行裡面的指令並返回終於的映象。

docker註冊中心是docker映象的儲存中心,當你構建完乙個映象後便能夠將其推送到docker hub或你自己的註冊中心。

利用dockerclient,你能夠搜尋已經公布的映象,然後將其拉取到你的docker主機上,以便於基於這些映象構建容器。

docker hub為映象提供了公共的和私有的儲存空間。

乙個容器包含作業系統、使用者加入的檔案以及相關的元資料。我們知道,每乙個容器都是從映象中構建出來的,這個映象告訴docker容器用到什麼資源、當容器載入時啟動哪個程序以及容器啟動時的其他配置。docker映象是僅僅讀的。當docker從乙個映象執行乙個容器時。它會在映象的上層加入乙個用於執行應用的可讀寫的層(利用的就是上文提到的union file system)。

無論是通過docker命令還是api呼叫的方式。dockerclient都會通知docker的守護程序執行乙個容器。

sudo docker run -i -t ubuntu /bin/bash
我們來看一下這個命令,dockerclient利用docker命令並結合run選項來啟動乙個容器,乙個最小配置的dockerclient執行乙個容器須要告訴docker守護程序下面事項:

那麼我們看看執行上述命令時究竟發生了什麼?

依照順序,docker依次幹了例如以下事情:

建立乙個新的容器: 假設docker本地server中存在這個映象。那麼就據此來啟動乙個容器。

分配乙個檔案每戶而且將其掛載到乙個可讀寫的層: 容器在此檔案系統中被建立。而且將其作為乙個可讀寫的層加入到映象中。

分配乙個網路或橋接的介面: 建立乙個網路的介面以便於docker容器可以訪問本機。

執行指定的程序: 執行你的應用程式,然後;

獲取並提**用程式的輸出: 連線標準輸入、標準輸出和標準錯誤介面,這樣你便可以觀察到程式執行的一切。

如今你已經執行了乙個容器,這樣你便能夠管理你的容器、與應用程式進行互動。當執行結束是停止或者刪除你的容器。

docker是用go語言實現的。用到了一些linux核心的特性實現上述功能。

docker在為容器提供乙個隔離的工作空間時。用到了命名空間的技術,當你執行乙個容器時,docker會為此容器建立一組命名空間。

這樣便能夠提供乙個隔離的層:每乙個容器執行在自己的命名空間中,而外部不能訪問這個層。

docker用到的一些命名空間有:

docker還用到了另外一項技術叫cgroups或者叫控制組(control groups)。實現程式執行環境的隔離的關鍵在於使這些程式僅僅用到它們須要的資源,這就行保證這些容器是主機服務環境小社會中的好市民。控制組同意docker在不同的容器之間共享硬體資源,須要時加入一些限制和約束,比如限制乙個容器最大訪問記憶體量。

docker容器將這些元件合併在一起,我們稱之為容器格式,容器的預設格式稱為libcontainer。docker還支援利用lxc技術的傳統linux容器格式,未來還將會支援其他的容器格式。比如:與bsd jails或者solaris zones實現整合。

Docker 官方文件翻譯

docker compose 是利用docker來執行多個容器的工具。利用compose 在乙個檔案中定義多個容器,然後利用乙個單獨的命令,可以執行你所想做的任何事情。compose 能較好的作為開發環境的假設,伺服器腳手架以及ci方面的應用。我們不推薦使用在生產環境中。使用compose 需要一下...

Docker官方文件解讀 2

docker run hello world 在過去,如果你寫乙個pyhton的應用,你的第一步是在你的機器上安裝python的開發環境。但是需要你的機器上的執行環境與應用程式完美適合,並且也需要匹配生產環境。利用docker,你能移植乙個便捷的python的執行庫作為映象,無需安裝。然後,通過構建...

Docker官方文件解讀 4

在第3部分中,介紹了你在第2部分中編寫的應用程式,並定義了它應該如何在生產環境中執行,將其轉化為服務,並在此過程中將其擴充套件5倍例項。在第4部分中,將此應用程式部署到群集上,並在多台機器上執行它。通過將多台機器連線到稱為swarm的 dockerized 群集,使多容器,多機器應用成為可能。swa...