持更中…
什么是Docker?
Docker 是一個開源的應用容器引擎,基于Go語言 并遵從 Apache2.0 協議開源,
Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實作虛擬化,
容器是完全使用沙箱機制,相互之間不會有任何介面(類似 iPhone 的 app),更重要的是容器性能開銷極低,
容器不需要提前封裝一個系統,它共享宿主機,理解為作業系統的一個行程,
Docker 從 17.03 版本之后分為 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版)
官網:https://docs.docker.com/get-started/overview/
Docker前身LXC
LXC為Linux Container的簡寫,可以提供輕量級的虛擬化,以便隔離行程和資源,而且不需要提供指令解釋機制以及全虛擬化的其他復雜性,容器有效地將由單個作業系統管理的資源劃分到孤立的組中,以更好地在孤立的組之間平衡有沖突的資源使用需求,
與傳統虛擬化技術相比,LXC的優勢在于:
(1)與宿主機使用同一個內核,性能損耗小;
(2)不需要指令級模擬;
(3)不需要即時(Just-in-time)編譯;
(4)容器可以在CPU核心的本地運行指令,不需要任何專門的解釋機制;
(5)避免了準虛擬化和系統呼叫替換中的復雜性;
(6)輕量級隔離,在隔離的同時還提供共享機制,以實作容器與宿主機的資源共享,
總結:Linux Container是一種輕量級的虛擬化的手段,
Linux Container提供了在單一可控主機節點上支持多個相互隔離的server container同時執行的機制,Linux Container有點像chroot,提供了一個擁有自己行程和網路空間的虛擬環境,但又有別于虛擬機,因為lxc是一種作業系統層次上的資源的虛擬化,
LXC與docker什么關系?
docker并不是LXC替代品,docker底層使用了LXC來實作,LXC將linux行程沙盒化,使得行程之間相互隔離,并且能夠控制各行程的資源分配,
在LXC的基礎之上,docker提供了一系列更強大的功能,
傳統虛擬化與容器技術對比
VM和container對比:
虛擬機運行的是一個完整的作業系統,通過虛擬機管理程式對主機資源進行虛擬訪問,相比之下需要的資源更多,
容器在linux上本機運行,并與其他容器共享主機的內核,它運行一個獨立的行程,不占用其他任何可執行檔案的記憶體,非常輕量,


Docker容器的優勢
對于開發人員:Build once、Run anywhere,
對于運維人員:Configure once、Run anything,
運維人員把容器做好,然后給開發人員,開發人員可以直接在上邊寫專案,然后可以直接上線,
Docker能夠將應用程式與基礎設施分開,以便可以快速交付軟體,使用 Docker,可以像管理應用程式一樣管理基礎設施,通過利用 Docker 的快速交付、測驗和部署代碼的方法,可以顯著減少撰寫代碼和在生產中運行代碼之間的延遲,
名詞解釋
鏡像images
docker鏡像就是一個只讀模板,其中包括運行應用程式所需要的所有內容包含代碼,運行時間,庫、環境變數、和組態檔,每個鏡像有不同的標簽(tag),比如,一個鏡像可以包含一個完整的centos,里面僅安裝apache或用戶的其他應用,鏡像可以用來創建docker容器,用戶可以直接從其他人那里下一個已經做好的鏡像來直接使用,
容器containers
docker利用容器來運行應用,容器是從鏡像創建的運行實體,它可以被啟動,開始、停止、洗掉、每個容器都是互相隔離的,保證安全的平臺,可以將容器連接到一個或多個網路,為其附加存盤,甚至可以根據其當前狀態創建新映像,
可以控制容器的網路、存盤或其他底層子系統與其他容器或主機之間的隔離程度,
容器由其映像以及在創建或啟動它時提供給它的任何配置選項定義,
當容器被移除時,未存盤在持久存盤中的對其狀態的任何更改都會消失,
當被運行時有鏡像狀態和用戶行程,可以使用docker ps 查看,
守護行程Daemon / dockerd
Docker 守護行程偵聽 Docker API 請求并管理 Docker 物件,例如影像、容器、網路和卷,守護行程還可以與其他守護行程通信以管理 Docker 服務,
Docker Client通過命令列與Docker Damon通信,完成Docker相關操作,
注冊表registry
存盤 Docker 鏡像,Docker Hub 是一個任何人都可以使用的公共注冊中心,Docker 默認配置為在 Docker Hub 上查找鏡像,甚至可以運行自己的私有注冊表,使用docker pull或docker run命令時,所需的映像將從配置的注冊表中提取,使用docker push命令時,映像會被推送到配置的注冊表中,
repostory倉庫
倉庫是集中存盤鏡像檔案的地方,registry是倉庫主從服務器,
倉庫分為兩種,公有參考,和私有倉庫,最大的公開倉庫是docker Hub,存放了數量龐大的鏡像供用戶下載,國內有docker pool,這里倉庫的概念與Git類似,registry可以理解為github這樣的托管服務,
Docker Compose
Compose 是用于定義和運行多容器 Docker 應用程式的工具,通過 Compose,可以使用 YML 檔案來配置應用程式需要的所有服務,然后,使用一個命令,就可以從 YML 檔案配置中創建并啟動所有服務,
Compose 使用的三個步驟:
1、使用 Dockerfile 定義應用程式的環境,
2、使用 docker-compose.yml 定義構成應用程式的服務,這樣它們可以在隔離環境中一起運行,
3、最后,執行 docker-compose up 命令來啟動并運行整個應用程式,
Docker架構
Docker 使用客戶端-服務器架構,Docker客戶端與 Docker守護行程對話, Docker守護行程負責構建、運行和分發 Docker 容器的繁重作業,Docker 客戶端和守護程式可以在同一系統上運行,或者可以將 Docker 客戶端連接到遠程 Docker 守護程式,Docker 客戶端和守護行程使用 REST API、UNIX 套接字或網路介面進行通信,另一個 Docker 客戶端是 Docker Compose,它允許使用由一組容器組成的應用程式,
通過上面名詞解釋我們掌握了一些基本概念,在此基礎上,我們簡單解讀一下該圖:
Docker Client通過命令列與Docker Damon(守護行程)通信,
客戶端輸入docker build命令后,守護行程收到后會執行去創建一個新的鏡像,
客戶端輸入docker pull命令后,守護行程會從配置的注冊表(即倉庫)中提取用戶所需的鏡像并將其拉取到主機,
客戶端輸入docker run命令后,守護行程會根據要運行的容器,去找相應鏡像然后在容器上運行,

鏡像的分層結構

容器共享宿主機的Kernel,Base Image鏡像提供的是最小的Linux發行版,同一docker主機支持運行多種Linux發行版(即base鏡像之上的多層新的鏡像),
采用分層結構的最大好處是:共享資源!
新鏡像是從 base 鏡像一層一層疊加生成的,每安裝一個軟體,就在現有鏡像的基礎上增加一層, 比如:有多個鏡像都從相同的 base 鏡像構建而來,那么 Docker Host 只需在磁盤上保存一份 base 鏡像;同時記憶體中也只需加載一份 base 鏡像,就可以為所有容器服務了,而且鏡像的每一層都可以被共享,

當容器啟動時,一個新的可寫層被加載到鏡像的頂部,這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層”,
所有對容器的改動 - 無論添加、洗掉、還是修改檔案都只會發生在容器層中,
鏡像層數量可能會很多,所有鏡像層會聯合在一起組成一個統一的檔案系統,如果不同層中有一個相同路徑的檔案,比如 /a,上層的 /a 會覆寫下層的 /a,也就是說用戶只能訪問到上層中的檔案 /a,在容器層中,用戶看到的是一個疊加之后的檔案系統,讀取/修改/洗掉檔案都會從鏡像層依次從上至下查找,讀到符合的就執行,
容器層記錄對鏡像的修改!!!所有鏡像層都是只讀的,不會被容器修改,所以鏡像可以被多個容器共享,
一個鏡像最多127層,
Docker倉庫
Docker 倉庫是用來包含鏡像的位置,Docker提供一個注冊服務器 (Register)來保存多個倉庫,每個倉庫又可以包含多個具備不同 tag的鏡像, Docker運行中使用的默認倉庫是 Docker Hub 公共倉庫,docker hub是docker公司維護的公共倉庫,用戶可以免費使用,也可以購買私有倉庫,
Registry 作業原理
一次docker pull 或 push背后發生的事情:

index服務主要提供鏡像索引以及用戶認證的功能,
當下載一個鏡像的時候,首先會去index服務上做認證,然后查找鏡像所在的registry的地址并發回給 docker客戶端,docker客戶端再從registry下載鏡像,在下載程序中registry會去index校驗客戶端token的合法性,index回傳給registry客戶端token,如果一樣,將用戶需要的回傳給用戶,
不同鏡像可以保存在不同的registry服務上, 其索引資訊都放在index服務上,
Docker Registry有三個角色,分別是index、registry和registry client,
? index ? 負責并維護有關用戶帳戶、鏡像的校驗以及公共命名空間的資訊,
? registry ? 是鏡像和圖表的倉庫,它不具有本地資料庫以及不提供用戶認證,通過 Index Auth service的Token的方式進行認證,
? Registry Client ? Docker充當registry客戶端來維護推送和拉取,以及客戶端的授權,



轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/289724.html
標籤:其他
上一篇:在新服務器上安裝python環境
下一篇:Git的使用教程(詳細)
