为什么要进行编排?
学习将应用程序部署到生产环境的好处,以及如何部署你的应用。
本课程主要讲解如何在开发过程中使用 Docker 来模拟生产环境。你的线上服务器可能并不使用 Docker,这没有问题,例如你运行的是由专业公司托管的 WordPress 网站。
然而,将应用容器部署到生产服务器上具有多项优势。容器可以:
- 监控可用性或响应速度。
- 在发生故障时自动重启。
- 根据需求进行扩展。
- 在不中断服务的情况下更新(前提是至少有一个应用容器保持运行,其他容器可陆续更新)。
依赖项规划
在规划基于容器的生产环境时,需要做出许多决策。
一些依赖项(如数据库)可以由云服务提供。软件即服务(SaaS)公司已为你完成大部分工作,无需担心安装、维护、安全、扩展、磁盘空间或备份等问题。
另一种选择是自行安装和管理数据库应用,可能是出于成本、安全性或避免供应商锁定的考虑。在这种情况下,将数据库直接安装在宿主操作系统上,可能比在受 CPU、内存和磁盘限制的容器中运行更合适。
应用扩展
我们之前运行的 Node.js 应用程序基于单个处理线程,其他语言运行时也采用类似模型。尽管服务器(或容器)可能拥有多个 CPU 核心,但只有其中一个会实际执行应用程序。
通过运行多个容器实例,可以实现更高效的并行处理。相比自建集群或使用 PM2 等进程管理工具,容器具有更好的隔离性,并能自动重启。
你可以使用 Docker Compose 或脚本启动多个应用容器实例。如果所有实例都部署在同一台生产服务器上,每个实例需要不同的名称和暴露给主机的不同端口,例如三个实例:
1docker run -d --rm --name container1 -p 3001:3000 myimage 2docker run -d --rm --name container2 -p 3002:3000 myimage 3docker run -d --rm --name container3 -p 3003:3000 myimage
📌 如需让容器退出或崩溃时自动重启,请将
--rm替换为--restart=always(Docker 不允许同时使用这两个选项)。
可以使用 NGINX 等负载均衡器(运行在宿主系统或另一个容器中),将传入请求转发到其中一个应用端口。三位用户同时访问时,可由不同容器并行处理。
如果觉得这很繁琐:确实如此。而这还只是开始——尚未考虑共享数据卷,以及在同网络内的多台物理或虚拟服务器之间分布容器的情况。幸运的是,存在更简便的解决方案。
编排概述
编排 是一种用于跨一个或多个设备管理、扩展和维护容器化应用的过程。
用于管理容器化应用的工具被称为 编排器。最早的编排器之一是 Apache Mesos,随后出现了由 Google 开发的开源系统 Kubernetes,常简称为 K8S。Docker 完全支持 Kubernetes,同时也提供了更简单的 Docker Swarm。
但事情很快变得复杂起来。
存在数十种实现方式(Kubernetes 文档列出至少十五种),而各大云服务商也提供基于 Kubernetes 的编排服务,各自使用不同的术语和方法:Amazon EKS、Google Kubernetes Engine、Azure Kubernetes Service、阿里云 ACK、腾讯云 TKE 等。
这些服务商还提供自己的负载均衡、数据存储和文件存储产品,有时比容器化的服务更具优势。
此外,还有大量公司提供更简单直观的界面来对接大型云服务,进一步增加了选择的复杂性。
选择合适的编排服务
可供选择的方案众多且不断变化,足以单独成书。
对于小型或测试用途的应用,使用 Docker Swarm 并搭配价格低廉的托管服务(如 DigitalOcean)是一个简单易行的入门方式。
对于用户量达数万甚至更多的大型应用,采用功能更强大的基于 Kubernetes 的服务通常更为合适。建议在选择服务时寻求专业意见。