docker最初是dotcloud公司創始人solomon hykes發起的乙個公司內部專案,它是基於dotcloud公司多年雲服務技術的一次革新,並於2023年3月以 apache 2.0授權協議開源,主要專案**在github上進行維護。docker專案後來還加入了linux**會,並成立推動開放容器聯盟(oci)。
docker自開源後受到廣泛的關注和討論,至今其github專案已經超過5萬7千個星標和一萬多個fork。甚至由於docker專案的火爆,在2023年底,dotcloud公司決定改名為docker。docker最初是在ubuntu 12.04上開發實現的;red hat則從rhel 6.5開始對docker進行支援;google也在其paas產品中廣泛應用docker。
docker使用google公司推出的go 語言進行開發實現,基於linux核心的cgroup,namespace,以及overlayfs類的union fs等技術,對程序進行封裝隔離,屬於作業系統層面的虛擬化技術。由於隔離的程序獨立於宿主和其它的隔離的程序,因此也稱其為容器。最初實現是基於lxc,從0.7版本以後開始去除lxc,轉而使用自行開發的libcontainer,從1.11開始,則進一步演進為使用runc和containerd。
runc是乙個linux命令列工具,用於根據oci容器執行時規範建立和執行容器docker在容器的基礎上,進行了進一步的封裝,從檔案系統、網路互聯到程序隔離等等,極大的簡化了容器的建立和維護。使得docker技術比虛擬機器技術更為輕便、快捷。containerd是乙個守護程式,它管理容器生命週期,提供了在乙個節點上執行容器和管理映象的最小功能集
傳統虛擬機器技術是虛擬出一套硬體後,在其上執行乙個完整作業系統,在該系統上再執行所需應用程序;而容器內的應用程序直接執行於宿主的核心,容器內沒有自己的核心,而且也沒有進行硬體虛擬。作為一種新興的虛擬化方式,docker跟傳統的虛擬化方式相比具有眾多的優勢。
更高效的系統資源利用
由於容器不需要進行硬體虛擬以及執行完整作業系統等額外開銷,docker對系統資源的利用率更高。無論是應用執行速度、記憶體損耗或者檔案儲存速度,都要比傳統虛擬機器技術更高效。因此,相比虛擬機器技術,乙個相同配置的主機,往往可以執行更多數量的應用。
更快速的啟動時間
傳統的虛擬機器技術啟動應用服務往往需要數分鐘,而docker容器應用,由於直接執行於宿主核心,無需啟動完整的作業系統,因此可以做到秒級、甚至毫秒級的啟動時間。大大的節約了開發、測試、部署的時間。
一致的執行環境
開發過程中乙個常見的問題是環境一致性問題。由於開發環境、測試環境、生產環境不一致,導致有些bug並未在開發過程中被發現。而docker的映象提供了除核心外完整的執行時環境,確保了應用執行環境一致性,從而不會再出現 「這段**在我機器上沒問題啊」 這類問題。
持續交付和部署
使用docker可以通過定製應用映象來實現持續整合、持續交付、部署。開發人員可以通過dockerfile來進行映象構建,並結合持續整合系統進行整合測試,而運維人員則可以直接在生產環境中快速部署該映象,甚至結合持續部署系統進行自動部署。
而且使用dockerfile使映象構建透明化,不僅僅開發團隊可以理解應用執行環境,也方便運維團隊理解應用執行所需條件,幫助更好的生產環境中部署該映象。
更輕鬆的遷移
由於docker確保了執行環境的一致性,使得應用的遷移更加容易。docker可以在很多平台上執行,無論是物理機、虛擬機器、公有雲、私有雲,甚至是筆記本,其執行結果是一致的。因此使用者可以很輕易的將在乙個平台上執行的應用,遷移到另乙個平台上,而不用擔心執行環境的變化導致應用無法正常執行的情況。
更輕鬆的維護和擴充套件
docker使用的分層儲存以及映象的技術,使得應用重複部分的復用更為容易,也使得應用的維護更新更加簡單,基於基礎映象進一步擴充套件映象也變得非常簡單。此外,docker團隊同各個開源專案團隊一起維護了一大批高質量的官方映象,既可以直接在生產環境使用,又可以作為基礎進一步定製,大大的降低了應用服務的映象製作成本。
特性容器
虛擬機器啟動
秒級分鐘級
硬碟使用
一般為mb
一般為gb
效能接近原生
弱於系統支援量
單機支援上千個容器
一般幾十個
docker包括三個基本概念
理解了這三個概念,就理解了docker的整個生命週期。
作業系統分為核心空間和使用者空間。對於linux而言,核心啟動後,會掛載root檔案系統為其提供使用者空間支援。而docker映象(image),就相當於是乙個root檔案系統。比如官方映象ubuntu:18.04就包含了完整的一套ubuntu 18.04最小系統的root檔案系統。
docker映象是乙個特殊的檔案系統,除了提供容器執行時所需的程式、庫、資源、配置等檔案外,還包含了一些為執行時準備的一些配置引數(如匿名卷、環境變數、使用者等)。映象不包含任何動態資料,其內容在構建之後也不會被改變。
因為映象包含作業系統完整的root檔案系統,其體積往往是龐大的,因此在docker設計時,就充分利用union fs的技術,將其設計為分層儲存的架構。所以嚴格來說,映象並非是像乙個iso那樣的打包檔案,映象只是乙個虛擬的概念,其實際體現並非由乙個檔案組成,而是由一組檔案系統組成,或者說,由多層檔案系統聯合組成。
映象構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在自己這一層。比如,刪除前一層檔案的操作,實際不是真的刪除前一層的檔案,而是僅在當前層標記為該檔案已刪除。在最終容器執行的時候,雖然不會看到這個檔案,但是實際上該檔案會一直跟隨映象。因此,在構建映象的時候,需要額外小心,每一層盡量只包含該層需要新增的東西,任何額外的東西應該在該層構建結束前清理掉。
分層儲存的特徵還使得映象的復用、定製變的更為容易。甚至可以用之前構建好的映象作為基礎層,然後進一步新增新的層,以定製自己所需的內容,構建新的映象。
映象(image
)和容器(container
)的關係,就像是物件導向程式設計中的類和例項一樣,映象是靜態的定義,容器是映象執行時的實體。容器可以被建立、啟動、停止、刪除、暫停等。
容器的實質是程序,但與直接在宿主執行的程序不同,容器程序執行於屬於自己的獨立的namespace。因此容器可以擁有自己的root檔案系統、自己的網路配置、自己的程序空間,甚至自己的使用者id空間。容器內的程序是執行在乙個隔離的環境裡,使用起來,就好像是在乙個獨立於宿主的系統下操作一樣。這種特性使得容器封裝的應用比直接在宿主執行更加安全。
前面講過映象使用的是分層儲存,容器也是如此。每乙個容器執行時,是以映象為基礎層,在其上建立乙個當前容器的儲存層,我們可以稱這個為容器執行時讀寫而準備的儲存層為容器儲存層。
容器儲存層的生存週期和容器一樣,容器消亡時,容器儲存層也隨之消亡。因此,任何儲存於容器儲存層的資訊都會隨容器刪除而丟失。
映象構建完成後,可以很容易的在當前宿主機上執行,但是,如果需要在其它伺服器上使用這個映象,我們就需要乙個集中的儲存、分發映象的服務,docker registry就是這樣的服務。
乙個docker registry中可以包含多個倉庫(repository
);每個倉庫可以包含多個標籤(tag
);每個標籤對應乙個映象。
通常,乙個倉庫會包含同乙個軟體不同版本的映象,而標籤就常用於對應該軟體的各個版本。我們可以通過《倉庫名》:《標籤》
的格式來指定具體是這個軟體哪個版本的映象,如果不給出標籤,將以latest
作為預設標籤。
以ubuntu
映象為例,ubuntu
是倉庫的名字,其內包含有不同的版本標籤,如16.04、18.04。我們可以通過ubuntu:16.04
,或者ubuntu:18.04
來具體指定所需哪個版本的映象。如果忽略了標籤,比如ubuntu
,那將視為ubuntu:latest
。
倉庫名經常以兩段式路徑形式出現,比如jwilder/nginx-proxy
,前者往往意味著docker registry多使用者環境下的使用者名稱,後者則往往是對應的軟體名。但這並非絕對,取決於所使用的具體docker registry的軟體或服務。
docker registry公開服務
最常使用的registry公開服務是官方的docker hub,這也是預設的registry,並擁有大量的高質量的官方映象。除此以外,還有red hat的quay.io;google的google container registry,kubernetes的映象使用的就是這個服務。
國內也有一些雲服務商提供類似於docker hub的公開服務。比如網易雲映象服務、daocloud映象市場、阿里雲映象庫等。
私有docker registry
除了使用公開服務外,使用者還可以在本地搭建私有docker registry。docker官方提供了docker registry映象,可以直接使用做為私有registry服務。
開源的docker registry映象只提供了docker registry api的服務端實現,足以支援docker命令,不影響使用。但不包含圖形介面,以及映象維護、使用者管理、訪問控制等高階功能。在官方的商業化版本docker trusted registry中,提供了這些高階功能。
除了官方的docker registry外,還有第三方軟體實現了docker registry api,甚至提供了使用者介面以及一些高階功能,比如harbor和nexus。
Matplotlib 簡介與基本概念
matplotlib是乙個python 2d繪相簿,是python中公認的資料視覺化工具,pandas和seaborn的繪圖介面其實也是基於matplotlib所作的高階封裝。matplotlib的影象是畫在figure上,每乙個figure又包含了乙個或多個axes 乙個可以指定座標系的子區域,是...
Docker基本概念
docker是開發人員和系統管理員構建,發布和執行應用程式的平台。docker允許您快速使用元件組裝應用程式,並消除運送 時可能產生的改變。docker允許您盡快測試並將 部署到生產環境中。docker可以簡化軟體交付,是通過簡化構建包含應用程式整個環境或應用程式作業系統的映象,並共享這個映象。應用...
Docker基本概念
docker 包括三個基本概念 理解了這三個概念,就理解了 docker 的整個生命週期。docker 映象就是乙個唯讀的模板。例如 乙個映象可以包含乙個完整的 ubuntu 作業系統環境,裡面僅安裝了 apache 或使用者需要的其它應用程式。映象可以用來建立 docker 容器。docker 利...