云原生时代,应用变得越来越强大,与此同时,它的复杂度也在呈指数级上升。希望实现基础设施和流程现代化,甚至组织文化现代化的企业的最终目标是仔细选择最适合其具体情况的云技术。在现代化的企业应用中,集群部署、隔离环境、灰度发布、服务网格及动态扩容/缩容缺一不可,而Docker 技术则是其中间的必要桥梁。 本书将围绕Docker 技术展开介绍,通过“七步法”为读者构建完善的学习体系。开篇先通过“盖房子”的故事展开,让读者迅速了解Docker 是什么、能做什么。然后补充一些与Docker 技术相关的基础知识,包含Linux、Shell、Nginx 及网络调试基础,为读者的后续学习扫除障碍。最后通过示例帮助读者进行Docker 容器化体验。“授人以鱼,不如授人以渔”。本书通过剖析Docker 的核心原理、持续集成与发布及企业级应用案例,一步步为读者打造“通向企业级应用”的阶梯。 本书内容详尽,由浅入深,案例丰富。
王嘉涛 北京百家互联科技有限公司,前端基础技术负责人李传龙 百度在线网络技术(北京)有限公司高级工程师卢桂周 北京拉勾网络技术有限公司高级工程师
★★第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 区分物理机、虚拟机与容器 /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 项目开发的主要阶段 /78
2.1.1 一般项目开发的主要阶段 /78
2.1.2 Docker项目开发的主要阶段 /79
2.2 项目前期准备 /80
2.2.1 准备相关环境 /80
2.2.2 准备项目 /81
2.3 对Web项目进行容器化改造 /84
2.3.1 构建项目 /84
2.3.2 配置Nginx文件 /85
2.3.3 创建和配置Dockerfile文件 /88
2.4 构建项目镜像 /89
2.4.1 准备启动环境 /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 发布项目 /102
2.7.1 准备服务器环境 /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 容器的生命状态 /121
3.4.2 容器状态之间的关系 /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项目实战 /170
4.1 前端环境准备 /170
4.1.1 Web服务器——安装Nginx /170
4.1.2 服务器端环境——安装Node.js /172
4.2 前端应用1——Web技术栈 /174
4.2.1 Web框架1——React实战 /174
4.2.2 Web框架2——Vue.js实战 /176
4.2.3 Web框架3——其他 /177
4.3 前端应用2——Node.js /180
4.3.1 客户端渲染——CSR实战 /180
4.3.2 服务器端渲染——SSR实战 /180
4.4 后端环境准备 /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微服务容器化实战——Spring Boot /197
4.5.3 Java技术栈改造的常见问题 /202
4.6 后端容器2——Go语言技术栈 /204
4.6.1 Go语言常用框架 /204
4.6.2 Web框架改造1——Gin实战 /205
4.6.3 Web框架改造2——Beego实战 /209
4.6.4 Go语言技术栈改造的常见问题 /212
4.7 后端容器3——Python技术栈 /213
4.7.1 Python常见框架 /214
4.7.2 Web框架改造——Django实战 /215
4.7.3 微服务框架改造——Nameko实战 /220
4.7.4 Python技术栈改造的常见问题 /223
4.8 Docker测试实战 /224
4.8.1 Docker自动化测试 /225
4.8.2 使用Docker测试静态网站 /227
4.8.3 使用Docker进行UI自动化测试 /230
4.9 本章小结 /237
★★第5章 Docker的持续集成与发布 /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持续集成Docker /248
5.3.1 部署Jenkins /248
5.3.2 创建Jenkins流水线 /250
5.3.3 持续集成Docker /252
5.3.4 前端缓存优化 /255
5.4 通过Jenkins发布Docker /257
5.4.1 使用Jenkins流水线部署容器 /258
5.4.2 基于Jenkins Job的多步构建 /260
5.5 部署Docker容器监控 /262
5.5.1 容器监控的原理 /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的镜像优化 /281
6.4.1 常规优化手段 /282
6.4.2 案例实战 /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——部署监控系统 /334
6.8 本章小结 /337
★★第7章 手把手打造企业级应用 /338
7.1 企业级云原生的持续交付模型——GitOps实战 /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的优势 /342
7.2 企业级容器化标准 /343
7.2.1 容器化的目标 /343
7.2.2 架构选型1——服务暴露 /344
7.2.3 架构选型2——网络选型 /348
7.2.4 架构选型3——存储系统 /349
7.2.5 服务治理1——部署发布 /356
7.2.6 服务治理2——服务监控 /358
7.2.7 服务治理3——日志采集 /360
7.2.8 服务治理4——链路追踪 /366
7.2.9 可靠性保障1——弹性部署 /368
7.2.10 可靠性保障2——集群 可靠性 /370
7.3 企业级方案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 企业级方案2——打造多项目并行隔离环境 /401
7.4.1 项目并行开发的痛点 /401
7.4.2 容器化隔离环境方案 /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