自己動手寫Docker

自己動手寫Docker

《自己動手寫Docker》 一書作者陳顯鷺、王炳燊、秦妤嘉,電子工業出版社2017年7月出版

內容提要

《自己動手寫Docker》在詳細分析Docker所依賴的技術棧的基礎上,一步一步地通過代碼實例,讓讀者可以自己循序漸進地用Go語言構建出一個容器的引擎。不同於其他Docker原理介紹或代碼剖析的書籍,《自己動手寫Docker》旨在提供給讀者一條動手路線,一步一步地實現Docker的隔離性,構建Docker的鏡像、容器的生命周期及Docker的網路等。《自己動手寫Docker》涉及的代碼都託管在GitHub上,讀者可以對照書中的步驟從代碼層面學習構建流程,從而精通整個容器技術棧。《自己動手寫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 自己動手寫AUFS34

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 創建一個flsk + redis的計數器 169

7.2.1 創建redis容器 169

7.2.2 製作flsk鏡像 173

7.2.3 創建myflsk容器 176

7.3 runC 177

7.3.1 簡介 177

7.3.2 OCI 標準包(bundle) 177

7.3.3 confi.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

相關詞條

相關搜尋

熱門詞條

聯絡我們