內容簡介
Docker的設計思想異常簡潔——將應用程式及其依賴項全部打包到一個輕量級的、隔離的虛擬環境(稱為容器)中,使其易於安裝、管理和清除。從創建安全、可移植的開發環境到流水化微服務的部署和擴展,Docker至今取得的一切成就都基於以上簡單有力的設計思想。在容器化成為趨勢的今天,Docker無處不在。
《Docker實戰(第2版)》聚焦於創建、部署和管理運行在Linux作業系統上的Docker容器中的應用程式。本書對內容做了全面更新,新增了4章,修訂了最佳實踐和示例。書中首先對Docker模型做了清晰解釋,然後開始打包應用程式,安全地測試、安裝和運行應用程式,並將它們部署到主機集群中。本書通過示例展示了Docker如何使整個開發生命周期受益,讀者將學到從開發、測試機器到進行全面雲部署的各種技術。
作者簡介
傑夫·尼克羅夫 Jeff Nickoloff有能力構建大型服務,撰寫技術文章,並幫助人們實現產品目標,他曾在亞馬遜、Limelight Networks和亞利桑那州立大學從事過這些工作。2014年離開亞馬遜後,Jeff成立了一家諮詢公司,致力於為財富100強公司和初創企業提供工具、培訓和最佳實踐方案。在2019年,Jeff和Pottia Dean共同創立了Topple公司,以提供服務的方式構建生產力軟體。Topple公司致力於幫助團隊解決工作中的溝通和協調問題,因為這些問題會使整個團隊放慢腳步,讓業務處於風險中,並且通常還會使工作變得很糟糕。
目錄
第1 章 歡迎來到Docker的世界 1
1.1 Docker是什麼 2
1.1.1 “hello,world”示例 3
1.1.2 容器 4
1.1.3 容器不是虛擬化 5
1.1.4 在隔離容器中運行軟體 5
1.1.5 分發容器 7
1.2 Docker解決了什麼問題 7
1.2.1 變得有組織性 8
1.2.2 改善可移植性 9
1.2.3 保護你的計算機 10
1.3 Docker為什麼重要 11
1.4 何時、何地使用Docker 12
1.5 更大生態系統中的Docker 13
1.6 從Docker命令行獲取幫助 14
1.7 本章小結 14
第Ⅰ部分 進程隔離與環境獨立計算
第2 章 在容器中運行軟體 19
2.1 控制容器:構建網站監視器 19
2.1.1 創建和啟動新容器 20
2.1.2 運行互動式容器 22
2.1.3 羅列、停止、重啟和查看容器的輸出 23
2.2 被解決的問題和PID命名空間 25
2.3 消除元數據衝突:建立網站農場 28
2.3.1 靈活的容器識別 29
2.3.2 容器的狀態和依存關係 32
2.4 構建與環境無關的系統 35
2.4.1 唯讀檔案系統 35
2.4.2 注入環境變數 39
2.5 建立持久的容器 42
2.5.1 自動重啟容器 43
2.5.2 使用PID 1和init系統 44
2.6 清除工作 46
2.7 本章小結 48
第3 章 使用Docker安裝軟體 49
3.1 識別軟體 50
3.1.1 命名倉庫是什麼 50
3.1.2 使用標籤 51
3.2 尋找和安裝軟體 52
3.2.1 從命令行使用Docker註冊表 52
3.2.2 使用備用的註冊表 53
3.2.3 將鏡像作為檔案處理 54
3.2.4 從Dockerfile進行安裝 55
3.2.5 使用Docker Hub 56
3.3 安裝檔案和隔離 58
3.3.1 實際的鏡像層級 58
3.3.2 層級的關係 60
3.3.3 容器檔案系統的抽象和隔離 61
3.3.4 這一工具集和聯合檔案系統結構的優點 62
3.3.5 聯合檔案系統的缺點 62
3.4 本章小結 63
第4 章 使用存儲和卷 65
4.1 檔案樹和掛載點 66
4.2 綁定掛載 67
4.3 常駐記憶體存儲 70
4.4 Docker卷 71
4.4.1 卷提供容器無關的數據管理 73
4.4.2 在NoSQL資料庫中使用卷 74
4.5 共享掛載點和已分享檔案 77
4.6 清理卷 81
4.7 使用卷外掛程式的高級存儲 83
4.8 本章小結 83
第5 章 單主機網路 85
5.1 網路背景(面向初學者) 85
5.1.1 基本知識:協定、接口和連線埠 86
5.1.2 深入知識:網路、NAT和連線埠轉發 87
5.2 Docker容器網路 88
5.2.1 創建用戶自定義的橋接網路 89
5.2.2 探索橋接網路 91
5.2.3 更多網路類型 94
5.3 特殊容器網路:主機網路和none網路 95
5.4 使用NodePort publishing處理入站流量 96
5.5 容器網路注意事項和定製化 98
5.5.1 沒有防火牆或網路策略 98
5.5.2 自定義DNS配置 99
5.5.3 外部化網路管理 103
5.6 本章小結 104
第6 章 通過資源控制來限制風險 105
6.1 設定資源配額 106
6.1.1 記憶體限制 106
6.1.2 CPU 108
6.1.3 訪問設備 111
6.2 共享記憶體 111
6.3 理解用戶 114
6.3.1 使用運行時用戶 114
6.3.2 用戶和卷 117
6.3.3 用戶命名空間和UID重映射 119
6.4 根據功能集調整作業系統功能訪問範圍 121
6.5 以完全特權運行容器 123
6.6 使用增強的工具加固容器 124
6.7 構建適合用例的容器 126
6.7.1 應用程式 127
6.7.2 高層的系統服務 127
6.7.3 低層的系統服務 128
6.8 本章小結 128
第Ⅱ部分 打包軟體進行分發
第7 章 將軟體打包到鏡像中 133
7.1 從容器構建鏡像 133
7.1.1 打包“hello,world”程式 134
7.1.2 準備打包Git程式 135
7.1.3 查看檔案系統的更改項 136
7.1.4 提交新的鏡像 137
7.1.5 配置鏡像屬性 138
7.2 深入研究Docker鏡像和層級 140
7.2.1 探索聯合檔案系統 140
7.2.2 重新認識鏡像、層級、倉庫和標籤 143
7.2.3 管理鏡像大小和層級的限制 146
7.3 導出和導入平面檔案系統 148
7.4 版本控制的最佳實踐 151
7.5 本章小結 153
第8 章 使用Dockerfile自動構建鏡像 155
8.1 使用Dockerfile打包Git程式 155
8.2 Dockerfile入門 160
8.2.1 元數據指令 160
8.2.2 檔案系統指令 165
8.3 在構建下游層級時注入行為 169
8.4 創建可維護的Dockerfile 172
8.5 使用啟動腳本和多進程容器 177
8.5.1 驗證前提條件 177
8.5.2 初始化進程 179
8.5.3 健康檢查的目的和用途 180
8.6 構建加固的應用程式鏡像 182
8.6.1 內容可定址鏡像標識符 183
8.6.2 用戶許可權 183
8.6.3 SUID和SGID許可權 186
8.7 本章小結 188
第9 章 公共和私有軟體分發 191
9.1 選擇分發方法 191
9.1.1 鏡像分發頻譜 192
9.1.2 選擇標準 192
9.2 在託管註冊表中發布鏡像 195
9.2.1 在Docker Hub的公共倉庫中發布鏡像 195
9.2.2 私有託管倉庫 198
9.3 引入私有註冊表 200
9.3.1 使用註冊表鏡像 202
9.3.2 從註冊表中消費鏡像 204
9.4 手動發布和分發鏡像 205
9.5 鏡像原始碼分發流程 211
9.6 本章小結 213
第10 章 鏡像構建管道 215
10.1 鏡像構建管道的目標 215
10.2 構建鏡像的模式 217
10.2.1 多合一鏡像 217
10.2.2 分離構建時和運行時鏡像 218
10.2.3 通過多階段構建來更改運行時鏡像 220
10.3 在構建鏡像時記錄元數據 222
10.4 在鏡像構建管道中測試鏡像 229
10.5 標記鏡像的模式 232
10.5.1 背景 232
10.5.2 帶有唯一標籤的持續交付 233
10.5.3 帶有具體環境工件的持續交付 233
10.5.4 語義版本控制 235
10.6 本章小結 236
第Ⅲ部分 更高層次的抽象與編排
第11 章 Docker和Compose服務 239
11.1 “Hello World!”服務 240
11.1.1 自動復活和複製 242
11.1.2 自動推出 244
11.1.3 服務運行狀況與回滾 246
11.2 使用Compose V3的聲明式服務環境 249
11.2.1 YAML入門 251
11.2.2 Compose V3的服務集合 253
11.3 帶有狀態的服務和保留的數據 258
11.4 使用Compose進行負載均衡、服務發現和聯網 260
11.5 本章小結 264
第12 章 一流的配置 265
12.1 配置的分發和管理 266
12.2 分離應用程式和配置 267
12.2.1 使用配置資源 270
12.2.2 部署應用程式 271
12.2.3 直接管理配置資源 273
12.3 一種特殊的配置:機密信息 277
12.4 本章小結 285
第13 章 使用Swarm在Docker主機集群上編排服務 287
13.1 使用Docker Swarm集群 287
13.1.1 Docker Swarm模式介紹 288
13.1.2 部署Swarm集群 289
13.2 將應用程式部署到Swarm集群 290
13.2.1 Docker Swarm集群資源類型介紹 290
13.2.2 使用Docker服務定義應用程式及其依賴項 291
13.2.3 部署應用程式 297
13.3 與Swarm集群內運行的服務通信 303
13.3.1 使用Swarm路由格線將客戶端請求路由到服務 304
13.3.2 使用覆蓋網路 306
13.3.3 在覆蓋網路上發現服務 307
13.3.4 在覆蓋網路上隔離服務之間的通信 310
13.3.5 負載均衡 312
13.4 將服務任務放置在集群中 313
13.4.1 複製服務 314
13.4.2 約束任務的運行位置 318
13.4.3 使用全局服務方式在每個節點上部署一個任務 325
13.4.4 將真實的應用程式部署到真實的集群中 326
13.5 本章小結 327