云原生時代,應用變得越來越強大,與此同時,它的復雜度也在呈指數級上升。希望實現基礎設施和流程現代化,甚至組織文化現代化的企業(yè)的最終目標是仔細選擇最適合其具體情況的云技術。在現代化的企業(yè)應用中,集群部署、隔離環(huán)境、灰度發(fā)布、服務網格及動態(tài)擴容/縮容缺一不可,而Docker 技術則是其中間的必要橋梁。 本書將圍繞Docker 技術展開介紹,通過“七步法”為讀者構建完善的學習體系。開篇先通過“蓋房子”的故事展開,讓讀者迅速了解Docker 是什么、能做什么。然后補充一些與Docker 技術相關的基礎知識,包含Linux、Shell、Nginx 及網絡調試基礎,為讀者的后續(xù)學習掃除障礙。最后通過示例幫助讀者進行Docker 容器化體驗。“授人以魚,不如授人以漁”。本書通過剖析Docker 的核心原理、持續(xù)集成與發(fā)布及企業(yè)級應用案例,一步步為讀者打造“通向企業(yè)級應用”的階梯。 本書內容詳盡,由淺入深,案例豐富。
王嘉濤 北京百家互聯(lián)科技有限公司,前端基礎技術負責人李傳龍 百度在線網絡技術(北京)有限公司高級工程師盧桂周 北京拉勾網絡技術有限公司高級工程師
★★第1章 快速了解Docker /1
1.1 Docker簡介 /1
1.1.1 通過“蓋房子”來理解Docker—— 一次構建,處處運行 /1
1.1.2 Docker的適用人群 /3
1.1.3 Docker能解決什么問題 /4
1.1.4 如何快速入門 /6
1.2 Docker的基本組成 /7
1.2.1 Docker的三大組成部分 /7
1.2.2 Docker的三大核心概念 /8
1.3 入門必備基礎知識 /10
1.3.1 Linux基本操作 /10
1.3.2 Shell基礎命令 /22
1.3.3 網絡調試基礎 /27
1.3.4 Nginx配置 /34
1.3.5 區(qū)分物理機、虛擬機與容器 /41
1.4 安裝Docker /44
1.4.1 在Windows中安裝 /44
1.4.2 在macOS中安裝 /47
1.4.3 在CentOS中安裝 /49
1.4.4 在Ubuntu中安裝 /50
1.4.5 配置鏡像加速 /52
1.5 使用Docker桌面端工具 /54
1.5.1 基本功能介紹 /54
1.5.2 使用鏡像倉庫 /61
1.6 Docker常用命令1——鏡像命令 /65
1.6.1 Dockerfile配置示例 /65
1.6.2 FROM命令 /66
1.6.3 MAINTAINER命令 /66
1.6.4 RUN命令 /67
1.6.5 ADD命令和COPY命令 /69
1.6.6 ENV命令 /69
1.6.7 WORKDIR命令 /70
1.6.8 EXPOSE命令 /70
1.6.9 CMD命令和ENTRYPOINT命令 /70
1.6.10 VOLUME命令 /71
1.7 Docker常用命令2——容器命令 /72
1.7.1 clone命令 /72
1.7.2 build命令 /73
1.7.3 run命令 /73
1.7.4 share命令 /75
1.7.5 push命令 /76
1.8 本章小結 /77
★★第2章 開始第一個Docker項目 /78
2.1 項目開發(fā)的主要階段 /78
2.1.1 一般項目開發(fā)的主要階段 /78
2.1.2 Docker項目開發(fā)的主要階段 /79
2.2 項目前期準備 /80
2.2.1 準備相關環(huán)境 /80
2.2.2 準備項目 /81
2.3 對Web項目進行容器化改造 /84
2.3.1 構建項目 /84
2.3.2 配置Nginx文件 /85
2.3.3 創(chuàng)建和配置Dockerfile文件 /88
2.4 構建項目鏡像 /89
2.4.1 準備啟動環(huán)境 /89
2.4.2 構建鏡像 /89
2.5 在容器中運行項目鏡像 /91
2.5.1 運行容器 /92
2.5.2 管理容器 /92
2.5.3 在瀏覽器中打開 /93
2.5.4 進程管理 /93
2.5.5 日志查看 /96
2.6 管理鏡像 /97
2.6.1 了解鏡像倉庫 /97
2.6.2 最大的鏡像倉庫——Docker Hub /98
2.6.3 把項目鏡像推送到遠程鏡像倉庫中 /98
2.7 發(fā)布項目 /102
2.7.1 準備服務器環(huán)境 /102
2.7.2 部署項目 /103
2.7.3 確定容器是否運行正常 /103
2.7.4 線上驗證 /105
2.8 本章小結 /106
★★第3章 了解Docker的核心原理 /107
3.1 熟悉Docker架構 /107
3.2 Linux的Namespace機制 /112
3.3 Linux底層的Cgroup隔離機制 /117
3.4 容器的生命周期 /120
3.4.1 容器的生命狀態(tài) /121
3.4.2 容器狀態(tài)之間的關系 /121
3.4.3 終止進程的SIGKILL信號和SIGTERM信號 /123
3.5 Docker的網絡與通信 /124
3.5.1 網絡驅動程序 /124
3.5.2 網橋網絡 /125
3.5.3 覆蓋網絡 /127
3.5.4 Macvlan網絡 /131
3.5.5 禁用Docker上的網絡 /133
3.6 Docker UnionFS的原理 /135
3.6.1 UnionFS的概念 /135
3.6.2 加載Docker鏡像的原理 /135
3.7 Device Mapper存儲 /138
3.7.1 鏡像分層和共享 /138
3.7.2 在Docker中配置devicemapper /139
3.7.3 配置loop-lvm模式 /140
3.7.4 配置direct-lvm模式 /142
3.7.5 最佳實踐 /146
3.8 Compose容器編排 /146
3.8.1 安裝Docker Compose /147
3.8.2 基本使用 /148
3.8.3 驗證服務是否正常 /150
3.8.4 綁定目錄與更新應用 /150
3.8.5 在后臺啟動服務 /151
3.8.6 部署分布式應用 /151
3.9 Docker源碼分析 /156
3.9.1 給初學者的建議 /156
3.9.2 學習Docker源碼的思路 /157
3.9.3 容器是如何被啟動的 /158
3.9.4 Docker Client是如何訪問Docker Server的 /165
3.9.5 Docker Engine是如何工作的 /166
3.10 本章小結 /169
★★第4章 趁熱打鐵,Docker項目實戰(zhàn) /170
4.1 前端環(huán)境準備 /170
4.1.1 Web服務器——安裝Nginx /170
4.1.2 服務器端環(huán)境——安裝Node.js /172
4.2 前端應用1——Web技術棧 /174
4.2.1 Web框架1——React實戰(zhàn) /174
4.2.2 Web框架2——Vue.js實戰(zhàn) /176
4.2.3 Web框架3——其他 /177
4.3 前端應用2——Node.js /180
4.3.1 客戶端渲染——CSR實戰(zhàn) /180
4.3.2 服務器端渲染——SSR實戰(zhàn) /180
4.4 后端環(huán)境準備 /182
4.4.1 注冊中心——ZooKeeper /182
4.4.2 消息隊列框架——Kafka /185
4.4.3 微服務框架——Dubbo /188
4.4.4 數據庫1——安裝Redis /191
4.4.5 數據庫2——安裝MySQL /192
4.4.6 數據庫3——安裝MongoDB /193
4.5 后端容器1——Java技術棧 /194
4.5.1 Java常用框架 /194
4.5.2 Java微服務容器化實戰(zhàn)——Spring Boot /197
4.5.3 Java技術棧改造的常見問題 /202
4.6 后端容器2——Go語言技術棧 /204
4.6.1 Go語言常用框架 /204
4.6.2 Web框架改造1——Gin實戰(zhàn) /205
4.6.3 Web框架改造2——Beego實戰(zhàn) /209
4.6.4 Go語言技術棧改造的常見問題 /212
4.7 后端容器3——Python技術棧 /213
4.7.1 Python常見框架 /214
4.7.2 Web框架改造——Django實戰(zhàn) /215
4.7.3 微服務框架改造——Nameko實戰(zhàn) /220
4.7.4 Python技術棧改造的常見問題 /223
4.8 Docker測試實戰(zhàn) /224
4.8.1 Docker自動化測試 /225
4.8.2 使用Docker測試靜態(tài)網站 /227
4.8.3 使用Docker進行UI自動化測試 /230
4.9 本章小結 /237
★★第5章 Docker的持續(xù)集成與發(fā)布 /238
5.1 準備鏡像倉庫 /238
5.1.1 倉庫選型 /238
5.1.2 原生Docker倉庫 /239
5.1.3 Harbor鏡像倉庫 /240
5.2 初始化容器配置文件 /244
5.2.1 生成Dockerfile文件 /244
5.2.2 Dockerfile文件配置的最佳實踐 /245
5.3 通過Jenkins持續(xù)集成Docker /248
5.3.1 部署Jenkins /248
5.3.2 創(chuàng)建Jenkins流水線 /250
5.3.3 持續(xù)集成Docker /252
5.3.4 前端緩存優(yōu)化 /255
5.4 通過Jenkins發(fā)布Docker /257
5.4.1 使用Jenkins流水線部署容器 /258
5.4.2 基于Jenkins Job的多步構建 /260
5.5 部署Docker容器監(jiān)控 /262
5.5.1 容器監(jiān)控的原理 /262
5.5.2 cAdvisor的部署與應用 /263
5.6 本章小結 /265
★★第6章 Docker的高級應用 /266
6.1 Docker的容器與進程 /266
6.1.1 容器是臨時的 /266
6.1.2 進程的概念 /267
6.1.3 容器與進程 /269
6.2 Docker的文件存儲與備份 /273
6.2.1 數據文件的存儲 /273
6.2.2 卷存儲 /274
6.2.3 綁定掛載 /276
6.2.4 tmpfs掛載 /277
6.2.5 數據文件的備份 /277
6.3 Docker的網絡配置 /278
6.3.1 Flannel網絡 /279
6.3.2 Weave網絡 /280
6.3.3 Open vSwitch /281
6.3.4 Calico網絡 /281
6.4 Docker的鏡像優(yōu)化 /281
6.4.1 常規(guī)優(yōu)化手段 /282
6.4.2 案例實戰(zhàn) /287
6.5 Docker的安全策略與加固 /292
6.5.1 Docker的安全策略 /292
6.5.2 鏡像安全 /293
6.5.3 容器網絡的安全性 /294
6.5.4 網絡攻擊與防范 /294
6.6 Docker的集群管理1——Swarm /295
6.6.1 Swarm集群管理1——Docker原生管理 /295
6.6.2 Swarm集群管理2——Swarm集群搭建 /297
6.6.3 Swarm集群管理3——Swarm WordPress部署 /302
6.7 Docker的集群管理2——Kubernetes /303
6.7.1 Kubernetes容器編排1——簡介 /303
6.7.2 Kubernetes容器編排2——架構 /304
6.7.3 Kubernetes容器編排3——安裝 /306
6.7.4 Kubernetes容器編排4——基本使用 /310
6.7.5 Kubernetes應用實踐1——Kafka容器編排 /315
6.7.6 Kubernetes應用實踐2——Redis容器編排 /330
6.7.7 Kubernetes應用實踐3——部署監(jiān)控系統(tǒng) /334
6.8 本章小結 /337
★★第7章 手把手打造企業(yè)級應用 /338
7.1 企業(yè)級云原生的持續(xù)交付模型——GitOps實戰(zhàn) /338
7.1.1 GitOps的興起 /338
7.1.2 GitOps流水線 /340
7.1.3 GitOps最佳實踐 /341
7.1.4 GitOps與可觀測性 /341
7.1.5 GitOps的優(yōu)勢 /342
7.2 企業(yè)級容器化標準 /343
7.2.1 容器化的目標 /343
7.2.2 架構選型1——服務暴露 /344
7.2.3 架構選型2——網絡選型 /348
7.2.4 架構選型3——存儲系統(tǒng) /349
7.2.5 服務治理1——部署發(fā)布 /356
7.2.6 服務治理2——服務監(jiān)控 /358
7.2.7 服務治理3——日志采集 /360
7.2.8 服務治理4——鏈路追蹤 /366
7.2.9 可靠性保障1——彈性部署 /368
7.2.10 可靠性保障2——集群 可靠性 /370
7.3 企業(yè)級方案1——微服務應用實踐 /372
7.3.1 應用演變過程中的痛點 /372
7.3.2 微服務架構設計 /376
7.3.3 微服務容器化的難點 /381
7.3.4 服務網格1——服務網格與微服務 /384
7.3.5 服務網格2——使用Istio方案 /386
7.3.6 常見問題及解決方案 /395
7.4 企業(yè)級方案2——打造多項目并行隔離環(huán)境 /401
7.4.1 項目并行開發(fā)的痛點 /401
7.4.2 容器化隔離環(huán)境方案 /403
7.4.3 用Docker + Jenkins解決工程化問題 /408
7.4.4 實現隔離插件 /414
7.4.5 配置Nginx Cookie識別與代理 /417
7.4.6 使用Kustomize對Kubernetes進行聲明式管理 /418
7.5 本章小結 /421