十二、云与 DevOps

我们不想在书的结尾不讨论云和 DevOps 函数。在云平台存在的情况下,在内部安装服务器不是一个好的解决方案;因此,在本章中,您将了解为什么应用程序应该使用云,以及哪个提供商最适合您的需求。此外,您还将学习如何使用自动化工具将应用程序部署到这些云平台。

DevOps 的角色与云密切相关,因此我们将讨论这个主题以及 DevOps 的任务是什么。

云是什么?

解释我们所知的云的最快方式是说,云是互联网上托管的在线服务的交付,但我们也可以说,云允许我们以非常简单的方式消费数字资源。目前使用的一些常见云服务包括磁盘存储、虚拟机或电视服务等。可以想象,云的主要好处是我们不需要在家中构建和维护这些基础设施。

作为开发人员,您将知道云是我们应用程序的一种好方法。让我们来看看一些优点。

可自动伸缩且有弹性

当你的应用程序在线时,不可能预测在几个月甚至几天内流量是否会非常高。云允许我们拥有一个与应用程序的流量或消耗资源相匹配的自动伸缩基础设施。如果您的流量增加,它可能会增加;如果您的应用程序没有您希望的流量,它可能会减少。

通常,当您想要调整服务器大小时,有三个选项。在下一张图片中,我们将以图形方式向您展示调整服务器大小所需的不同选项。黄线是应用程序可以管理的最大负载,蓝线是站点的当前负载:

  • 图 1:在流量高峰时,为了避免出现流量问题,需要使用比需要更多的服务器。
  • 图片 2:正常流量使用足够的服务器。您应该知道,在特定的日子里可能会出现问题。例如,如果您的应用程序是在线商店,那么问题可能会在黑色星期五之类的日子出现。
  • Picture 3: Use an elastic Cloud; it increases and decreases by adding or removing servers automatically depending on the peak traffic so that you always have the infrastructure you need.

    Autoscalable and elastic

    调整大小的方法

管理力度较低

如果您失去了设置服务器和执行维护任务的时间,那么您就失去了可以用来改进应用程序的时间。云允许我们只关注我们的应用程序,因为它为我们提供了一种开发应用程序的新方法,提供了预配置的资源,允许我们开发应用程序,而不必担心我们正在处理的基础设施。

此外,云通常为我们提供一个完整且有用的仪表板来管理机器,因此我们不再需要使用 SSH 控制台,从而使我们的任务更容易。它甚至为我们提供了更好的方法来管理数据库和负载平衡器或证书。

更便宜

使用云计算比把服务器放在家里便宜。这些节省是由于以下原因:

  • 您只需一直为所需的基础设施付费,因此,当应用程序上的流量增长时,您无需更改计算机
  • IT 人员(如果您需要的话)将更加高效,因为他们只关注云无法帮助解决的问题

请注意,当您为云服务器付费时,您不仅仅是在为服务器付费;此服务器还包括存储、操作系统、虚拟化、物理空间、更新、冷却系统以及许多其他内容,如能源或数据中心操作。

长得更快

这一点与最后一点密切相关。如果您的应用程序是新的,并且您不知道它是否会成功,那么购买物理服务器和所有相关的东西以使您的应用程序联机并不是一个好主意。

使用云计算,你可以每月支付所需服务器的费用,如果应用程序不能按预期运行,你可以减少计划,甚至关闭计划,这样你就可以花更少的钱。

此外,在开始时省钱可以让你更快地成长,关注并把钱投入到应用程序中,而不是在硬件上花钱。

上市时间

如果你想测试新想法并把它们放到网上,它会更快。这是云的主要优势,在互联网上非常宝贵。对于大公司来说,很难像小公司那样快速发展,而云允许他们以简单快捷的方式在线加入变化,这使其成为一种非常有竞争力的优势。

选择您的云提供商

选择最好的云提供商并非易事,但您可以检查您的应用程序需求,以选择最适合它的提供商。

考虑下面的事情:

  • 确保您的提供商了解您的需求:您的团队与云提供商之间的沟通至关重要。非常重要的一点是,您的提供商必须了解诸如每秒读/写次数、用户来自何处(如果有并发用户)、部署脚本如何工作,或者您的开发、登台和生产环境是什么样的。
  • 我的数据在哪里:云服务器位于某处,因此知道它们在哪里很重要,因为如果您存储客户数据,法律可能不允许您在某些国家存储数据。
  • 安全:如果您的应用程序不安全,您将一直处于风险之中,因此最好了解您的云提供商有哪些保护系统,例如防火墙或它们如何隔离硬件,以避免入侵,以及它们是否提供 24 小时支持。
  • 在移动应用程序之前测试:您的云提供商可能允许您在移动整个应用程序之前测试服务,因此使用此选项检查服务器是否足以满足您的流量和资源。

亚马逊网络服务(AWS)

互联网巨头亚马逊有自己的云。它提供网络托管和许多其他服务来帮助公司。Amazon Web ServicesAWS上最重要的功能是负载平衡器,可以将应用程序的某些任务(如处理数据或 Web 托管)发送到 Amazon。

总而言之,AWS 不仅仅是一个简单的云,它还包括许多服务(超过 50 项),面向需要亚马逊提供的特定功能的网络专家和其他人。

亚马逊根据我们使用它的时间给我们提供了一些不同的价格计划选项——AWS 可能提供每小时、每年甚至 3 年的价格。

云上一个重要的东西是服务级别协议SLA。对于亚马逊来说,这包括每月保证 99.95%的正常运行时间。

AWS 上的定制工作类似于模板;换句话说,目前不可能为应用程序完整配置 CPU、RAM 和空间;您应该在一些模板选项之间进行选择,因此如果您只需要更多的 RAM,您不能只升级 RAM,您应该选择另一个模板来升级 CPU 和硬盘。

通常,云服务器分布在世界许多国家。亚马逊 EC2(AWS 的服务器)目前位于北美(16)、南美(3)、欧洲(7)、亚洲(14)。

值得注意的是,目前,根据普遍共识,AWS 在带宽和处理能力方面给我们带来的成本效益比最差。它仍然是市场上功能最齐全的解决方案,但它可能不是最适合您的。

微软 Azure

Azure 是 Microsoft 操作系统,它为我们提供了在云上执行和部署应用程序和服务的环境。它为我们提供了位于 Microsoft 数据中心的自定义环境和服务器。

我们在 Azure 上存储的应用程序应该在 Windows Server 2008 R2 上工作,并且可以在.NET、PHP、C++、露比或 java 上开发。此外,Azure 为我们提供了一些数据库机制,如 NoSQL、Blob、消息队列和 NTFS 驱动器,用于读/写磁盘操作。

Windows Azure 的主要优势如下所示:

  • 它降低了应用程序的操作成本和资源调配
  • 快速响应客户需求变化
  • 可伸缩性

Azure 为我们提供了不同的服务付费方式,您可以按小时分数付费,也可以按年付费。Azure 的 SLA 与 Amazon 相同,包括每月 99.95%的运行时间保证;自定义也适用于模板。

Azure 云服务器目前位于北美(9)、南美(1)、欧洲(6)、亚洲(9)和澳大利亚(2)。

总之,亚马逊和 Azure 非常相似;它们之间的主要区别在于所使用的操作系统。如果您的应用程序是在.NET 上开发的或需要 Windows 服务器,Azure 是最佳选择。

货架空间

Rackspace 不是最大的公司之一(如亚马逊或微软),但它被认为是我们在谈论云服务时应该提到的一个。

当我们租用 Rackspace 时,我们为使用该服务付费,例如,当我们需要在特定时刻增加应用程序的容量时。Rackspace 服务器由他们管理,甚至可以只雇佣支持系统,让我们的服务器位于 Rackspace 之外。

Rackspace 为我们提供了不到一小时、一年甚至三年的付费选择。SLA 每月保证 99.90%的正常运行时间,定制工作使用模板,如 Amazon 和 Azure do。

服务器目前位于北美(3)、欧洲(1)、亚洲(1)和澳大利亚(1)。

总之,Rackspace 比 Amazon 或 Azure 便宜,而且它是一个非常好的解决方案,可以开始使用云计算。另外,它有一个非常好的分布式 DNS,他们是OpenStack的创建者,这是一个开源的堆栈,由不同的软件组件组成,用于通过虚拟化实现云服务器。这提供了一个新的仪表板、带有数据库的附加服务、服务器监控、块存储和虚拟网络的创建。

数字海洋

数码海洋是全球第二大托管公司。他们的计划是最便宜的,而 DigitalOcean 社区也非常好——他们为开发人员提供了论坛,并提供了大量关于管理服务器的教程。

可以选择按小时或按月付款。此外,SLA 保证 99.99%的正常运行时间,甚至比 Amazon 或 Azure 更好,而且定制工作使用模板,就像 Amazon、Azure 和 Rackspace 一样。

他们目前在北美有五台服务器,在欧洲有五台,在亚洲有一台。

DigitalOcean 对于专家来说是一个很好的解决方案,因为他们不管理服务器。服务器总是 Linux,因此这不是需要 Windows 的项目的解决方案。此外,使用 DigitalOcean 的一个优势是,如果您的项目不断增长,则可以轻松快速地扩展您的服务器。

乔伊斯

三星收购了Joyent。这种云有很大的潜力。它是为了与亚马逊 EC2 竞争而创建的,它拥有一些重要的客户,如 Twitter 和 LinkedIn。

Joyent 创建了 Node.js,他们拥有最好的容器技术;它从 Solaris 继承而来,并在他们自己的操作系统SmartOS(专为云设计的操作系统)上实现。如果你在寻找最好的性能,而不在乎价格,Joyent 是你最好的朋友。

您可以选择每小时、每年甚至每 3 年支付一次。此外,SLA 是 100%正常运行时间保证,30 分钟周期,最好的一个。定制工作使用模板,就像 Amazon、Azure、Rackspace 或 DigitalOcean 一样。

他们目前在北美有三台服务器,在欧洲有一台。

Rackspace 和 Joyent 有一个开源基础设施,因此可以在您自己的机器上下载和使用它。

谷歌计算引擎

Google Compute Engine是一个完整的产品,包括基础设施和服务,允许我们在与 Google works 相同的基础设施上使用 Linux 执行虚拟机

谷歌计算引擎仪表板再好不过了。它很干净,很容易导航。此外,它在部署和可伸缩性过程中速度非常快,云上包含的工具使 Google Compute Engine 成为分析和大数据的良好解决方案

对于 Google Compute Engine,SLA 保证 99.95%的正常运行时间,每月一次。它允许我们免费存储多达七个快照。

他们目前在北美有九台服务器,在欧洲有三台,在亚洲有六台。

将应用程序部署到云端

在整本书中,我们都在使用容器;我们已经告诉过你它们对你的项目有多大的好处。现在,是将应用程序部署到云的时候了。有不同的提供者,我们为您提供了一些关于如何为您的项目选择最佳提供者的提示。在本节中,我们将向您展示一些在生产中协调和管理容器的有趣选项。

码头工人群

书中我们一直在玩 Docker 和他们的Docker 引擎。通过 Docker 引擎,我们可以上下旋转应用程序中使用的容器。正如您所想象的,您可以在生产服务器中安装 Docker 引擎,并像我们的开发环境一样使用它,但是您认为这种方法是容错的吗?显然,答案是否定的。您可以尝试在不同的服务器中使用多个 Docker 引擎,但这将很难设置和维护。幸运的是,Docker 创造了 Docker Swarm;此软件为您提供本机群集功能,并将您的 Docker 引擎组转换为单个虚拟 Docker 引擎。这就像在开发机器中工作一样;Swarm 将为您处理所有困难的事情,您只需要处理您的应用程序。 

我们希望您对 Docker Swarm 有一个全面的了解,下面列出了该工具的主要功能:

  • 与 Docker tools兼容:Docker Swarm 使用并提供标准的 Docker API,因此任何已经使用 Docker API 的工具都可以使用 Docker Swarm 透明地扩展到多个主机。
  • 高可扩展性和性能:与所有 Docker 软件一样,Swarm 已准备好生产,经测试可扩展到一千(1000)个节点和五万(50000)个容器。这些测试的结果表明,您可以实现这些高部署数量,而不会降低节点群集中的性能。
  • 故障切换和高可用性:Docker Swarm 已准备好管理故障切换并为您提供高可用性。您可以创建多个 Swarm master,并在 master 失败时指定领导人选举策略。在编写本书时,有一个实验支持从失败节点重新调度容器。
  • 灵活的容器调度:Swarm 自带一个内置的调度程序,负责最大限度地提高基础设施的性能和资源利用率。
  • 可插拔调度器和节点发现:如果 Swarm 自带的内置调度器不符合您的需求,您可以插入外部调度器,如Apache MesosKubernetes。要满足应用程序的所有自动发现要求,您可以在 Swarm 中选择不同的可用方法:托管发现服务、静态文件、领事或 Zookeeper。

安装 Docker Swarm

Docker 1.12 及更高版本中的 Swarm 模式是现成的,因此安装起来非常简单。您只需要遵循我们在第 2 章开发环境中向您展示的步骤,但您需要在生产服务器上执行这些步骤,而不是在开发机器上执行这些步骤。我们建议在生产节点中使用 Linux/Unix,因此我们在这里描述的所有步骤都是针对 Linux/Unix 系统的。

我们将构建 Swarm 群集,因此,在您继续阅读之前,请确保您已准备好以下要求:

  • 至少有三台主机安装了 Docker Engine 1.12(或更高版本)
  • 其中一台机器将是 manager 机器,因此请确保您拥有主机的所有 IP 地址
  • 打开主机之间的端口
    • TCP 端口 2377:该端口用于我们的集群管理消息
    • TCP 和 UDP 端口 7946:这些端口用于我们节点之间的通信
    • TCP 和 UDP 端口 4789:这些端口用于覆盖网络流量

总之,我们的生产环境将由以下主机组成:

  • 管理节点:负责所有繁重的编排和调度工作。我们将把这台机器称为manager_01
  • 两个工人:这些是虚拟节点,我们将用来承载我们的容器。我们将这些主机称为worker_01worker_02

正如我们前面提到的,您需要知道不同 Docker 主机的 IP 地址,最重要的是 manager 机器的 IP 地址。工人将连接到此 IP 地址以了解他们需要做什么。例如,假设我们的 manager 主机具有192.168.99.100IP。

此时,您已准备好设置 Swarm 群集。首先,确保 Docker 引擎在所有节点中运行。检查引擎是否在主机上运行后,需要通过 SSH 或控制台进入manager_01节点。在manager_01节点中,运行以下命令启动 Swarm:

docker swarm init --advertise-addr 192.168.99.100

前面的命令将初始化 Swarm 并将当前节点建立为管理器。它还为您提供了向集群添加更多管理器或工人所需的命令。init命令的输出应与以下输出类似:

Swarm initialized: current node (b33ldnwlqda735xirme3rmq7t) is now a manager.

初始化 Swarm 后,您需要获得一个令牌,用于将其他机器加入集群。要获取此令牌,您只需随时运行以下命令:

docker swarm join-token worker

想象一下,您需要向 swarm 添加一个新的worker;在这种情况下,您只需要从前面的命令中获取令牌并运行以下命令:

docker swarm join \

--token SWMTKN-1-12m5gw74y2eo8llzj9oi2b2ij3z3fwwjg830svx3go5pig1stl-ev5x8obsajn4yhzy774lvhhfu \

192.168.99.100:2377

前面的命令将向 Swarm 添加一个worker,如果您需要向该集群添加另一个管理器,您可以运行docker swarm join-token manager并按照说明操作。

理论上,init 命令启动了 Swarm;如果要检查正确的群集初始化,只需执行以下命令:

docker info

前面的info命令将给您一些类似于下面的输出;请注意,我们删除了一些信息,以便将其放在书中:

Containers: 44
Running: 0
Paused: 0
Stopped: 44
Images: 171
Server Version: 1.12.5
Swarm: active
NodeID: b33ldnwlqda735xirme3rmq7t
Is Manager: true
ClusterID: 705ic3oomoadlhocvcluszfwz
Managers: 1
Nodes: 1
Orchestration:
Task History Retention Limit: 5
Node Address: 192.168.99.100

正如你所看到的,我们的蜂群是活跃的、准备就绪的;如果要获取有关节点的更多信息,只需执行以下命令:

docker node ls

前面的命令将为您提供与下面的命令类似的输出。

ID               HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS

b33ldnwlqda... *  moby   Ready   Active     Leader

此时,您有一个主机,它是您的管理器节点,但您没有任何工作人员可以在其中启动容器。让我们向集群添加一些工作节点。

使用 Swarm 将工作节点添加到我们的集群非常容易——您只需要通过 SSH 或控制台访问主机,并在 manager 节点上运行 Swarm init 的命令输出:

docker swarm join \

--token SWMTKN-1-12m5gw74y2eo8llzj9oi2b2ij3z3fwwjg830svx3go5pig1stl-ev5x8obsajn4yhzy774lvhhfu \

192.168.99.100:2377

如果一切正常,前面的命令将提供以下输出,指示当前节点已添加到集群:

This node joined a swarm as a worker.

假设您没有保存加入令牌;您可以从 manager 节点再次获取它。您只需登录 manager 节点并执行以下命令:

docker swarm join-token worker

前面的命令将为您提供再次在 workers 节点中运行所需的命令。

如您所见,将节点添加到集群非常容易;添加所有剩余的工人。要检查群集节点的状态,可以在 manager 节点中执行以下命令:

docker node ls

向我们的 Swarm 添加服务

此时,您将为部署准备好生产环境;让我们部署一些东西来测试新环境。我们将部署一个非常简单的映像,对google.com执行 ping 操作。一旦您对向 Swarm 部署服务感到满意,就可以尝试部署我们的示例应用程序。

在 manager 节点中打开连接或登录,然后运行以下命令:

docker service create --replicas 1 --name pingtest alpine ping google.com

前面的命令在集群中创建了一个新的服务,并使用--name标志为我们的服务分配了一个漂亮的名称,在本例中为pingtest--replicas参数表示我们希望服务的实例数;在我们的示例中,我们只指定了一个实例。通过alpine ping google.com,我们告诉 Swarm 我们要使用哪个图像(alpine,以及我们要在这个图像中执行的命令(ping google.com

如您所见,部署新的测试服务非常容易。如果您想查看集群中正在运行哪些服务,请登录 manager 节点并执行docker service ls,输出将与以下类似:

ID            NAME   REPLICAS  IMAGE   COMMAND
3ojsox6wioz4  pingtest  1/1    alpine  ping google.com

一旦您的服务在生产环境中运行,在某个时候您将需要了解有关该服务的更多信息。使用 Docker 非常简单,您只需在 manager 节点中执行以下命令:

docker service inspect --pretty pingtest

您的输出可以类似于以下输出:

ID:    3ojsox6wioz45d37xkcgn1xwv
Name:    pingtest
Mode:    Replicated
Replicas:    1
Placement:
UpdateConfig:
Parallelism:    1
On failure:    pause
ContainerSpec:
Image:    alpine
Args:    ping google.com
Resources:

如果希望以 JSON 形式返回输出,只需从命令中删除--pretty参数:

docker service inspect pingtest

上一个命令的输出与下一个命令的输出类似:

[
{
    "ID": "3ojsox6wioz45d37xkcgn1xwv",
    "Version": {
        "Index": 23
    },
    "CreatedAt": "2017-01-07T12:53:18.132921602Z",
    "UpdatedAt": "2017-01-07T12:53:18.132921602Z",
    "Spec": {
        "Name": "pingtest",
        "TaskTemplate": {
            "ContainerSpec": {
                "Image": "alpine",
                "Args": [
                    "ping",
                    "google.com"
                ]
            },
            "Resources": {
                "Limits": {},
                "Reservations": {}
            },
            "RestartPolicy": {
                "Condition": "any",
                "MaxAttempts": 0
            },
            "Placement": {}
        },
        "Mode": {
            "Replicated": {
                "Replicas": 1
            }
        },
        "UpdateConfig": {
            "Parallelism": 1,
            "FailureAction": "pause"
        },
        "EndpointSpec": {
            "Mode": "vip"
        }
    },
    "Endpoint": {
        "Spec": {}
    },
    "UpdateStatus": {
        "StartedAt": "0001-01-01T00:00:00Z",
        "CompletedAt": "0001-01-01T00:00:00Z"
    }
}
]

如您所见,JSON 格式包含更多信息;请随意使用更适合您的选项。如果您需要知道服务在哪里运行,您可以像往常一样在 manager 节点中执行docker service ps pingtest

在 Swarm 中扩展您的服务

我们向您展示了在 Swarm 集群中创建新服务是多么容易,现在是时候让您知道如何向上/向下扩展您的服务了。转到 manager 节点并运行以下命令:

docker service scale pingtest=10

前面的命令将创建(或销毁)所需数量的容器,以根据您的需要进行调整;就我们而言,我们需要 10 个集装箱用于pingtest服务。您可以使用docker service ps pingtest检查命令的正确执行情况,给出以下输出:

Scaling your services in Swarm

从前面的输出中,您可以检查服务是否在 10 个容器中运行,还可以检查它在哪个节点中运行。在我们的例子中,它们都在同一台主机上运行,因为我们只向集群添加了一个节点。

您现在知道如何创建 Swarm 集群,以及如何轻松启动新服务,现在是时候向您展示如何停止任何正在运行的服务了。

连接到 manager 节点并执行以下命令:

docker service rm pingtest

前面的命令将从 Swarm 集群中删除pingtest服务。与往常一样,您可以使用docker service inspect pingtest命令检查服务是否停止,或者使用通常的docker ps命令检查正在运行的容器。

在本章的这一点上,您将能够创建一个 Swarm 集群并启动任何服务;尝试一下,让我们的示例应用程序使用 Swarm。

正如您可以想象的那样,我们喜欢 Docker 使您的开发周期变得多么简单,部署可以多么简单,但是还有其他项目可以在您的生产环境中使用。让我们看看目前最常用的方法,以便您可以选择更适合您的项目的方法。

Apache Mesos 和 DC/OS

ApacheMesos 从机器中抽象出所有的计算资源,支持容错和弹性分布式系统。创建 ApacheMesos 分布式系统可能很复杂,因此 Mesosphere 创建了 DC/OS,一个构建在 ApacheMesos 之上的操作系统。多亏了 DC/OS,您可以拥有 Mesos 的所有功能,但它更易于安装或管理。

Apache Mesos(当然还有 DC/OS)中提供的一些功能如下:

  • 线性可扩展性:您可以毫无问题地扩展到 10000 台主机
  • 高可用性:Mesos 使用 Zookeeper 提供容错复制主机和代理
  • 容器支持:本机支持使用 Docker 和 AppC 映像启动容器
  • 可插拔隔离:对 CPU、内存、磁盘、端口、GPU、自定义隔离模块的隔离支持
  • API 和 Web UI:内置的 API 和 Web UI 让您可以轻松管理 Mesos 的任何方面
  • 跨平台:您可以在 Linux、OSX 甚至 Windows 中运行 Mesos

如您所见,ApacheMesos 和 DC/OS 是 Docker 或 Kubernetes 的有趣替代品。这些项目统一了隔离在所有节点之间的所有资源,并将它们转换为一个分布式系统。它给你的印象是你只管理一台机器。

库伯内特斯

Kubernetes 是用于自动化容器的部署、扩展和管理的主流开源系统之一。它由谷歌创建,拥有一个充满活力的社区。

这是一项完整的编排服务,在其所有功能中,我们可以重点介绍以下功能:

  • 自愈:这是一个有趣的功能,它可以在任何节点死亡时重新启动失败的容器,并替换和重新安排容器。它负责杀死不健康的容器,并避免未准备好的广告容器。
  • 服务发现和负载平衡:此功能允许您忘记创建和管理自己的发现服务;你可以用盒子里的东西。Kubernetes 还为每个容器提供自己的 IP 地址和一组容器的 DSN 名称。由于所有这些,您可以轻松地进行负载平衡。
  • 自动卷展和回滚:没有什么比卷展和回滚更重要的了。Kubernetes 可以为您管理这些操作;它将监视您的应用程序,以确保它在您进行卷展/回滚时继续平稳运行。
  • 水平缩放:您可以使用一个用户界面,甚至定义一些规则来自动地通过单个命令向上或向下缩放应用程序。
  • 自动装箱:Kubernetes 负责根据集装箱的资源需求和其他限制条件来放置集装箱。通过尝试最大化可用性来做出决策。

正如您所看到的,Kubernetes 提供了大型项目所需的大部分现成功能。因此,它是容器编排最常用的系统之一。我们建议您对此项目进行更多调查。你可以在官方网页上找到你需要的所有信息。如果你有一个在官方文档中找不到答案的具体问题,这个项目背后的大型社区可以帮助你。

部署至 Joyent Triton

早些时候,我们向您展示了如何构建 Swarm 集群。这是一种管理基础设施的有趣方式,但是如果您需要云的所有功能,但又不需要处理编排的不便,会发生什么呢?在下面的示例中,我们假设您没有预算或时间使用您选择的编排软件设置云服务器。

在本章的开头,我们讨论了主要的云提供商,其中包括 Joyent。该公司有一个名为Triton的托管解决方案;您可以使用此解决方案通过单击或 API 调用创建 VM 或容器。

如果你想使用他们的托管服务,你需要做的第一件事就是在他们的上创建一个帐户 https://www.joyent.com 页。一旦您的帐户准备就绪,您将拥有对其环境的完全访问权限。

帐户准备就绪后,向帐户添加 SSH 密钥。此密钥将用于根据容器和 Joyent 的 API 对您进行身份验证。如果没有要使用的 SSH 密钥,可以手动创建一个。创建 SSH 密钥非常容易,例如,在 Mac OS 中,您只需执行以下命令:

ssh-keygen -t rsa

此命令将询问您一些有关密钥存储位置或用于保护密钥的密码短语的问题。回答完所有问题后,密钥通常会存储在~/.ssh/id_rsa.pub文件中。您只需将此文件的内容复制到 Joyent 的帐户。如果您使用的是 Linux,那么创建 SSH 密钥的过程非常类似。

一旦你的帐户准备好了,你就可以开始创建容器了;您可以使用他们的 web UI 来完成,但在本例中,我们将向您展示如何从终端完成。

我们将 Docker 和 Joyent 与 Triton®声波风廓线仪中实现的 Docker API 一起使用,因此您将看到部署是多么容易。您需要做的第一件事是安装 Triton CLI 工具;这个应用程序是在 Node.js 上构建的,所以您需要 Node.js(https://nodejs.org )安装在您的开发机器上。拥有节点后,只需执行以下命令即可安装 Triton CLI:

sudo npm install -g triton

上述命令将 Triton®声波风廓线仪作为全局应用程序安装在您的机器上。一旦 Triton®声波风廓线仪在您的计算机上可用,您需要配置该工具;输入以下命令并回答所有问题:

triton profile create

此时,您的 Triton CLI 工具即可使用。现在,是时候配置 Docker 使用 Triton®声波风廓线仪了。打开终端并执行以下命令:

eval $(triton env)

上述命令将配置本地 Docker 以使用 Triton®声波风廓线仪。从现在起,您的所有 Docker 命令都将发送到 Triton®声波风廓线仪。让我们尝试部署我们的示例应用程序——转到docker-compose.yml文件的位置并执行下一个命令:

docker-compose up -d

前面的命令将像往常一样工作,但它不会使用我们的开发机器引擎,而是会加速我们在云中的容器。Triton®声波风廓线仪的一个优点是,它们为每个容器分配至少一个 IP 地址,因此,如果您需要获取特定容器的 IP 地址,您只需执行docker ps即可获得所有运行的容器(Triton®声波风廓线仪)及其名称。获得容器名称后,只需执行以下命令即可从 Triton CLI 获取 IP 地址:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name

前面的命令将为您提供所选容器的 IP 地址。获取 IP 的另一种方法是从 web UI。

提示

docker compose 停止将杀死部署到云的所有容器。

现在,您可以使用本书中学到的所有知识,部署到 Joyent Triton 云中,而不会遇到太多问题。这可能是目前市场上部署 Docker 容器的最简单方法。与 Joyent Triton 合作就像在当地工作一样。

请注意,这不是在生产中部署 Docker 的唯一选项;我们只展示了一种简单易行的方法。您可以尝试其他选项,例如 CoreOS 和中间层(DC/OS)等。

什么是 DevOps?

DevOps 是一套强调开发和运营(IT)之间协作和沟通的实践。主要目标是建立一种快速、频繁和更可靠的软件发布方式的文化。为了实现这一目标,DevOps 通常会尽可能地实现自动化。如果您的项目(或公司)在某个时候有所增长,您将实施一些 DevOps 原则以确保应用程序的未来。

在组织中采用这种文化的一些技术好处如下:

  • 旨在最大限度地利用持续集成持续交付
  • 降低了要修复的问题的复杂性
  • 减少故障的数量
  • 提供更快的问题解决方案

DevOps 的主要支柱是参与应用程序开发的所有部分之间的通信文化,特别是在开发和操作人员之间。无论你的应用程序有多好或多么惊人,组织内部缺乏沟通都会导致整个项目的关闭。

一旦您的组织在参与软件开发的所有部分之间建立了一个真正良好的沟通渠道,您就可以分析并落实 DevOps 文化的下一个支柱——自动化。要创建一个可靠的系统,您需要投资于重复的手动任务和流程的自动化;这就是持续集成和持续交付的关键所在。创建 CI/CD 管道将帮助您自动化重复性任务,如单元测试或部署,从而提高应用程序的总体质量。它甚至可以帮你在日常工作中节省一些时间。设想一下,将应用程序手动部署到生产环境中平均每次需要 8 分钟;如果您每天至少部署一次,那么仅进行部署一年就要浪费 30 多个小时。

DevOps 是关于您的应用程序以及开发和部署过程的,核心原则如下:

  • 敏捷软件开发
  • 连续积分
  • 连续输送管道
  • 自动化和连续测试
  • 主动监测
  • 改善沟通和协作

正如您所看到的,DevOps 文化不是您可以在组织中几个小时内实现的,它是一个漫长的过程,您需要分析组织中的开发过程是如何工作的,以及您需要进行哪些更改以找到更灵活和敏捷的方法。我们在本书中涵盖了大部分核心原则;现在由您来填补这些空白,并在您的组织中实施 DevOps 文化。

总结

在本章中,我们讨论了什么是云,以及选择托管提供商需要知道什么。我们还向您介绍了将应用程序编排到云中所需的不同选项。现在,轮到您分析并选择项目的最佳选项。