通過(guò)講解 Docker 使用到的各種底層技術(shù),例如Namespace、Cgroups等來(lái)自己一步步動(dòng)手完成一個(gè)簡(jiǎn)單版本的Docker。在自己動(dòng)手的過(guò)程中,從而對(duì)Docker 這個(gè)技術(shù)有一個(gè)整體、細(xì)致的了解。能夠明白Docker 的原理以及結(jié)構(gòu),從而加深對(duì)目前熾手可熱的Docker 技術(shù)的理解,方便解決工作中使用Docker 遇到的各種問(wèn)題。
2015年在 IBM CDL 從事研發(fā)工程師工作,方向?yàn)樵朴?jì)算與虛擬化。2016年初加入阿里云,就職容器服務(wù),從事Docker 研發(fā)與容器化技術(shù)解決方案。
目錄
第1章 容器與開(kāi)發(fā)語(yǔ)言………………………………………………………………………1
1.1 Docker ………………………………………………………………………………1
1.1.1 簡(jiǎn)介 …………………………………………………………………………1
1.1.2 容器和虛擬機(jī)比較 …………………………………………………………2
1.1.3 容器加速開(kāi)發(fā)效率 …………………………………………………………3
1.1.4 利用容器合作開(kāi)發(fā) …………………………………………………………4
1.1.5 利用容器快速擴(kuò)容 …………………………………………………………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 小結(jié) …………………………………………………………………………………7
第2章 基礎(chǔ)技術(shù)………………………………………………………………………………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 語(yǔ)言實(shí)現(xiàn)通過(guò)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 自己動(dòng)手寫(xiě)AUFS…………………………………………………………… 34
2.4 小結(jié) ………………………………………………………………………………… 37
第3 章 構(gòu)造容器……………………………………………………………………………… 38
3.1 構(gòu)造實(shí)現(xiàn)run 命令版本的容器 …………………………………………………… 38
3.1.1 Linux proc 文件系統(tǒng)介紹 …………………………………………………… 38
3.1.2 實(shí)現(xiàn) run 命令 ……………………………………………………………… 39
3.2 增加容器資源限制 ………………………………………………………………… 45
3.2.1 定義Cgroups 的數(shù)據(jù)結(jié)構(gòu) ………………………………………………… 45
3.2.2 在啟動(dòng)容器時(shí)增加資源限制的配置 ……………………………………… 51
3.3 增加管道及環(huán)境變量識(shí)別 ………………………………………………………… 53
3.4 小結(jié) ………………………………………………………………………………… 58
第4 章 構(gòu)造鏡像……………………………………………………………………………… 59
4.1 使用busybox 創(chuàng)建容器 …………………………………………………………… 59
4.1.1 busybox ……………………………………………………………………… 59
4.1.2 pivot_root …………………………………………………………………… 60
4.2 使用AUFS 包裝busybox …………………………………………………………… 63
4.3 實(shí)現(xiàn)volume 數(shù)據(jù)卷 ………………………………………………………………… 67
4.4 實(shí)現(xiàn)簡(jiǎn)單鏡像打包 ………………………………………………………………… 75
4.5 小結(jié) ………………………………………………………………………………… 77
第5 章 構(gòu)建容器進(jìn)階………………………………………………………………………… 78
5.1 實(shí)現(xiàn)容器的后臺(tái)運(yùn)行 ……………………………………………………………… 78
5.2 實(shí)現(xiàn)查看運(yùn)行中容器 ……………………………………………………………… 82
5.2.1 準(zhǔn)備數(shù)據(jù) …………………………………………………………………… 82
5.2.2 實(shí)現(xiàn)mydocker ps …………………………………………………………… 87
5.3 實(shí)現(xiàn)查看容器日志 ………………………………………………………………… 90
5.4 實(shí)現(xiàn)進(jìn)入容器Namespace ………………………………………………………… 93
5.4.1 setns ………………………………………………………………………… 94
5.4.2 Cgo …………………………………………………………………………… 94
5.4.3 實(shí)現(xiàn)命令 …………………………………………………………………… 94
5.5 實(shí)現(xiàn)停止容器 ……………………………………………………………………… 100
5.6 實(shí)現(xiàn)刪除容器 ……………………………………………………………………… 104
5.7 實(shí)現(xiàn)通過(guò)容器制作鏡像 …………………………………………………………… 105
5.8 實(shí)現(xiàn)容器指定環(huán)境變量運(yùn)行 ……………………………………………………… 117
5.8.1 修改runCommand …………………………………………………………… 117
5.8.2 修改Run 函數(shù) ……………………………………………………………… 117
5.8.3 修改NewParentProcess 函數(shù) ……………………………………………… 118
5.8.4 修改mydocker exec 命令 …………………………………………………… 119
5.9 小結(jié) ………………………………………………………………………………… 121
第6 章 容器網(wǎng)絡(luò)……………………………………………………………………………… 122
6.1 網(wǎng)絡(luò)虛擬化技術(shù)介紹 ……………………………………………………………… 122
6.1.1 Linux 虛擬網(wǎng)絡(luò)設(shè)備 ………………………………………………………… 122
6.1.2 Linux 路由表 ………………………………………………………………… 124
6.1.3 Linux iptables ………………………………………………………………… 126
6.1.4 Go 語(yǔ)言網(wǎng)絡(luò)庫(kù)介紹 ………………………………………………………… 127
6.2 構(gòu)建容器網(wǎng)絡(luò)模型 ………………………………………………………………… 128
6.2.1 模型 ………………………………………………………………………… 128
6.2.2 調(diào)用關(guān)系 …………………………………………………………………… 130
6.3 容器地址分配 ……………………………………………………………………… 137
6.3.1 bitmap 算法介紹 …………………………………………………………… 138
6.3.2 數(shù)據(jù)結(jié)構(gòu)定義 ……………………………………………………………… 138
6.3.3 地址分配的實(shí)現(xiàn) …………………………………………………………… 140
6.3.4 地址釋放的實(shí)現(xiàn) …………………………………………………………… 142
6.3.5 測(cè)試 ………………………………………………………………………… 142
6.4 創(chuàng)建Bridge 網(wǎng)絡(luò) …………………………………………………………………… 144
6.4.1 Bridge Driver Create 實(shí)現(xiàn) …………………………………………………… 144
6.4.2 Bridge Driver 初始化Linux Bridge 流程 …………………………………… 144
6.4.3 Bridge Driver Delete 實(shí)現(xiàn) …………………………………………………… 148
6.4.4 測(cè)試 ………………………………………………………………………… 148
6.5 在Bridge 網(wǎng)絡(luò)創(chuàng)建容器 …………………………………………………………… 149
6.5.1 掛載容器端點(diǎn)的流程 ……………………………………………………… 150
6.5.2 測(cè)試 ………………………………………………………………………… 156
6.6 容器跨主機(jī)網(wǎng)絡(luò) …………………………………………………………………… 159
6.6.1 跨主機(jī)容器網(wǎng)絡(luò)的IPAM …………………………………………………… 160
6.6.2 跨主機(jī)容器網(wǎng)絡(luò)通信的常見(jiàn)實(shí)現(xiàn)方式 …………………………………… 161
6.7 小結(jié) ………………………………………………………………………………… 163
第7 章 高級(jí)實(shí)踐……………………………………………………………………………… 164
7.1 使用mydocker 創(chuàng)建一個(gè)可訪問(wèn)的nginx 容器 …………………………………… 164
7.1.1 獲取nginx tar 包 …………………………………………………………… 164
7.1.2 構(gòu)建自己的nginx 鏡像 ……………………………………………………… 165
7.1.3 運(yùn)行mynginx 容器 ………………………………………………………… 167
7.2 使用mydocker 創(chuàng)建一個(gè)flask redis 的計(jì)數(shù)器 ………………………………… 169
7.2.1 創(chuàng)建redis 容器 ……………………………………………………………… 169
7.2.2 制作flask 鏡像 ……………………………………………………………… 173
7.