
云原生时代,应用变得越来越强大,与此同时,它的复杂度也在呈指数级上升。希望实现基础设施和流程现代化,甚至组织文化现代化的企业的最终目标是仔细选择最适合其具体情况的云技术。在现代化的企业应用中,集群部署、隔离环境、灰度发布、服务网格及动态扩容/缩容缺一不可,而Docker 技术则是其中间的必要桥梁。 本书将围绕Docker 技术展开介绍,通过“七步法”为读者构建完善的学习体系。开篇先通过“盖房子”的故事展开,让读者迅速了解Docker 是什么、能做什么。然后补充一些与Docker 技术相关的基础知识,包含Linux、Shell、Nginx 及网络调试基础,为读者的后续学习扫除障碍。最后通过示例帮助读者进行Docker 容器化体验。“授人以鱼,不如授人以渔”。本书通过剖析Docker 的核心原理、持续集成与发布及企业级应用案例,一步步为读者打造“通向企业级应用”的阶梯。 本书内容详尽,由浅入深,案例丰富。
近些年来,以Docker为核心的容器技术如日中天。在企业“降本增效”的前提下,容器方案贯穿于应用的每个核心链路。众所周知,每轮新技术的兴起,对于个人和公司来说,既是机会也是挑战。因此,软件行业的从业者的正确做法就是尽快上手,成为互联网时代的“弄潮儿”。 本书正是致力于此,为读者提供详细的Docker入门知识。按照“七步法”进行学习,读者可以轻松入门,学有所获。 ★★为什么要写本书 市场上不乏Docker技术相关的书籍,但其或围绕官方基础文档缺乏新意,或者直入源码让初学者望而却步。鲜有既满足初学者入门需要,又结合企业实际案例的书籍。作者正是看到了这一点,另辟蹊径,从读者的角度出发,提出了“七步法”的概念。 何谓“七步法”?“七”既是人们最容易记住的数字,也是人类瞬间记忆的极限,本书正是立意于此。 第一步是从具象的故事开始,开门见山,降低认知门槛。 第二步则通过“第一个Docker项目”,帮助读者快速上手。在读者建立起体系概念后, 第三步则直切核心原理,围绕Docker架构展开,由浅入深地讲解Docker底层的隔离机制、容器的生命周期、网络与通信、存储原理及源码。深入剖析,“知其然而知其所以然”。 第四步趁热打铁,围绕前后端项目,从全栈角度进行项目实战。 第五步则从Docker运维角度出发,进一步补充读者的知识图谱,这也是初学者最容易忽视的内容。 从第六步开始就步入了高级教程,该部分重点围绕Docker技术最佳实践展开,提供了容器与进程、文件存储与备份、网络配置、镜像优化及安全策略与加固等内容,案例丰富,操作性强。 第七步则升华全书内容,通过云原生持续交付模型、企业级容器化标准及两个实际的企业级方案,将本书所有内容进行串联。 至此,七步完成。读者可以清晰地感受每一步带来的技术提升,稳扎稳打,从而将Docker技术融会贯通。 ★★本书的特点 本书的特点是趣味易懂、案例丰富、实操性强。 (1)趣味易懂。 本书中较多的原理,剥除了Docker官方文档晦涩难懂的“外衣”,通过趣味故事展开。例如,通过“盖房子”来理解Docker是什么,通过“别墅与胶囊旅馆”来阐述容器与虚拟机的概念,通过“工厂和车间”来说明进程和线程,等等。 读者无须记忆,就可轻松理解,这也正是本书想要传达的观点:技术并非神秘莫测,而是缺乏技巧。 (2)案例丰富。 本书第2章和第4~7章都包含大量的案例。不管是“第一个Docker项目”还是项目实战、企业案例,都包含了大量的代码讲解。读者完全可以按照教程逐步实现,体验Docker编程的乐趣。 (3)实操性强。 值得一提的是,本书案例均来自实际的研发项目,为了让读者能够轻松掌握,去除了容器中包含的业务逻辑,保留了Docker的核心架构,实操性强。熟练掌握本书中的案例,沉淀其所表现出来的方法论,读者一定能够在企业应用中灵活运用,事半功倍。 ★★本书的读者 (1)软件开发人员。 有了Docker,软件开发人员可以聚焦业务逻辑,而不必再为了项目配置的差异、运行环境的不同而惆怅。 (2)软件测试人员。 软件测试人员每天都会面对大量的测试任务,手动执行测试用例会耗费大量的时间。在这种场景下,软件测试人员可以考虑使用Docker进行自动化改造。 自动化的成本是首次自动化程序的编写和维护,而收益则是解放人力、提高生产力。 (3)软件运维人员。 对于软件运维人员来说,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