內容提要
自從2013 年3 月Docker 0.1 版本發布以來,以其為代表的容器技術也走上了快速發展之路,Docker容器在很大程度上改變了軟體的架構設計、開發和運維部署方式,也給早些年就提出微服務的架構模式插上了快速起飛的翅膀。《Docker實戰》由Docker 社區第一人Jeff Nickoloff 編寫,共分為3 部分,第1 部分(第1~6章)重點介紹了Docker 容器的資源隔離和許可權控制及基礎原理,第2 部分(第7~10 章)詳細解釋了如何打包構建鏡像以及各種鏡像分發基礎設施的建設,第3 部分(第11~12 章)聚焦於Docker 容器的組合操作,也就是多容器和多主機環境的管理。《Docker實戰》圖文並茂,結合基本原理和具體案例給大家提供了多個不錯的實戰機會。
作為目前熱門的容器技術類圖書,《Docker實戰》適用於網際網路,雲計算,企業級軟體開發、架構、測試,以及運維人員快速上手的Docker 容器;同樣適用於搭建以Docker 為核心的基礎設施,並在生產環境中快速部署套用以及管理容器集群。
目錄
第1 部分 保持一台整潔的機器
第1 章 歡迎來到Docker 世界 2
1.1 什麼是Docker3
1.1.1 容器 3
1.1.2 容器不是虛擬化 4
1.1.3 在隔離的容器中運行軟體 4
1.1.4 分發容器 6
1.2 Docker 解決了什麼問題 6
1.2.1 組織有序 7
1.2.2 提高可移植性 8
1.2.3 保護你的機器 9
1.3 為什麼Docker 如此重要 10
1.4 何時何處使用Docker11
1.5 案例:“Hello World” 11
1.6 小結 13
第2 章 在容器中運行軟體 14
2.1 從Docker 命令行工具獲得幫助 14
2.2 控制容器:建立一個網站的監控器 15
2.2.1 創建和啟動一個新的容器 16
2.2.2 運行互動式容器 17
2.2.3 列舉、停止、重新啟動和查看容器輸出 18
2.3 已解決的問題和PID 命名空間 20
2.4 消除元數據衝突:構建一個網站農場 23
2.4.1 靈活的容器標識 24
2.4.2 容器的狀態和依賴 26
2.5 構建與環境無關的系統 28
2.5.1 唯讀檔案系統 29
2.5.2 環境變數的注入 31
2.6 建立持久化的容器 34
2.6.1 自動重啟容器 35
2.6.2 使用init 和supervisor 進程維持容器的運行狀態 36
2.7 清理 38
2.8 小結 39
第3 章 軟體安裝的簡化 40
3.1 選擇所需的軟體 41
3.1.1 什麼是倉庫 41
3.1.2 使用標籤 42
3.2 查找和安裝軟體 43
3.2.1 命令行使用Docker Hub43
3.2.2 通過網站訪問Docker Hub45
3.2.3 使用替代註冊伺服器 47
3.2.4 鏡像檔案 47
3.2.5 從Dockerfile 安裝 49
3.3 安裝檔案和隔離 49
3.3.1 鏡像層實戰 50
3.3.2 分層關係 51
3.3.3 容器檔案系統抽象和隔離 52
3.3.4 分層檔案系統及其工具的優點 53
3.3.5 Union 檔案系統的不足 53
3.4 小結 54
第4 章 持久化存儲和卷間狀態共享 55
4.1 存儲卷的簡介 56
4.1.1 存儲卷提供容器無關的數據管理方式 56
4.1.2 NoSQL 資料庫使用存儲卷 57
4.2 存儲卷的類型 60
4.2.1 綁定掛載卷 60
4.2.2 Docker 管理卷 63
4.3 共享存儲卷 65
4.3.1 主機依賴的共享 65
4.3.2 共享和volumes-from 標誌 66
4.4 管理卷的生命周期 68
4.4.1 管理卷的許可權 68
4.4.2 存儲卷的清理 69
4.5 存儲卷的高級容器模式 70
4.5.1 卷容器模式 70
4.5.2 數據打包的存儲卷容器 72
4.5.3 多態容器模式 73
4.6 小結 74
第5 章 網路訪問 75
5.1 網路相關的背景知識 76
5.1.1 基礎:協定,接口和連線埠 76
5.1.2 高級:網路,NAT 和連線埠轉發 77
5.2 Docker 的網路 79
5.2.1 本地Docker 網路的拓撲結構 79
5.2.2 四種網路容器原型 80
5.3 Closed 容器 81
5.4 Bridged 容器 83
5.4.1 訪問外部網路 84
5.4.2 自定義命名解析 85
5.4.3 開放對容器的訪問 88
5.4.4 跨容器通信 91
5.4.5 修改網橋接口的配置 92
5.5 Joined 容器 93
5.6 Open 容器 95
5.7 跨容器依賴 96
5.7.1 連結——本地服務發現 97
5.7.2 連結別名 98
5.7.3 環境變數的改動 99
5.7.4 連結的本質和缺點 101
5.8 小結 102
第6 章 隔離——限制危險 103
6.1 資源分配 104
6.1.1 記憶體限制 104
6.1.2 CPU105
6.1.3 設備的訪問權 108
6.2 共享記憶體 108
6.2.1 跨容器的進程間通信 109
6.2.2 開放記憶體容器 110
6.3 理解用戶 111
6.3.1 Linux 用戶命令空間 111
6.3.2 run-as 用戶 111
6.3.3 用戶和卷 114
6.4 能力——作業系統功能的授權 116
6.5 運行特權容器 117
6.6 使用加強工具創建更健壯的容器 118
6.6.1 指定額外的安全選項 119
6.6.2 微調LXC120
6.7 因地制宜地構建容器 121
6.7.1 套用 121
6.7.2 高層的系統服務 122
6.7.3 低層的系統服務 122
6.8 小結 122
第2 部分 鏡像發布:如何打包軟體
第7 章 在鏡像中打包軟體 126
7.1 從容器構建鏡像 126
7.1.1 打包Hello World127
7.1.2 打包Git128
7.1.3 審查檔案系統的改動 128
7.1.4 Commit——創建新鏡像 129
7.1.5 可配置的鏡像屬性 130
7.2 深入Docker 鏡像和層 131
7.2.1 深入聯合檔案系統 132
7.2.2 重新認識鏡像、層、倉庫和標籤 134
7.2.3 鏡像體積和層數限制 137
7.3 導出和導入扁平檔案系統 139
7.4 版本控制的最佳實踐 141
7.5 小結 143
第8 章 構建自動化和高級鏡像設定 144
8.1 使用Dockerfile 打包Git144
8.2 Dockerfile 入門 148
8.2.1 元數據指令 148
8.2.2 檔案系統指令 152
8.3 注入下游鏡像在構建時發生的操作 155
8.4 使用啟動腳本和多進程容器 158
8.4.1 驗證環境相關的先決條件 158
8.4.2 初始化進程 160
8.5 加固套用鏡像 161
8.5.1 內容可定址鏡像標識符 161
8.5.2 用戶許可權 162
8.5.3 SUID 和SGID 許可權 164
8.6 小結 166
第9 章 公有和私有軟體分發 168
9.1 選擇一個分發方法 169
9.1.1 分發選項圖譜 169
9.1.2 選擇標準 169
9.2 通過託管Registry 發布 172
9.2.1 通過公有倉庫發布:你好!Docker Hub172
9.2.2 使用自動構建發布公有項目 174
9.2.3 私有託管倉庫 176
9.3 私有Registry 介紹 178
9.3.1 使用Registry 鏡像 180
9.3.2 從Registry 使用鏡像 181
9.4 鏡像的手動發布和分發 181
9.5 鏡像原始碼分發工作流程 186
9.6 小結 189
第10 章 運行自定義Registry190
10.1 運行個人Registry191
10.1.1 再度介紹鏡像 192
10.1.2 介紹V2 API193
10.1.3 定製鏡像 195
10.2 集中式Registry 的增強 196
10.2.1 創建一個反向代理 197
10.2.2 在反向代理上配置HTTPS(TLS) 199
10.2.3 添加身份認證層 202
10.2.4 客戶端兼容性 206
10.2.5 套用於生產環境之前 208
10.3 持久化的BLOB 存儲 210
10.3.1 微軟Azure 託管遠程存儲 211
10.3.2 AWS S3 託管遠程存儲 212
10.3.3 RADOS(Ceph)的內部遠程存儲 214
10.4 擴展訪問和延遲的改進 215
10.4.1 與元數據快取集成 215
10.4.2 使用存儲中間件簡化BLOB 傳輸 217
10.5 通過通知集成 219
10.6 小結 224
第3 部分 多容器和多主機環境
第11 章 Docker Compose 聲明式環境 228
11.1 Docker Compose:第一天的啟動並運行 228
11.1.1 用一個簡單的開發環境入門 229
11.1.2 一個複雜的架構:分散式系統和Elasticsearch 的集成 231
11.2 環境內的疊代 233
11.2.1 構建、啟動和重新構建服務 234
11.2.2 服務伸縮和刪除 237
11.2.3 疊代和持久化狀態 238
11.2.4 網路和連線問題 239
11.3 開始一個新項目:三個示例中的Compose YAML240
11.3.1 啟動前的構建、環境、元數據和網路 240
11.3.2 已知的組件和綁定掛載卷 241
11.3.3 卷容器和擴展服務 242
11.4 小結 243
第12 章 Docker Machine 和Swarm 集群 245
12.1 介紹Docker Machine246
12.1.1 構建和管理Docker Machine246
12.1.2 配置Docker 客戶端與遠程Daemon 工作 249
12.2 Docker Swarm 介紹 252
12.2.1 藉助於Docker Machine 構建Swarm 集群 252
12.2.2 Swarm 擴展了Docker 遠程API255
12.3 Swarm 調度 258
12.3.1 Spread 算法 258
12.3.2 用過濾器調整調度 260
12.3.3 BinPack 和隨機調度算法 263
12.4 Swarm 服務發現 265
12.4.1 Swarm 和單主機網路 266
12.4.2 服務發現生態系統和權宜之計 268
12.4.3 展望多主機網路 269
12.5 小結 270
後記 271