# 第5章 示例:Beanstalk环境
目前,大多数软件公司内部都有多套基础设施环境。这些环境具有典型的3层结构:测试、预演和生产环境。部分公司在此之外还有预生产甚至是公测(canary)环境,不过这些都是特例。不同的环境为新代码甚至是基础设施组件的生命周期提供了隔离。这些环境通常由至少一个用于应用程序逻辑和展示的Web服务器层和一个数据库层组成。过去的10多年里,这些环境在不同公司内部已经相当稳定。我们在RelateIQ发现了另外一个极佳的Docker环境示例。他们正在做的事情很有趣,有可能打破这种标准的环境模式。
RelateIQ使用AWS Beanstalk为每个分支完整地编排出一个Web环境。这是通过其CI/CD基础设施使用Docker技术创造出来的一个全新的基础设施环境。他们从根本上把Web层与数据层分开。将典型的3层模型转换成仅剩数据存储。这一点一开始可能有点儿难以想象,我们来直观地看一下(如图5-1所示)。
![图像说明文字](https://box.kancloud.cn/ade4cdc78a107dab89fc2a590c4dc861_700x324.jpeg)
图5-1
图5-1展示了3个不同的分支,即PerfTest、新的APD及新的UI分支。每个分支通过CI/CD系统来构建自己的Web容器。容器被构建和测试后,将被推送到仓库中。任何开发人员或团队,都能根据需要构建各个分支的Web环境。这还允许用户以不同的方式考虑如何使用容器,同时重新考虑环境的各个部分。SaaS公司采用这种模式的巨大优势之一是适应快速变化的能力。试想一下,如果将这类环境用于持续交付模型中,产品经理和设计师会如何利用这些环境。
举个例子,RelateIQ在2014年夏季通过Docker使用这种新模式,用一个全新的外观取代CSS,完全重新设计了整个Web应用程序。他们可以在并排的Web服务器中运行A/B测试,以对新旧版本进行比较。由于开发人员会在15~30分钟内提交代码,设计师和产品经理能够在一个隔离的环境中看到最近生效的变化。使用环境变量,还能够将Web服务器后端从预演数据服务器重定向到生产数据服务器上。Docker容器快速重启后,他们就能在几分钟内看到生产数据的最近生效的变化。当RelateIQ准备上线新设计的网站时,他们只需将容器从预演数据切换到生产数据。这样,开发人员就能确保数据与新UI正确匹配。
在这个环境中,RelateIQ使用Teamcity构建和部署应用程序。他们使用VCS触发器来监控GitHub仓库中特定的分支名称,以执行自动构建。例如,他们使用了“`docker-<分支>`”这样的名称。如果仓库中创建了一个以“`docker-`”开头的分支,那么这个分支自身的Docker容器将会自动被构建。为了快速启动,大多数开发人员会在预演时直接创建分支。分支一旦创建,Teamcity就会构建这个容器并推送到一个本地仓库中。他们使用亚马逊AWS的Beanstalk服务来部署和更新容器。
“AWS Elastic Beanstalk 是一项易于使用的服务,用于在熟悉的服务器(如 Apache 、Nginx、Passenger 和 IIS )上部署和扩展使用 Java、.NET、PHP、Node.js、Python、Ruby、GO 和 Docker 开发的 Web 应用程序和服务。
您只需上传代码,Elastic Beanstalk 即可自动处理从容量预置、负载均衡、自动扩展到应用程序健康监控的部署。同时,您能够完全控制为应用程序提供支持的 AWS 资源,并可随时访问基础资源。”
——来源于[亚马逊](http://aws.amazon.com/cn/elasticbeanstalk/)
Beanstalk将自动部署一台负载均衡器,设置自动扩展组,根据设置配备相应数量的实例/服务器,拉取并运行Docker容器,提供健康监控,并且使用安全组加固服务器。对刚刚起步的公司而言,这将使其在基础设施方面走得很远。如果将其与“一个Web服务一个容器”组合起来,对SaaS公司来说,这将变成一个非常有用的环境。
部署的执行有多种方式,从Elastic Beanstalk到使用S3存储桶(bucket)的JSON文件或对服务自身的API调用。在本示例中,使用的是在Teamcity配置中创建的S3存储桶的JSON文件。构建步骤之一将写新文件,并将变化推送给S3存储桶。文件包含了容器的位置、需要打开的端口,以及容器的名称。新文件被上传后,Elastic Beanstalk环境将自动启动一台新服务器,在这台服务器上拉取容器并进行设置,然后在健康检查通过后停止旧的容器和服务器(如图5-2所示),基本上创造了新服务的零停机时间部署。
![图像说明文字](https://box.kancloud.cn/8a0d6b53f65e50cda813d1c62761073e_700x313.jpeg)
图5-2
Elastic Beanstalk的使用表明,基础设施供应商真正开始运行自有容器只是时间问题,就像他们之前运行虚拟化基础设施一样。
Elastic Beanstalk容器的日志是全自动化的,就像该基础设施的其他部分一样。可以通过GUI工具拉取日志,并选择拉取的是服务器上的完整日志还是标准输出的最后100行。这两个选项只在排错时才有用,因此他们提供了一个新选项用于将日志尾部发送到S3存储桶中。使用能读取S3服务日志的集中式日志服务让公司能将这些日志直接集成到现有日志方案中。围绕日志部分有几个注意事项。日志的名称与容器名称无关。其名称是根据一个作为服务唯一标识而随机生成的服务名称所创建的。要追踪哪个唯一标识属于哪个Elastic Beanstalk将非常麻烦。
所有通过亚马逊AWS提供的服务都内置了各自的云监控方案,也支持Elastic Beanstalk。不过,监控非常基础。能获取ELB指标和服务器指标,但无法从容器本身获取任何东西。这是由于Elastic Beanstalk服务中容器与服务器比例为1:1。这意味着网络、CPU、磁盘以及内存指标通常来自于运行于宿主机上的容器指标。如果机器出现异常,只能SSH登录到服务中进行排错或部署新版本。
Beanstalk通过安全组和IAM角色提供了自动化防火墙端口安全,以加固用户访问。由于Beanstalk使用一个很低的容器宿主机比例,就像普通的应用程序和服务器环境一样,要将容器与其他容器隔离开非常容易。Beanstalk模板保证了跨新部署时新环境的一致性,可以轻松进行跨多台宿主机的安全性修改。
通过使用Docker以及亚马逊AWS的Elastic Beanstalk自动化基础设施,RelateIQ能够在一个可扩展的模板环境中为每一位前端工程师提供一个Web环境。这个环境非常容易创建,加上CI/CD系统的一点编排,它是完全自动化的。注意:如果想在自己的基础设施中做尝试,这个环境还有很多部分处于构建状态。日志可以做得更好,因为Beanstalk环境提供的唯一标识非常难用,截至本书编写时,每个服务上已经运行一个容器(很快就能支持多容器)。请记住,使用Docker可以让环境变得异常灵活,并为推动开发速度提供新的创新方法。
在第6章中,我们将深入讲述Docker的安全性话题。
- 版权信息
- 版权声明
- 内容提要
- 对本书的赞誉
- 译者介绍
- 前言
- 本书面向的读者
- 谁真的在生产环境中使用Docker
- 为什么使用Docker
- 开发环境与生产环境
- 我们所说的“生产环境”
- 功能内置与组合工具
- 哪些东西不要Docker化
- 技术审稿人
- 第1章 入门
- 1.1 术语
- 1.1.1 镜像与容器
- 1.1.2 容器与虚拟机
- 1.1.3 持续集成/持续交付
- 1.1.4 宿主机管理
- 1.1.5 编排
- 1.1.6 调度
- 1.1.7 发现
- 1.1.8 配置管理
- 1.2 从开发环境到生产环境
- 1.3 使用Docker的多种方式
- 1.4 可预期的情况
- 为什么Docker在生产环境如此困难
- 第2章 技术栈
- 2.1 构建系统
- 2.2 镜像仓库
- 2.3 宿主机管理
- 2.4 配置管理
- 2.5 部署
- 2.6 编排
- 第3章 示例:极简环境
- 3.1 保持各部分的简单
- 3.2 保持流程的简单
- 3.3 系统细节
- 利用systemd
- 3.4 集群范围的配置、通用配置及本地配置
- 3.5 部署服务
- 3.6 支撑服务
- 3.7 讨论
- 3.8 未来
- 3.9 小结
- 第4章 示例:Web环境
- 4.1 编排
- 4.1.1 让服务器上的Docker进入准备运行容器的状态
- 4.1.2 让容器运行
- 4.2 连网
- 4.3 数据存储
- 4.4 日志
- 4.5 监控
- 4.6 无须担心新依赖
- 4.7 零停机时间
- 4.8 服务回滚
- 4.9 小结
- 第5章 示例:Beanstalk环境
- 5.1 构建容器的过程
- 部署/更新容器的过程
- 5.2 日志
- 5.3 监控
- 5.4 安全
- 5.5 小结
- 第6章 安全
- 6.1 威胁模型
- 6.2 容器与安全性
- 6.3 内核更新
- 6.4 容器更新
- 6.5 suid及guid二进制文件
- 6.6 容器内的root
- 6.7 权能
- 6.8 seccomp
- 6.9 内核安全框架
- 6.10 资源限制及cgroup
- 6.11 ulimit
- 6.12 用户命名空间
- 6.13 镜像验证
- 6.14 安全地运行Docker守护进程
- 6.15 监控
- 6.16 设备
- 6.17 挂载点
- 6.18 ssh
- 6.19 私钥分发
- 6.20 位置
- 第7章 构建镜像
- 7.1 此镜像非彼镜像
- 7.1.1 写时复制与高效的镜像存储与分发
- 7.1.2 Docker对写时复制的使用
- 7.2 镜像构建基本原理
- 7.2.1 分层的文件系统和空间控管
- 7.2.2 保持镜像小巧
- 7.2.3 让镜像可重用
- 7.2.4 在进程无法被配置时,通过环境变量让镜像可配置
- 7.2.5 让镜像在Docker变化时对自身进行重新配置
- 7.2.6 信任与镜像
- 7.2.7 让镜像不可变
- 7.3 小结
- 第8章 存储Docker镜像
- 8.1 启动并运行存储的Docker镜像
- 8.2 自动化构建
- 8.3 私有仓库
- 8.4 私有registry的扩展
- 8.4.1 S3
- 8.4.2 本地存储
- 8.4.3 对registry进行负载均衡
- 8.5 维护
- 8.6 对私有仓库进行加固
- 8.6.1 SSL
- 8.6.2 认证
- 8.7 保存/载入
- 8.8 最大限度地减小镜像体积
- 8.9 其他镜像仓库方案
- 第9章 CI/CD
- 9.1 让所有人都进行镜像构建与推送
- 9.2 在一个构建系统中构建所有镜像
- 9.3 不要使用或禁止使用非标准做法
- 9.4 使用标准基础镜像
- 9.5 使用Docker进行集成测试
- 9.6 小结
- 第10章 配置管理
- 10.1 配置管理与容器
- 10.2 面向容器的配置管理
- 10.2.1 Chef
- 10.2.2 Ansible
- 10.2.3 Salt Stack
- 10.2.4 Puppet
- 10.3 小结
- 第11章 Docker存储引擎
- 11.1 AUFS
- 11.2 DeviceMapper
- 11.3 BTRFS
- 11.4 OverlayFS
- 11.5 VFS
- 11.6 小结
- 第12章 Docker 网络实现
- 12.1 网络基础知识
- 12.2 IP地址的分配
- 端口的分配
- 12.3 域名解析
- 12.4 服务发现
- 12.5 Docker高级网络
- 12.6 IPv6
- 12.7 小结
- 第13章 调度
- 13.1 什么是调度
- 13.2 调度策略
- 13.3 Mesos
- 13.4 Kubernetes
- 13.5 OpenShift
- Red Hat公司首席工程师Clayton Coleman的想法
- 第14章 服务发现
- 14.1 DNS服务发现
- DNS服务器的重新发明
- 14.2 Zookeeper
- 14.3 基于Zookeeper的服务发现
- 14.4 etcd
- 基于etcd的服务发现
- 14.5 consul
- 14.5.1 基于consul的服务发现
- 14.5.2 registrator
- 14.6 Eureka
- 基于Eureka的服务发现
- 14.7 Smartstack
- 14.7.1 基于Smartstack的服务发现
- 14.7.2 Nerve
- 14.7.3 Synapse
- 14.8 nsqlookupd
- 14.9 小结
- 第15章 日志和监控
- 15.1 日志
- 15.1.1 Docker原生的日志支持
- 15.1.2 连接到Docker容器
- 15.1.3 将日志导出到宿主机
- 15.1.4 发送日志到集中式的日志平台
- 15.1.5 在其他容器一侧收集日志
- 15.2 监控
- 15.2.1 基于宿主机的监控
- 15.2.2 基于Docker守护进程的监控
- 15.2.3 基于容器的监控
- 15.3 小结
- DockOne社区简介
- 看完了