更多書籍點擊進入>> CiCi島php
電子版僅供預覽及學習交流使用,下載後請24小時內刪除,支持正版,喜歡的請購買正版書籍html
經過講解 Docker 使用到的各類底層技術,例如Namespace、Cgroups等來本身一步步動手完成一個簡單版本的Docker。在本身動手的過程當中,從而對Docker 這個技術有一個總體、細緻的瞭解。可以明白Docker 的原理以及結構,從而加深對目前熾手可熱的Docker 技術的理解,方便解決工做中使用Docker 遇到的各類問題。nginx
2015年在 IBM CDL 從事研發工程師工做,方向爲雲計算與虛擬化。2016年初加入阿里雲,就任容器服務,從事Docker 研發與容器化技術解決方案。git
目錄
第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.github
本篇文章由一文多發平臺ArtiPub自動發佈redis