简介
我们的web开发堆栈真的需要另一种技术吗?
现代web开发涉及大量的文件、系统和组件:
- HTML内容和模板
- CSS样式表和预处理程序,如Sass
- 客户端JavaScript,包括React、Vue.js和slvelte等框架
- 构建诸如捆绑器、迷你器等工具。
- NGINX或Apache等web服务器
- 服务器端运行时和框架包括Node.js, PHP, Python, Ruby, . net等。
- 数据库,如MySQL, MariaDB, SQL Server或MongoDB
- 用于缓存、消息队列、电子邮件、进程监控等的其他服务。
- Git和Github的源代码控制
管理这个堆栈可以是一个挑战.
你花了多少小时在你的开发PC上安装、配置、更新和管理软件依赖?
1.1“它在我的机器上工作,伙计”
假设您最新的应用程序已经成功。你不得不雇佣另一名开发人员,让自己有更多时间赚钱。他们在工作的第一天出现,克隆你的存储库,启动代码,然后-爆炸-它失败了一个模糊的错误信息。
调试可能会有所帮助,但您的环境是不一样的……
- 你用Mac,他们用Windows
- 你用Node.js v10开发的应用,他们已经安装了v14
- 你使用的是MongoDB v3.6,他们是v4.2
分歧越来越大。
你也许可以在几个小时内解决这些问题,但是……
- 你能保持每个依赖项同步吗?
- 随着团队和设备数量的增长,这可行吗?
- 这些依赖关系在所有开发操作系统和生产服务器上可用吗?
有些公司会实施设备锁定政策,禁止你使用最新或最合适的工具。(请不要当那个老板!)
1.2虚拟加工
应用程序可以在虚拟机(VM)中运行,而不是限制设备和软件。虚拟机允许在仿真硬件环境中安装操作系统;本质上,它就是一台在你的电脑上运行的电脑。
跨平台虚拟机选项包括VMware而且VirtualBox.您可以用您的应用程序及其所有依赖项创建一个Linux(或其他)VM。虚拟机只是数据:它可以被复制并运行在任何机器上真正的Windows、macOS或Linux设备。每个开发人员(以及活动的服务器)都可以运行相同的环境。
不幸的是,虚拟机很快就变得不切实际:
- 虚拟机磁盘镜像较大,克隆难度大
- 单个虚拟机可以自动更新,也可以由单个开发人员更新,因此它与其他虚拟机不同步
- 虚拟机需要大量计算资源:它是在另一个操作系统的模拟硬件上运行的完整操作系统.
1.3 Docker交付
码头工人解决了所有这些问题。而不是在PC上安装依赖项,而是在类似vm的轻量级隔离环境中运行它们容器.
在一个命令中,您可以下载、配置和运行所需的任何服务或平台组合。是的,一个命令。(不可否认,这可能是一个相当复杂的命令,但这就是这本书的来源!)
发展效益包括:
- 所有开发人员都可以在macOS、Linux和Windows上使用相同的Docker容器
- 应用程序的安装、配置、维护和测试变得更加容易
- 应用程序在与开发PC隔离的虚拟环境中运行
- 同一应用程序或运行时的多个版本可以同时在同一台PC上使用,例如PHP 5.6, 7.0, 7.4等。
- 开发人员可以保留本地开发的所有好处,并且可以无风险地进行试验。
类似的Docker环境也可以部署在生产环境中:
- 可以简化持续集成和交付流程,实现零停机时间的快速部署
- 通过水平伸缩可以提高性能。可以添加更多的应用程序容器来处理增加的流量。
- 服务更加健壮。如果容器发生故障,可以自动重新启动,无需停机时间。
- 应用程序是安全的。容器可以配置为只与彼此通信,而不与外界通信。MySQL数据库可以被WordPress容器使用,而无需暴露给主机操作系统等。
1.4不,我还是不相信
我也不是。
当我第一次遇到Docker时,它似乎是一个不必要的、有点令人生畏的障碍。我有丰富的运行虚拟机和配置软件依赖的经验我肯定不需要了吧?
Docker文档是全面的,但它有一个陡峭的学习曲线。教程通常很糟糕,并且:
假定读者完全理解所有的行话,
未能解释或过度解释深奥的观点,以及
很少涉及在开发过程中如何使用Docker。
刚开始时,我以为Docker不能处理动态应用程序重启或调试。教程经常声称,每次代码更改都需要缓慢而繁琐的应用程序重新构建。
我放弃了。
我最终被另一名开发者发现了(谢谢Glynne !)这让我花了几个月的时间深入研究Docker,我意识到我错过了什么。
例子:我创建了很多基于wordpress的网站。
我通常直接在Windows或Ubuntu虚拟机上开发这些,在那里必须安装/更新Apache、SSL、PHP、MySQL和WordPress本身。在开始真正的开发工作之前。
等效的Docker过程需要几分钟来初始化,并且可以为每个新项目克隆(参见使用Docker开发WordPress)。每个安装都存在于自己的隔离环境中,该环境可以进行源代码控制并分发给其他开发人员。
也就是说,我从未使用Docker将WordPress部署到生产服务器上。WordPress主机无处不在,而且价格便宜;我很乐意让其他人来管理这些依赖项。但是,由于我在开发PC上复制了生产服务器环境,因此潜在的问题被最小化了。
使用Docker构建应用程序要容易得多。我不想听起来像个销售人员,Docker将彻底改变您的开发!
1.5 {insert-technology-here}不是它的位置吗?
无论您使用哪种web开发方法和堆栈,Docker都有帮助。它在构建时提供了一致的环境,并且/或与生产服务器上的依赖关系紧密匹配。
您的Docker环境:
- 在没有活跃/快速互联网连接的情况下工作(在旅行,演示等时非常有用)
- 允许无风险的实验。没有人会介意你不小心擦除本地MySQL数据库。
- 不受成本和使用限制。
1.5.1单片web应用
单片应用程序包含前端和后端代码的混合。通常,应用程序使用web服务器、服务器语言运行时、数据存储和客户端HTML、CSS、JavaScript和框架来呈现页面并提供api。WordPress就是一个典型的例子。
Docker可以用来复制该环境,这样所有依赖项都可以在开发PC上使用。
1.5.2无服务器web应用
无服务器应用程序在浏览器中实现大多数功能,通常使用JavaScript框架创建单页应用程序(SPA)。核心站点/应用程序只下载一次。
其他数据和服务由小型api提供,可能作为无服务器函数运行。尽管名称如此,服务器仍在使用-但您不需要担心管理它们。您创建了一个函数,该函数可以根据需要从JavaScript Ajax请求中启动,例如通过电子邮件将数据发送给销售团队的代码。
Docker可以在开发环境中使用:
- 运行构建过程,如JavaScript模块捆绑和Sass预处理
- 服务于web应用程序,以及
- 模拟基础设施进行无服务器功能测试。
1.5.3静态站点
静态站点是使用构建过程构建的,该过程将内容(标记文件、JSON数据、数据库字段等)放入模板中,以创建静态HTML、CSS、JavaScript和媒体文件的文件夹。这些预呈现的文件可以部署在任何地方:不需要服务器端运行时或数据库。
静态站点通常被称为静态站点JAMstack(JavaScript, api和Markdown)。在可能的情况下,所有内容都是预先呈现的,但动态服务(如站点搜索)可以采用基于服务器的api。
Docker可用于在任何开发PC上提供可复制的构建环境。
1.6要点
本章你学到了什么:
Docker可以在单独的容器中启动应用程序的所有依赖项。
这包括服务器、数据库、语言运行时等。在大多数情况下,这些将需要很少或不需要配置。
Docker是跨平台的。
它可以在Windows、macOS和Linux上运行。您的应用程序可以在任何PC上工作。
Docker可以-而且应该-在开发环境中使用。
如果可行的话,还可以在生产系统中使用它。
下一章将更详细地描述Docker的概念。