Docker源碼分析

網站

更多書籍點擊進入>> CiCi島php

下載

電子版僅供預覽及學習交流使用,下載後請24小時內刪除,支持正版,喜歡的請購買正版書籍html

封頁

封頁

編輯推薦

  本書是一本引導讀者深刻了解Docker實現原理的技術普及讀物,主要目標是經過對Docker架構和源代碼的詳細講解和解剖,幫助讀者對Docker的底層實現有一個全面的理解。   做者經過大量的流程圖和代碼片斷對Docker的架構、Docker的重要模塊,特別是對Swarm、Machine和Compose這三個模塊進行了詳細介紹和深度剖析,不管是Docker的使用者仍是開發者,經過閱讀此書均可以對Docker有更深入的理解,可以更好的使用或者開發Docker。node

內容簡介

  本書是一本引導讀者深刻了解Docker實現原理的技術普及讀物,主要目標是經過對Docker架構和源代碼的詳細講解和解剖,幫助讀者對Docker的底層實現有一個全面的理解。本書的內容主要集中於三部分:Docker的架構、Docker的模塊,以及Docker的三駕馬車Swarm、Machine和Compose。   第一部分(第1章)主要從宏觀的角度和讀者一塊兒領略Docker的架構設計,並初步介紹架構中各模塊的職責。   第二部分(第2~14章)是本書的主體部分,主要針對Docker中多個重要的模塊進行具體深刻分析,包括DockerClient、DockerDaemon、DockerServer、Docker網絡、Docker鏡像、Docker容器等。讀者能夠發現,Docker的模塊之間耦合度很是低,很適合按部就班,層層深刻。第2~8章主要從Docker軟件的架構入手,勾勒骨架;第9~11章集中於Docker鏡像技術,夯實基礎;第12~14章則進一步分析Docker容器的始末,闡述本質。   第三部分(第15~17章)介紹Docker生態三駕馬車—Swarm、Machine和Compose。Docker擁有強大的單機能力,三駕馬車能夠很好地補充Docker的跨主機能力以及部署能力。讀者能夠經過這幾章感覺Docker生態中其餘功能強大的軟件。git

目 錄

讚譽

前言
第1章 Docker架構
1.1 引言
1.2 Docker總架構圖
1.3 Docker各模塊功能與實現分析
1.3.1 Docker Client
1.3.2 Docker Daemon
1.3.3 Docker Registry
1.3.4 Graph
1.3.5 Driver
1.3.6 libcontainer
1.3.7 Docker Container
1.4 Docker運行案例分析
1.4.1 docker pull
1.4.2 docker run
1.5 總結 程序員


第2章 Docker Client建立與命令執行
2.1 引言
2.2 建立Docker Client
2.2.1 Docker命令的flag參數解析
2.2.2 處理flag信息並收集Docker Client的配置信息
2.2.3 如何建立Docker Client
2.3 Docker命令執行
2.3.1 Docker Client解析請求命令
2.3.2 Docker Client執行請求命令
2.4 總結 github


第3章 啓動Docker Daemon
3.1 引言
3.2 Docker Daemon的啓動流程
3.3 mainDaemon()的具體實現
3.3.1 配置初始化
3.3.2 flag參數檢查
3.3.3 建立engine對象
3.3.4 設置engine的信號捕獲
3.3.5 加載builtins
3.3.6 使用goroutine加載daemon
 對象並運行
3.3.7 打印Docker版本及驅動信息
3.3.8 serveapi的建立與運行
3.4 總結 docker


第4章 Docker Daemon之NewDaemon實現
4.1 引言
4.2 NewDaemon具體實現
4.3 應用配置信息
4.3.1 配置Docker容器的MTU
4.3.2 檢測網橋配置信息
4.3.3 查驗容器間的通訊配置
4.3.4 處理網絡功能配置
4.3.5 處理PID文件配置
4.4 檢測系統支持及用戶權限
4.5 配置工做路徑
4.6 加載並配置graphdriver
4.6.1 建立graphdriver
4.6.2 驗證btrfs與SELinux的兼容性
4.6.3 建立容器倉庫目錄
4.6.4 遷移容器至aufs類型
4.6.5 建立鏡像graph
4.6.6 建立volumesdriver以及volumes graph
4.6.7 建立TagStore
4.7 配置Docker Daemon網絡環境
4.7.1 建立Docker網絡設備
4.7.2 啓用iptables功能
4.7.3 啓用系統數據包轉發功能
4.7.4 建立DOCKER鏈
4.7.5 註冊處理方法至Engine
4.8 建立graphdb並初始化
4.9 建立execdriver
4.10 建立daemon實例
4.11 檢測DNS配置
4.12 啓動時加載已有Docker容器
4.13 設置shutdown的處理方法
4.14 返回daemon對象實例
4.15 總結 json


第5章 Docker Server的建立
5.1 引言
5.2 Docker Server建立流程
5.2.1 建立名爲"serveapi"的Job
5.2.2 配置Job環境變量
5.2.3 運行Job
5.3 ServeApi運行流程
5.4 ListenAndServe實現
5.4.1 建立router路由實例
5.4.2 建立listener監聽實例
5.4.3 建立http.Server
5.4.4 啓動API服務
5.5 總結 api


第6章 Docker Daemon網絡
6.1 引言
6.2 Docker Daemon網絡介紹
6.3 Docker Daemon網絡配置接口
6.4 Docker Daemon網絡初始化
6.4.1 啓動Docker Daemon傳遞flag參數
6.4.2 解析網絡flag參數
6.4.3 預處理flag參數
6.4.4 肯定Docker網絡模式
6.5 建立Docker網橋
6.5.1 提取環境變量
6.5.2 肯定Docker網橋設備名
6.5.3 查找bridgeIface網橋設備
6.5.4 bridgeIface已建立
6.5.5 bridgeIface未建立
6.5.6 獲取網橋設備的網絡地址
6.5.7 配置Docker Daemon的iptables
6.5.8 配置網絡設備間數據報轉發功能
6.5.9 註冊網絡Handler
6.6 總結 安全


第7章 Docker容器網絡
7.1 引言
7.2 Docker容器網絡模式
7.2.1 bridge橋接模式
7.2.2 host模式
7.2.3 other container模式
7.2.4 none模式
7.3 Docker Client配置容器網絡模式
7.3.1 使用Docker Client
7.3.2 runconfig包解析
7.3.3 CmdRun執行
7.4 Docker Daemon建立容器網絡流程
7.4.1 建立容器之網絡配置
7.4.2 啓動容器之網絡配置
7.5 execdriver網絡執行流程
7.5.1 建立libcontainer的Config對象
7.5.2 調用libcontainer的namespaces啓動容器
7.6 libcontainer實現內核態網絡配置
7.6.1 建立exec.Cmd
7.6.2 啓動exec.Cmd建立進程
7.6.3 爲容器進程初始化網絡環境
7.7 總結


第8章 Docker鏡像
8.1 引言
8.2 Docker鏡像介紹
8.3 rootfs
8.4 Union Mount
8.5 image
8.6 layer
8.7 總結


第9章 Docker鏡像下載
9.1 引言
9.2 Docker鏡像下載流程
9.3 Docker Client
9.3.1 解析鏡像參數
9.3.2 配置認證信息
9.3.3 發送API請求
9.4 Docker Server
9.4.1 解析請求參數
9.4.2 建立並配置Job
9.4.3 觸發執行Job
9.5 Docker Daemon
9.5.1 解析Job參數
9.5.2 建立session對象
9.5.3 執行鏡像下載
9.6 總結


第10章 Docker鏡像存儲
10.1 引言
10.2 鏡像註冊
10.3 驗證鏡像ID
10.4 建立鏡像路徑
10.4.1 建立mnt、diff和layers子目錄
10.4.2 掛載祖先鏡像並返回根目錄
10.5 存儲鏡像內容
10.5.1 解壓鏡像內容
10.5.2 收集鏡像大小並記錄
10.5.3 存儲jsonData信息
10.6 註冊鏡像ID
10.7 總結


第11章 docker build實現
11.1 引言
11.2 docker build執行流程
11.2.1 Docker Client與docker build
11.2.2 Docker Server與docker build
11.2.3 Docker Daemon與docker build
11.3 Dockerfile命令解析流程
11.4 Dockerfile命令分析
11.4.1 FROM命令
11.4.2 RUN命令
11.4.3 ENV命令
11.5 總結


第12章 Docker容器建立
12.1 引言
12.2 Docker容器運行流程
12.3 Docker Daemon建立容器對象
12.3.1 LookupImage
12.3.2 CheckDepth
12.3.3 mergeAndVerifyConfig
12.3.4 newContainer
12.3.5 createRootfs
12.3.6 ToDisk
12.3.7 Register
12.4 Docker Daemon啓動容器
12.4.1 setupContainerDns
12.4.2 Mount
12.4.3 initializeNetworking
12.4.4 verifyDaemonSetting
12.4.5 prepareVolumesForContainer
12.4.6 setupLinkedContainers
12.4.7 setupWorkingDirectory
12.4.8 createDaemonEnvironment
12.4.9 populateCommand
12.4.10 setupMountsForContainer
12.4.11 waitForStart
12.5 總結


第13章 dockerinit啓動
13.1 引言
13.2 dockerinit介紹
13.2.1 dockerinit初始化內容
13.2.2 dockerinit與Docker Daemon
13.3 dockerinit執行入口
13.3.1 createCommand分析
13.3.2 namespace.exec
13.4 dockerinit運行
13.4.1 reexec.Init()的分析
13.4.2 dockerinit的執行流程
13.5 libcontainer的運行
13.5.1 Docker Daemon設置cgroups參數
13.5.2 Docker Daemon建立網絡棧資源
13.5.3 dockerinit配置網絡棧
13.5.4 dockerinit初始化mount namespace
13.5.5 dockerinit完成namespace配置
13.5.6 dockerinit執行用戶命令Entrypoint
13.6 總結


第14章 libcontainer介紹
14.1 引言
14.2 Docker、libcontainer以及LXC的關係
14.3 libcontainer模塊分析
14.3.1 namespace
14.3.2 cgroup
14.3.3 網絡
14.3.4 掛載
14.3.5 設備
14.3.6 nsinit
14.3.7 其餘模塊
14.4 總結


第15章 Swarm架構設計與實現
15.1 引言
15.2 Swarm架構
15.2.1 Swarm Node
15.2.2 Docker Node
15.2.3 node discovery
15.2.4 scheduler
15.3 Swarm命令
15.3.1 swarm create
15.3.2 swarm manage
15.3.3 swarm join
15.3.4 swarm list
15.4 總結


第16章 Machine架構設計與實現
16.1 引言
16.2 Machine架構
16.2.1 Machine
16.2.2 Store
16.2.3 Host
16.2.4 Driver
16.2.5 Provisioner
16.2.6 Machine運行流程
16.3 Machine與Swarm的結合
16.4 總結


第17章 Compose架構設計與實現
17.1 引言
17.2 Compose介紹
17.3 Compose架構
17.4 Compose評價
17.4.1 Compose單機能力
17.4.2 Compose跨節點能力
17.4.3 Compose與Swarm
17.5 總結

 

前 言

  Praise 贊  譽
  像谷歌同樣部署本身的應用,這是不少軟件工程師的夢想。Docker的目標是圓不少人的夢。自從InfoQ推出Docker系列文章,做爲操做系統課程教師的我一直在學習並關注Docker的茁壯成長。
  當我發現這上面刊登的「Docker源碼分析」系列文章的做者竟然是咱們課程組的研究生助教孫宏亮時,驚喜之情溢於言表。宏亮對Docker的理解十分深入,他本人是Docker的積極擁護者、倡導者和貢獻者。他在研究生畢業之後投身到了創業公司DaoCloud,去爲Docker的夢想開創美好的將來。
  最近,我又欣喜地發現,這系列文章以及後續章節即將正式出版成書,有機會同更多的Docker用戶、開發者、學習者見面。本書經過分析解讀Docker源碼,讓讀者瞭解 Docker的內部結構和實現,以便更好地使用Docker。該書的內容組織深刻淺出,表述準確到位, 有大量流程圖和代碼片斷幫助讀者理解Docker各個功能模塊的流程,是學習Docker開源系統的良師益友。
  —壽黎旦,浙江大學計算機學院教授
  近年來,Docker迅速風靡了雲計算世界,可是專門針對Docker的技術實現進行深刻分析的文章卻相對較少。這一方面因爲Docker技術變化很快,源碼分析很快會跟不上版本發展;另外一方面,對源代碼的解析,須要對整個Docker設計具有全局的視角,才能深刻淺出地找到源碼中的脈絡。
  宏亮的這本《Docker源碼分析》,恰如其時的出現,彌補了這個空白,對於但願參與到Docker社區、參與代碼貢獻或構建本身的Docker應用環境的讀者來講,應是一本案頭必備書籍。
  —王興宇,《Linux中國》創始人
  在崇尚源碼至上的工程師文化裏,文檔介紹、發佈會材料都是蒼白的,惟有研讀源碼,才能深入理解軟件背後的原理。與全部其餘軟件同樣,讀源碼並非學習Docker最快的途徑,可是若是有人通讀源碼後給出了詳細分析,你就能夠輕鬆地站在巨人的肩膀上。
  很高興看到國內這麼快就出版源碼分析的書籍。對於全部想在Docker方面進階和想晉升爲高端用戶的讀者,都值得閱讀本書,也但願經過《Docker源碼分析》一書,能夠誕生更多的社區貢獻者,共同推進Docker的發展。
  —黃強,華爲Docker Committer
  值得自豪的是,就在Docker蓬勃發展之際,第一本詳盡剖析Docker源碼的著做出自國人之手。
  本書在每章宏觀的流程梳理背後都伴隨有更加細緻深刻的源碼分析。不管讀者是隻想了解使用Docker,仍是抱着深刻理解Docker並參與社區開發、二次開發的心態,本書都值得一讀。
  —胡科平,華爲Docker Committer
  這本書從源碼的角度對Docker的實現原理進行了深刻的探討和細膩的講解,將當前熱門的容器技術的背後機理講解得深刻淺出明白透徹。不管是Docker的用戶仍是開發者,經過閱讀本書均可以對Docker有更深入的理解,可以更好地使用或者開發Docker。
  —雷繼棠,華爲Docker Committer
  Docker已是一個成長2年時間的雲計算技術,它正在以驚人的速度在全球範圍內擴張本身的「疆土」。我做爲Docker中國區的開發者,很是但願能看到有一本書詳細地告訴我,Docker的每個細節是如何實現的。因此當我在InfoQ上看到宏亮的「Docker源碼分析」專欄時眼前一亮。今天,它終於彙編成書擺在你個人眼前。我但願你能在這本書上學到更多Docker技術的精髓思想,在實戰Docker技術時能夠運用自如!
  —肖德時,數人科技CTO
  我家裏的書櫃中至今仍然保留着一本《Linux內核徹底註釋》,它伴隨我很長一段時間,使我受益不淺。10年以後,當我拿到宏亮的《Docker源代碼分析》草稿,昨日又重現。這本書不管是對學習Docker,仍是掌握Go語言,都是很是好的一手資源。雷鋒不常有,你們要支持!
  —趙鵬,VisualOps創始人
  Foreword 序
  三年前,我在VMware負責Cloud Foundry這一款開源PaaS產品在中國的開發者社區和生態系統建設工做。當時關於Cloud Foundry的中文文檔很是少,更不用說有深度的技術乾貨了,因此當CSDN上出現了一個專門從底層模塊和源碼的角度,對Cloud Foundry作深度剖析的系列博客文章時,一會兒就引發了個人注意。
  通過一番「人肉搜索」,我很是驚奇的發現,這一系列乾貨的做者孫宏亮,居然是浙江大學計算系的一年級研究生。當時,VMware跟浙江大學在Cloud Foundry方面有比較深刻的合做,浙大計算機系的SEL實驗室,投入了精銳的師資力量,從事分佈式系統和新一代PaaS的研究工做。宏亮初入浙江大學,就在這樣的氛圍下開始了他的研究生求學生涯,應當說是很是幸運的。
  宏亮在CSDN上的系列文章,主打「源碼分析」,這正是當時開源社區內比較缺乏的內容。提筆寫「源碼分析」,須要必定的勇氣,閱讀源碼須要耗費大量的精力, 須要從數十萬行代碼中整理出清晰的邏輯,從中抽絲撥繭、歸納精華,這是一份很是辛苦的工做。並且,分析源碼也須要一些「挑戰權威」的精神,不只僅是簡單的代碼解析,更須要提煉出本身的觀點,甚至勇於發現和糾正一些已有的問題。
  在源碼分析方面,宏亮充分體現了「初生牛犢不怕虎」的精神,很是詳細地剖析了當時Cloud Foundry的幾個主要模塊,條理清晰,技術分析準確到位。宏亮這一系列文章幫助了包括一線互聯網公司在內的許多企業瞭解、認識和最終使用Cloud Foundry,宏亮也藉此奠基了他在PaaS社區的「江湖地位」。
  從去年開始,Docker的熱潮開始波及中國開發者社區。我有幸跟宏亮一塊兒在CSDN主辦的第一屆Container技術大會上發表聯合主題演講,向來賓介紹Cloud Foundry內部的容器技術實現,以及對Docker的一些展望。那次大會是一個很重要的里程碑,在那以後,宏亮開始深刻研究Docker的底層實現,並在InfoQ連載「Docker源碼分析」系列文章。
  對PaaS平臺的研究越深刻,越可以發現和體會Docker對開發和運維的價值。若是說當初的Cloud Foundry模塊和源碼分析文章,是讀研期間的學習筆記,那此次宏亮的《Docker源碼分析》,則是一個通過了深思熟慮、系統性、結構化的工做。Docker開源項目發展速度很是快,此次在文章連載內容的基礎上出書,爲了保證內容的準確性和時效性,宏亮補充了大量Docker最新項目的內容,特別是對Swarm、Machine和Compose這三個模塊的開發進展作了緊密的追蹤。
  這是一本從架構和代碼角度講解Docker底層實現的技術圖書,我從連載第一篇開始就對這個系列的文章保持了緊密的關注,也目擊了宏亮在後期整理加工成書過程當中的辛勤努力。在《Docker源碼分析》成書付梓出版之際,很是幸運,可以爲宏亮寫着一篇推薦序。這本書很是適合如下三類讀者學習和閱讀。
  但願以Docker容器交付軟件的程序員。
  Docker是將來互聯網軟件的交付件,這件事隨着OCP標準的制定,正在逐漸成爲事實。程序員和運維工程師都須要瞭解Docker的工做方式,尤爲是Docker鏡像的結構,軟件經過Dockerfile打包時的優化方式等,這些內容在本書中都有很是詳細的闡述。
  Docker化雲計算平臺的建設者和維護者。
  Docker公司在今年的全球開發者大會上提出了「Production Ready」的口號,有愈來愈多的互聯網公司和傳統企業採用Docker來構建開發、測試和運維平臺。Docker在網絡、存儲、安全等領域的細節,是平臺建設者和維護者必須深刻了解的部分,這些領域還在不斷變化,新的項目也層出不窮,但本書對網絡、存儲和安全的基本知識和概念,作了很是清晰的介紹,也深刻到了底層實現的代碼。
  Go語言程序員。
  即便不在項目中使用Docker,本書也可以爲Go語言程序員帶來幫助。Docker項目中大量採用了Go語言,尤爲是在處理併發場景時,Docker對Go 語言的運用可謂出神入化。本書能夠幫助Go語言程序員親身體驗特大型項目中Go語言的威力,以及實戰場景中Golang模式和功能的用法。
  最後,預祝宏亮在Docker的學習和工做中再創佳績,也但願讀者能夠從本書收穫知識,開闊眼界。
  喻 勇
  2015年7月13日
  Preface 前  言
  Docker是什麼
  Docker從2013年誕生,短短兩年時間就在全球IT技術圈內迅速走紅,實乃技術圈內不可忽視的一陣颶風。然而,Docker是什麼,Docker帶來了什麼?
  Docker官方如此描述Docker:「Build, Ship, Run. An open platform for distributed applications for developers and sysadmins」。換言之,Docker爲開發者與系統管理者提供了分佈式應用的開放平臺,從而能夠便捷地構建、遷移與運行分佈式應用。
  多年來,IT行業中開發與運維一直是兩個界限清晰的詞。開發工程師專門從事軟件的開發工做,最終交付軟件代碼;運維工程師則部署前者交付的軟件,並接管軟件的運行與管理。然而,在長時間的實踐過程當中,開發與運維分離的方式不免存在弊病,二者職責的過度清晰致使軟件效率的下降。隨着分佈式系統的流行,系統規模愈來愈大,軟件愈來愈複雜,系統環境配置暴露的問題層出不窮。究其原因,仍是由於開發人員缺乏軟件運行環境的認知,而運維人員對軟件邏輯所知甚少。在這樣的背景下,DevOps橫空出世,提倡開發與運維不可分割,協調並進。
  Docker無疑是DevOps大潮中最具實踐價值的不二法寶。Docker從Linux內核的角度出發,屬於輕量級虛擬化技術,有能力秒級提供應用隔離環境,完成雲計算時代分佈式應用的第一需求「隔離」。另外,Docker的鏡像技術利用聯合文件系統的優點,自下至上打包系統軟件、系統環境以及軟件程序,將運行環境與應用程序靈活地結合,快速運行Docker化的應用程序。同時,可讀性極強的Dockerfile,極大地簡化鏡像的複雜性,併爲鏡像的轉移與從新構建提供了可能性。
  Docker提供輕便的資源分配方式,解決應用運行與系統環境的依賴,彌合應用跨節點遷移的鴻溝,種種特性都代表Docker幾乎就是爲「雲計算」而生的。現在,Docker社區不斷擴大並健康發展,多家國際IT巨頭也紛紛宣佈支持Docker,這一切更是讓全球IT人士對Docker的將來充滿信心。
  本書的內容
  本書是一本引導讀者瞭解Docker實現原理的技術普及書。筆者一直堅信,瞭解軟件或者系統最直接、最透徹的方式就是研讀它們的源碼。「源碼即文檔」也是鼓勵開發者能更多地從源碼的角度去學習軟件或系統的本質。
  本書的內容主要集中於3個部分:Docker的架構,Docker的模塊,Docker的三駕馬車Swarm、Machine以及Compose。
  第一部分,主要從宏觀的角度和讀者一塊兒領略Docker的架構設計,並初步介紹架構中各模塊的職責。
  第二部分是本書的主體部分,主要針對Docker中多個重要的模塊進行具體深刻分析,包括:Docker Client、Docker Daemon、Docker Server、Docker網絡、Docker鏡像、Docker容器等。讀者能夠發現,Docker 的模塊之間耦合度很是低,很適合按部就班,層層深刻。第2章至第8章主要從Docker軟件的架構入手,勾勒骨架;第9章至第11章重點討論Docker鏡像技術,夯實基礎;第12章至第14章則進一步分析Docker容器的始末,闡述本質。
  第三部分介紹Docker生態三駕馬車Swarm、Machine、Compose。Docker擁有強大的單機能力,三駕馬車能夠很好地補充Docker的跨主機能力以及部署能力。讀者能夠經過第15章至第17章感覺Docker生態圈中其餘功能強大的軟件。
  但願本書可以讓讀者最大化地感覺Docker的神奇與魅力。
  關於勘誤
  因爲時間與水平都比較有限,所以本書不免會存在一些紕漏和錯誤。若是讀者發現了問題,請及時與我聯繫。我也會在本書後續的版本中加以改正。個人郵箱是:allen.sun@daocloud.io。我很是但願和你們一塊兒學習與討論Docker,並共同推進Docker在社區的發展。
  致謝
  最後,向本書編寫過程當中給予我巨大幫助的人們表示最誠摯的感謝。感謝個人父母,沒有他們的鼓勵和支持,此書不可能在如此短的時間內完成。感謝個人母校浙江大學以及SEL實驗室的老師與同窗們,是他們在我求學過程當中給予無私的指引與幫助。感謝個人同事熊中祥,是他在本書編寫過程當中提出了不少寶貴的建議,尤爲在Machine和Compose部分。感謝個人同事喻勇和馮釗,他們爲本書的編寫作了不少溝通與協調工做。最後,還要感謝華章公司的編輯們,她們認真細緻的工做,使本書以完美的形式展示給各位讀者。
  孫宏亮
  2015年6月

 

本篇文章由一文多發平臺ArtiPub自動發佈

相關文章
相關標籤/搜索