-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

自己動手寫Docker

( 簡體 字)
作者:陳顯鷺,王炳燊,秦妤嘉類別:1. -> 作業系統 -> Docker
譯者:
出版社:電子工業出版社自己動手寫Docker 3dWoo書號: 47138
詢問書籍請說出此書號!

缺書
NT售價: 325

出版日:7/1/2017
頁數:212
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787121317866
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:


我是阿里云容器服務團隊的架構師易立,很榮幸為這本書作序。
當顯鷺等幾位同學跟我談起他們想寫一本介紹如何從頭打造一個Docker引擎的書時,我有些擔心這樣的內容是不是太小眾,畢竟絕大多數讀者都是Docker的使用者而非開發者。然而讀完樣章,看到這三位同學筆下翔實的內容,文中透出的熱情和自信打消了我的顧慮。
Docker是技術圈中的當紅小鮮肉。自從2013年橫空出世以來,迅速在開發者社區流行開來。在2016年9月,Docker鏡像在Docker Hub的總下載量就已經超過了60億次,并且以每6周10億次的速度迅速增長。
大家都知道Docker技術脫胎于Linux Container(LXC)技術,在LXC的發展過程中,IBM、Google、Redhat、Canonical等技術巨擘做出了眾多的貢獻。然而,Docker到底有什么魔力,能夠在這么短的時間之內就風靡了整個技術圈呢?
Docker公司的創始人兼CTO—Solomon Hykes,有機地把一系列技術CGroup、Namespace和UnionFS整合起來,極大地降低了容器技術的復雜度,簡化了開發者用戶體驗。他敏銳地預測到一旦標準化容器技術最終出現,整個技術行業將會受到怎樣深遠的影響。Docker公司開源了Docker Engine,定義了一個以容器鏡像為標準的應用打包格式;并且建立Docker Hub服務進行鏡像分發和協作。這些舉措迅速創建了一個良好的社區和合作伙伴生態圈,包含AWS、Google、Microsoft、IBM和國內的眾多公司。在短短幾年的時間內,Docker幾乎成為了容器技術的代名詞。
“得標準者得天下”,容器底層標準化之爭風云再起。2014年底,CoreOS推出rkt容器引擎 ,試圖挑戰Docker另立標準。Docker在2015年6月宣布成立OCI(Open Container Initiative)組織作為Linux基金會的協作項目,并將其容器標準和runtime參考實現(RunC)貢獻出來,旨在圍繞容器格式和運行時制定一個開放的工業化標準。這一舉措化解了社區在容器標準上的第一次分歧。
隨著容器技術的快速發展,技術生態逐漸從圍繞單機環境構建和運行容器化應用,發展為
支持大規模容器編排技術。云平臺成為了分布式網絡操作系統,而容器成為了“進程”執行單元,
可以動態地運行在不同宿主機環境中。其中,Kubernetes、Mesos、Docker 諸強爭霸,各有所長。
2016 年6 月,Docker 宣布開始在Docker Engine 中內置Swarm mode,這極大地簡化了容器編
排的復雜性,但也遭到了社區的強烈反對。Google 發起CRI(Container Runtime Interface,容
器運行時接口)項目,通過shim 的抽象層使得調度框架支持不同的容器引擎實現。Mesos 推
出了Unified Containerizer,以支持Docker 、Appc、OCI 等不同的鏡像格式,而無須再依賴
Docker Engine。
面對這些挑戰,2016 年12 月14 日,Docker 公司宣布將Docker Engine 的核心組件
Containerd 捐贈到一個新的開源社區,任其獨立發展和運營,目標是提供一個標準化的容器
runtime,其注重簡單、健壯性和可移植性。由于Containerd 只包含容器管理最基本的能力,
因此上層框架可以有更大的靈活性來提供容器的調度和編排能力。阿里云、AWS、 Google、
IBM 和Microsoft 會作為Containerd 的初始成員,為項目貢獻力量。
在技術爆發的年代,新技術層出不窮,而快餐式的閱讀和了解無法幫助我們梳理和把握發
展的脈絡。對一些核心技術既要知其然也要知其所以然,這樣才能舉一反三,對技術趨勢建立
起自己的理解和判斷。了解容器基礎知識,可以深入理解容器在進程管理、資源管理、安全隔
離等方面與傳統方式的不同,也有助于了解容器在網絡、存儲、安全等方面的特殊性。
最好的學習方式莫過于自己親手實踐。計算機界的泰斗 Andrew Tanenbaum 教授為教學而
構建了Minix,而這也啟發了Linus Torvalds 大神創造了Linux。我們期待同學們能夠從本書循
序漸進的講解中學習容器相關的技術細節,深入理解Docker 的底層技術實現,圍繞容器技術
實現創造性的擴展和應用。
易立
2017 年1 月


前言
為什么要寫這本書
Docker 技術可謂是近年最火熱的技術之一,鋪天蓋地的技術論壇和各種講座,大家都在分享關于如何容器化及如何使用Docker優化自己運維和開發流程的經驗。隨著Docker技術的逐漸普及,使用Docker已經不再是一個難題。現在更加重要的是生產環境容器化的最佳實踐,另外就是容器的編排框架之爭。但是,對于技術人員來說,除去Docker 外表的繁華外,什么是容器,容器到底是怎么創建的,容器底層的技術探秘也是非常重要的。
我在2014年開始接觸 Docker,經歷了從最初的新奇—感嘆竟然還有Docker 這樣的好工具,到逐漸熟悉Docker的各種功能,嘗試在生產環境中使用Docker技術的過程。但是,每每被人問到:“Docker技術到底是怎么實現的呢?”我只能粗粗淺淺地說:“Docker是使用Linux Kernel的Namespace 和 Cgroups實現的一種容器技術。”那么,什么是Namespace,什么是Cgroups,Docker是怎么使用它們的,容器到底是怎么一步步被創建出來的?問到這些,我就會支支吾吾地不知所以。由此可見,了解容器技術的底層技術,然后明白它們是如何工作的,尤為重要,這些才是整個容器技術的基石,掌握了這些基石才能更加容易地向上攀登。
單單講解底層的技術實現細節和源碼解讀是很枯燥的一件事,一般來說很難有耐心去一點點細讀然后揣摩其中的奧妙,這樣囫圇吞棗地過一遍技術細節,作用不大。因此,便萌生了寫一本《自己動手寫Docker》這樣的書的想法。本書不去刻意講解容器技術的細節,用到什么講解什么,點到為止,更加細節的內容留給讀者自己探索。通過閱讀本書,可以一步步地去了解容器技術的實現細節,更可以跟著作者一步步地用自己的代碼去實現它。本書最大的樂趣莫過于用自己最新了解到的知識去動手實現自己的容器。由此可以進一步打開你進入容器技術社區的大門。
本書的內容
本書的目的是去引導讀者通過學習容器技術的實現細節,一步步去構建一個簡單的容器。
從這個過程中,了解整個容器技術領域和實現細節。本書注重原理的講解與實踐,每一部分都
會有詳細的代碼解析,力爭用最少最精簡的代碼,幫助讀者構建自己的容器。
本書的內容主要分為“容器與開發語言”“基礎技術”“構造容器”“構造鏡像”“構造
容器進階”“容器網絡”“高級實踐”這7 章。
? 容器與開發語言:主要介紹 Docker 的基本功能和特點,并且對后面即將使用的Go 語言
做一個簡單的介紹。
? 基礎技術:主要介紹實現容器的底層技術,如Namespace、Cgroups、Union File System。
每一小節都會有文字性介紹,并且附有一個簡短的小例子程序,介紹在容器上是如何使
用這項技術的,方便讀者清晰地理解各個技術點在容器上的作用。
? 構造容器:使用前面兩章介紹的基礎技術,構造一個最簡單的容器環境,會將整體實現
細節及代碼解析一點點展現,直接使用前面介紹的基礎技術,從而更加有實戰感。
? 構造鏡像: 使用2.3 節介紹的分層文件系統技術,構建一個簡單的容器鏡像,體現容器
鏡像的分層思想。
? 構造容器進階:更加貼近真實的容器實現,在原來的基礎上,增加更豐富的功能。通過
這一章的學習,讀者可以更好地了解各種技術是如何整合在一起,去實現容器整體功能
的。
? 容器網絡: 除了實現一個容器環境之外,這一章還會講解如何使自己的容器和宿主機通
信,以及如何讓不同的容器之間進行通信,更加貼近真實環境。
? 高級實踐: 使用自己編寫的容器,運行一些通用程序,驗證容器的可用性。此外,本章
還介紹了目前Docker 使用的容器運行引擎,以及目前容器運行態引擎的概況。
適用讀者
? 希望更加深入地了解容器技術的讀者。
? 已經使用過Docker,希望探查細節的讀者。
? Go 語言程序員,了解如何使用 Go 語言來編寫自己的容器。
? 容器技術愛好者。
如何閱讀
由于本書的定位是自己動手寫Docker,側重于實戰,因此僅僅紙面閱讀是無法體會所有
要點的。所有的源碼均托管在github.com/xianlubird/mydocker,您可以在這里下載到本書的所
有源碼。每一章節都會有一個對應的tag,建議您在閱讀書中講解的同時,也將代碼下載下來,
在本機嘗試運行,了解整個代碼的運行流程。我們非常歡迎向本項目提交Pull Request,在閱
讀思考中不斷交流學習。
關于勘誤
由于時間和水平都比較有限,因此本書難免會存在一些紕漏和錯誤。如果讀者發現了問題,
請及時與我們聯系,我們也會在后面的版本中加以改正。非常
希望與大家共同學習容器技術。
致謝
最后,向本書編寫過程中給予我們巨大幫助的人們表示誠摯的感謝。感謝女友的支持,
沒有她包攬所有家務,我不會有大量空余時間編寫此書。感謝同事姜繼忠和謝瑤瑤對于本書
containerd 和Kubernetes 相關章節內容的支持。感謝阿里云容器服務團隊在本書編寫期間給予
的理解與包容。最后,感謝張春雨編輯,是他的幫助與支持才使得本書由一個想法變成了實體,
展現給各位讀者。
陳顯鷺
內容簡介:

通過講解 Docker 使用到的各種底層技術,例如Namespace、Cgroups等來自己一步步動手完成一個簡單版本的Docker。在自己動手的過程中,從而對Docker 這個技術有一個整體、細致的了解。能夠明白Docker 的原理以及結構,從而加深對目前熾手可熱的Docker 技術的理解,方便解決工作中使用Docker 遇到的各種問題。

目錄:

目錄
第1章 容器與開發語言………1
1.1 Docker …………1
1.1.1 簡介 …………1
1.1.2 容器和虛擬機比較 …………2
1.1.3 容器加速開發效率 …………3
1.1.4 利用容器合作開發 …………4
1.1.5 利用容器快速擴容 …………4
1.1.6 安裝使用Docker ………4
1.2 Go …………5
1.2.1 描述 …………5
1.2.2 安裝Go ………6
1.2.3 配置GOPATH …………6
1.3 小結 ……………7
第2章 基礎技術…………8
2.1 Linux Namespace 介紹 …………8
2.1.1 概念 …………8
2.1.2 UTS Namespace …………10
2.1.3 IPC Namespace …………11
2.1.4 PID Namespace …………13
2.1.5 Mount Namespace ………14
2.1.6 User Namespace …………16
2.1.7 Network Namespace ………… 18
2.2 Linux Cgroups 介紹 ……… 20
2.2.1 什么是Linux Cgroups ……… 20
2.2.2 Docker 是如何使用Cgroups 的 ……… 24
2.2.3 用Go 語言實現通過cgroup 限制容器的資源 ……… 25
2.3 Union File System ………… 26
2.3.1 什么是Union File System ………… 26
2.3.2 AUFS ………… 27
2.3.3 Docker 是如何使用AUFS 的 …… 27
2.3.4 自己動手寫AUFS……… 34
2.4 小結 …………… 37
第3 章 構造容器………… 38
3.1 構造實現run 命令版本的容器 ………… 38
3.1.1 Linux proc 文件系統介紹 ………… 38
3.1.2 實現 run 命令 ………… 39
3.2 增加容器資源限制 ……… 45
3.2.1 定義Cgroups 的數據結構 ……… 45
3.2.2 在啟動容器時增加資源限制的配置 ……… 51
3.3 增加管道及環境變量識別 ………… 53
3.4 小結 …………… 58
第4 章 構造鏡像………… 59
4.1 使用busybox 創建容器 ……… 59
4.1.1 busybox ……… 59
4.1.2 pivot_root ………… 60
4.2 使用AUFS 包裝busybox ……… 63
4.3 實現volume 數據卷 ……… 67
4.4 實現簡單鏡像打包 ……… 75
4.5 小結 …………… 77
第5 章 構建容器進階………… 78
5.1 實現容器的后臺運行 ………… 78
5.2 實現查看運行中容器 ………… 82
5.2.1 準備數據 ………… 82
5.2.2 實現mydocker ps ……… 87
5.3 實現查看容器日志 ……… 90
5.4 實現進入容器Namespace ………… 93
5.4.1 setns ………… 94
5.4.2 Cgo …………… 94
5.4.3 實現命令 ………… 94
5.5 實現停止容器 ……… 100
5.6 實現刪除容器 ……… 104
5.7 實現通過容器制作鏡像 ……… 105
5.8 實現容器指定環境變量運行 ……… 117
5.8.1 修改runCommand ……… 117
5.8.2 修改Run 函數 ………… 117
5.8.3 修改NewParentProcess 函數 …… 118
5.8.4 修改mydocker exec 命令 ………… 119
5.9 小結 …………… 121
第6 章 容器網絡………… 122
6.1 網絡虛擬化技術介紹 ………… 122
6.1.1 Linux 虛擬網絡設備 ………… 122
6.1.2 Linux 路由表 ……… 124
6.1.3 Linux iptables ……… 126
6.1.4 Go 語言網絡庫介紹 ………… 127
6.2 構建容器網絡模型 ……… 128
6.2.1 模型 ………… 128
6.2.2 調用關系 ………… 130
6.3 容器地址分配 ……… 137
6.3.1 bitmap 算法介紹 ……… 138
6.3.2 數據結構定義 ………… 138
6.3.3 地址分配的實現 ……… 140
6.3.4 地址釋放的實現 ……… 142
6.3.5 測試 ………… 142
6.4 創建Bridge 網絡 ………… 144
6.4.1 Bridge Driver Create 實現 ………… 144
6.4.2 Bridge Driver 初始化Linux Bridge 流程 …… 144
6.4.3 Bridge Driver Delete 實現 ………… 148
6.4.4 測試 ………… 148
6.5 在Bridge 網絡創建容器 ……… 149
6.5.1 掛載容器端點的流程 ……… 150
6.5.2 測試 ………… 156
6.6 容器跨主機網絡 ………… 159
6.6.1 跨主機容器網絡的IPAM ………… 160
6.6.2 跨主機容器網絡通信的常見實現方式 …… 161
6.7 小結 …………… 163
第7 章 高級實踐………… 164
7.1 使用mydocker 創建一個可訪問的nginx 容器 …… 164
7.1.1 獲取nginx tar 包 ……… 164
7.1.2 構建自己的nginx 鏡像 ……… 165
7.1.3 運行mynginx 容器 ………… 167
7.2 使用mydocker 創建一個flask + redis 的計數器 ……… 169
7.2.1 創建redis 容器 ………… 169
7.2.2 制作flask 鏡像 ………… 173
7.2.3 創建myflask 容器 ……… 176
7.3 runC …………… 177
7.3.1 簡介 ………… 177
7.3.2 OCI 標準包(bundle) ……… 177
7.3.3 config.json ………… 178
7.3.4 mounts ……… 178
7.3.5 process ……… 179
7.3.6 user …………… 179
7.3.7 hostname ………… 180
7.3.8 platform ……… 180
7.3.9 鉤子(Hook) ………… 181
7.4 runC 創建容器流程 ……… 182
7.5 Docker containerd 項目介紹 ………… 186
7.5.1 架構 ………… 187
7.5.2 特性和路線圖 ………… 188
7.5.3 containerd 和Docker 之間的關系 …… 188
7.5.4 containerd、OCI 和runC 之間的關系 ……… 188
7.5.5 containerd 和容器編排系統的關系 …… 189
7.6 Kubernetes CRI 容器引擎 ……… 189
7.6.1 什么是CRI ……… 189
7.6.2 為什么需要CRI ……… 193
7.6.3 為什么CRI 是接口且是基于容器的而不是基于Pod 的 … 193
7.6.4 如何使用CRI ………… 193
7.6.5 CRI 的目標 ……… 194
7.6.6 已知的問題 ……… 194
7.7 小結 …………… 195
序: