在云中为云开发:在 AWS 中使用 Docker 进行大数据开发

已发表: 2022-03-11

为什么你可能需要它?

我是一名开发人员,每天都在集成开发环境 (IDE) 中工作,例如 Intellij IDEA 或 Eclipse。 这些 IDE 是桌面应用程序。 自从 Google Documents 出现以来,我看到越来越多的人使用相当于文字处理器或电子表格应用程序的在线版本将他们的工作从桌面版本的 Word 或 Excel 转移到云端。

使用云来保存您的工作有明显的原因。 如今,与传统的桌面业务应用程序相比,一些 Web 应用程序在功能上并没有明显的劣势。 只要有网络浏览器,内容就可以使用,而如今,几乎无处不在。 协作和共享更容易,丢失文件的可能性更小。

不幸的是,这些云优势在软件开发领域并不像商业应用程序那样普遍。 有一些尝试提供在线 IDE,但它们与传统 IDE 相去甚远。

这是一个悖论; 虽然我们仍然绑定到我们的桌面进行日常编码,但该软件现在已在多台服务器上生成。 开发人员需要处理他们无法在计算机上保存的东西。 事实上,笔记本电脑不再增加其处理能力。 在笔记本电脑上拥有超过 16GB 的 RAM 是罕见且昂贵的,而更新的设备,例如平板电脑,甚至更少。

但是,即使目前还无法替代经典的桌面应用程序进行软件开发,也可以将您的整个开发桌面迁移到云端。 在我意识到不再需要将所有软件都放在笔记本电脑上的那一天,并注意到网络版终端和 VNC 的可用性,我将所有东西都移到了云端。 最终,我开发了一个构建工具包,用于以自动化方式创建该环境。

云中的开发者

对于开发人员来说,云是什么? 当然是在其中发展!
鸣叫

在本文中,我介绍了一组脚本,用于为 Scala 和大数据应用程序构建基于云的开发环境,在 Amazon AWS 中使用 Docker 运行,并包含一个可访问 Web 的桌面,并以 IntelliJ IDE、Spark、Hadoop 和 Zeppelin 作为服务,以及命令行工具,例如基于 Web 的 SSH、SBT 和 Ammonite。 该工具包在 GitHub 上免费提供,我在这里描述了使用它来构建您的实例的过程。 您可以构建您的环境并根据您的特定需求对其进行自定义。 启动并运行它不应该花费您超过 10 分钟的时间。

“BigDataDevKit”中有什么?

我开发该工具包的主要目标是我的开发环境应该是我可以简单启动的东西,包含我使用的所有服务和服务器,然后在不再需要它们时销毁它们。 当您处理不同的项目时,这一点尤其重要,其中一些涉及大量服务器和服务,就像您处理大数据项目时一样。

我理想的基于云的环境应该:

  • 包括所有常用的开发工具,最重要的是图形 IDE。
  • 让我需要的服务器和服务触手可及。
  • 从头开始轻松快速地创建,并且可以扩展以添加更多服务。
  • 仅使用 Web 浏览器即可完全访问。
  • (可选)允许使用专用客户端(VNC 客户端和 SSH 客户端)进行访问。

利用现代云基础设施和软件、现代浏览器的强大功能、宽带的广泛可用性以及无价的 Docker,我为 Scala 和大数据开发创建了一个开发环境,更好地取代了我的开发笔记本电脑。

目前,我可以随时使用 MacBook Pro、Surface 平板电脑甚至 iPad(带键盘)工作,尽管不可否认,最后一个选项并不理想。 所有这些设备都只是客户端; 桌面和所有服务器都在云中。

Docker 和亚马逊 AWS!

我当前的环境是使用以下在线服务构建的:

  • 用于服务器的 Amazon Web Services。
  • GitHub 用于存储代码。
  • Dropbox 来保存文件。

我还使用了一些免费服务,例如动态 IP 地址的 DuckDns 和 Let's encrypt 以获得免费的 SSL 证书。

在这种环境下,我目前有:

  • 带有 Intellij idea 的图形桌面,可通过 Web 浏览器访问。
  • Web 可访问的命令行工具,例如 SBT 和 Ammonite。
  • Hadoop 用于存储文件和运行 MapReduce 作业。
  • 用于计划作业的 Spark 作业服务器。
  • Zeppelin 用于基于 Web 的笔记本。

最重要的是,对于基于 Web 的 VNC 和 SSH,Web 访问使用 HTTPS 完全加密,并且有多种保护措施可以避免丢失数据,当然,当您不“拥有”网站上的内容时,这一点很重要你的物理硬盘。 请注意,在您的计算机上获取所有工作的副本是自动的,而且速度非常快。 如果您因为有人窃取了您的密码而丢失了所有内容,那么只要您正确配置了所有内容,您的计算机上仍然有一份副本。

将基于 Web 的开发环境与 AWS 和 Docker 结合使用

现在,让我们开始描述环境是如何工作的。 当我早上开始工作时,第一件事是登录 Amazon Web Services 控制台,在那里我可以看到我的所有实例。 通常,我为不同的项目配置了许多开发实例,并关闭未使用的实例以节省费用。 毕竟,我一次只能做一个项目。 (嗯,有时我会做两个。)

屏幕一

所以,我选择我想要的实例,启动它,我稍等片刻或者去喝杯咖啡。 与打开计算机没有太大区别。 启动并运行实例通常需要几秒钟。 看到绿色图标后,我打开浏览器,然后转到一个众所周知的 URL: https://msciab.duckdns.org/vnc.html ://msciab.duckdns.org/vnc.html。 注意,这是我的网址; 创建套件时,您将创建唯一的 URL。

由于 AWS 在您启动时为每台机器分配一个新 IP,因此我配置了动态 DNS 服务,因此您始终可以使用相同的 URL 访问您的服务器,即使您停止并重新启动它。 您甚至可以在浏览器中添加书签。 此外,我使用带有有效密钥的 HTTPS 来全面保护我的工作免受嗅探器的攻击,以防我需要管理密码和其他敏感数据。

屏幕 2

加载后,系统将使用 Web VNC Web 客户端 NoVNC 来欢迎您。 只需登录,就会出现一个桌面。 我故意使用最小的桌面,只是一个带有应用程序的菜单,而我唯一的奢侈品是虚拟桌面(因为我在开发时打开了很多窗口)。 对于邮件,我仍然依赖其他应用程序,现在主要是其他浏览器选项卡。

在虚拟机中,我拥有开发大数据应用程序所需的一切。 首先,有一个 IDE。 在构建中,我使用 IntelliJ Idea 社区版。 此外,还有 SBT 构建工具和 Scala REPL,Ammonite。

屏幕 3

但是,此环境的主要功能是将服务部署为同一虚拟机中的容器。 特别是,我有:

  • Zeppelin,用于动态使用 Scala 代码并进行数据分析的网络笔记本 ( http://zeppelin:8080 )
  • Spark 作业服务器,用于使用 Rest 接口 ( http://sparkjobserver:8080 ) 执行和部署 Spark 作业。
  • 一个 Hadoop 实例,用于从 HDFS ( http://hadoop:50070 ) 存储和检索数据。

请注意,这些 URL 是固定的,但可以在虚拟环境中访问。 您可以在以下屏幕截图中看到他们的 Web 界面。

屏幕 4

每个服务都在一个单独的 Docker 容器中运行。 无需太技术化,您可以将其视为虚拟机内的三个独立服务器。 使用 Docker 的美妙之处在于您可以添加服务,甚至可以添加两三个虚拟机。 使用 Amazon 容器,您可以轻松扩展您的环境。

最后但同样重要的是,您有一个可用的网络终端。 只需使用 HTTPS 访问您的 URL,您就会受到网页中终端的欢迎。

屏幕 5

在上面的屏幕截图中,您可以看到我列出了容器,即三台服务器加上桌面。 此命令行 shell 使您可以访问包含容器的虚拟机,从而允许您管理它们。 就好像您的服务器在“矩阵中”(在容器中虚拟化),但是这个 shell 让您可以在“矩阵”之外管理服务器和桌面。 从这里,您可以重新启动容器、访问它们的文件系统并执行 Docker 允许的其他操作。 我不会在这里详细讨论 Docker,但是 Docker 网站上有大量的文档。

如何设置您的实例

到目前为止你喜欢这个,并且你想要你的实例吗? 它既简单又便宜。 您只需支付 Amazon Web Services 上虚拟机的成本以及存储空间即可获得它。 当前配置中的套件需要 4GB 的 RAM 才能运行所有服务。 如果您只在需要时才小心使用虚拟机,并且您每月工作 160 小时,那么按当前费率计算的虚拟机将花费 160 x 0.052 美元,即每月 8 美元。 您必须增加存储成本。 我使用大约 30GB,但所有东西都可以保持在 10 美元以下。

但是,如果您要备份超过 2GB 的代码,这确实包括(最终)Dropbox(Pro)帐户的成本。 这每月花费 15 美元,但它为您的数据提供了重要的安全性。 此外,您将需要一个私有存储库,可以是付费的 GitHub 或其他服务,例如提供免费私有存储库的 Bitbucket。

我想强调的是,如果你只在需要时使用它,它比专用服务器便宜。 是的,这里提到的所有东西都可以在物理服务器上设置,但由于我使用大数据,我需要很多其他 AWS 服务,所以我认为将所有东西放在同一个地方是合乎逻辑的。

让我们看看如何进行整个设置。

先决条件

在开始构建虚拟机之前,您需要注册以下四个服务:

  • 亚马逊网络服务。
  • 鸭DNS。
  • 保管箱。
  • 让我们加密。

您唯一需要信用卡的是亚马逊网络服务。 DuckDns 完全免费,而 DropBox 为您提供 2GB 的免费存储空间,足以完成许多任务。 Let's Encrypt 也是免费的,它在您构建映像以签署证书时在内部使用。 除了这些,我还推荐一个存储库托管服务,如 GitHub 或 Bitbucket,如果你想存储你的代码,但是,它不是设置所必需的。

首先,导航到 GitHub BigDataDevKit 存储库。

屏幕 6

滚动页面并在您选择的文本编辑器中复制图像中显示的脚本:

屏幕 7

需要此脚本来引导映像。 您必须更改它并为参数提供一些值。 小心地更改引号内的文本。 请注意,您不能在密码中使用引号本身、反斜杠或美元符号等字符,除非您引用它们。 此问题仅与密码有关。 如果您想安全起见,请避免使用引号、美元符号或反斜杠。

PASSWORD参数是您选择通过 Web 界面访问虚拟机的密码。 EMAIL参数是您的电子邮件,将在您注册 SSL 证书时使用。 您将需要提供您的电子邮件,这是从 Let's Encrypt 获得免费 SSL 证书的唯一要求。

要获取TOKENHOST的值,请转到 DuckDNS 站点并登录。您需要选择一个未使用的主机名。

屏幕 8

查看图像以查看必须在何处复制令牌以及必须在何处添加主机名。 您必须单击“添加域”按钮来保留主机名。

配置您的实例

假设您拥有所有参数并编辑了脚本,您就可以启动您的实例了。 登录 Amazon Web Services 管理界面,进入 EC2 Instances 面板,点击“Launch Instance”。

屏幕 9

在第一个屏幕中,您将选择一个图像。 该脚本围绕 Amazon Linux 构建,没有其他可用选项。 选择 Amazon Linux,这是 QuickStart 列表中的第一个选项。

屏幕 10

在第二个屏幕上,选择实例类型。 考虑到运行软件的大小,有多个服务,你至少需要 4GB 内存,所以我建议你选择t2.medium实例。 如果您关闭某些服务,您可以使用t2.small来修剪它,如果您只想要桌面,甚至可以使用micro

屏幕 11

在第三个屏幕上,单击“高级详细信息”并粘贴您在上一步中配置的脚本。 我还建议您启用终止保护,以便在意外终止时您不会丢失所有工作。

屏幕 12

下一步是配置存储。 实例的默认值为 8GB,这不足以包含我们将构建的所有映像。 我建议将其增加到 20GB。 此外,虽然不需要,但我建议使用另一个至少 10GB 的块设备。 该脚本会将第二个块设备作为数据文件夹挂载。您可以对其内容进行快照,终止实例,然后使用快照重新创建它并恢复所有工作。 此外,当您终止实例时,自定义块储存设备不会丢失,因此具有双重保护,可防止数据意外丢失。 为了进一步提高您的安全性,您可以使用 Dropbox 自动备份您的数据。

屏幕 13

第五步是命名实例。 选择你自己的。 第六步提供了一种配置防火墙的方法。 默认情况下只有 SSH 可用,但我们也需要 HTTPS,所以不要忘记添加打开 HTTPS 的规则。 您可以向全世界开放 HTTPS,但最好只向您的 IP 开放,以防止其他人访问您的桌面和外壳,即使仍然受密码保护。

完成最后一个配置后,您可以启动实例。 您会注意到,自初始化脚本运行以来,第一次初始化可能需要几分钟时间,并且它还会执行一些冗长的任务,例如使用 Let's Encrypt 生成 HTTPS 证书。

屏幕 14

当您最终看到管理控制台“正在运行”并确认并不再“初始化”时,您就可以开始了。

假设所有参数都正确,您可以导航到https://YOURHOST.duckdns.org

YOURHOST替换为您选择的主机名,但不要忘记它是 HTTPS 站点,而不是 HTTP,因此您与服务器的连接是加密的,因此您必须在 URL 中写入https// 。 该站点还将提供 Let's Encrypt 的有效证书。 如果获取证书有问题,初始化脚本会生成一个自签名证书。 您仍然可以使用加密连接进行连接,但浏览器会警告您这是一个未知站点,并且连接不安全。 它不应该发生,但你永远不知道。

屏幕 15

假设一切正常,然后您访问 Web 终端 Butterfly。 您可以使用用户app和您在设置脚本中输入的密码登录。

登录后,您将拥有一个引导式虚拟机,其中还包括 Docker 和其他好东西,例如 Nginx 前端、Git 和蝴蝶 Web 终端。 现在,您可以通过为您的开发环境构建 Docker 映像来完成设置。

接下来,键入以下命令:

 git clone https://github.com/sciabarra/BigDataDevKit cd BigDataDevKit sh build.sh

最后一个命令还会要求您输入桌面访问密码。 完成后,它将开始构建图像。 请注意,构建大约需要 10 分钟,但您可以看到正在发生的事情,因为所有内容都显示在屏幕上。

构建完成后,您还可以使用以下命令安装 Dropbox:

 /app/.dropbox-dist/dropboxd

系统将显示一个您必须单击才能启用 Dropbox 的链接。 您需要登录 Dropbox,然后您就完成了。 您放入 Dropbox 文件夹中的任何内容都会在您的所有 Dropbox 实例之间自动同步。

完成后,您可以重新启动虚拟机,并通过https://YOURHOST.dyndns.org/vnc.html URL 访问您的环境。

您可以在恢复工作时停止机器并重新启动它。 访问 URL 保持不变。 这样,您只需为使用它的时间付费,外加已用存储的每月额外费用。

保存您的数据

以下讨论需要了解 Docker 和 Amazon 的工作原理。 如果您不想了解细节,请记住以下简单规则:在虚拟机中,有一个可用的/app/Dropbox文件夹,您放置在/app/Dropbox中的任何内容都会被保留,其他所有内容都是一次性的,并且可以走开。 为了进一步提高安全性,还将您宝贵的代码存储在版本控制系统中。

现在,如果您确实想了解这一点,请继续阅读。 如果您在创建虚拟机时按照我的指示进行操作,则可以保护虚拟机免于终止,因此您不会意外破坏它。 如果您明确决定终止它,主卷将被销毁。 所有 Docker 镜像都将丢失,包括您所做的所有更改。

但是,由于文件夹/app/Dropbox被挂载为容器的 Docker 卷,因此它不是 Docker 映像的一部分。 在虚拟机中,文件夹/app挂载在您创建的 Amazon 卷中,即使您明确终止虚拟机,该卷也不会被破坏。 要删除该卷,您必须明确删除它。

不要将作为 Docker 逻辑实体的 Docker 卷与作为某种物理实体的 Amazon 卷混淆。 发生的情况是/app/Dropbox Docker 卷放置在/app Amazon 卷中。

当您终止虚拟机时,Amazon 卷不会自动销毁,因此放置在其中的任何内容都将被保留,直到您也明确销毁该卷。 此外,您放入 Docker 卷中的任何内容都存储在容器之外,因此在容器被销毁时它不会被销毁。 如果您按照建议启用了 Dropbox,则您的所有内容都会复制到 Dropbox 服务器,如果您将 Dropbox 与您的计算机同步,则会复制到您的硬盘。 此外,建议将源代码存储在版本控制系统中。

所以,如果你把你的东西放在 Dropbox 文件夹下的版本控制系统中,丢失你的数据所有这一切都必须发生:

  • 您明确终止您的虚拟机。
  • 您明确从虚拟机中删除数据卷。
  • 您明确从 Dropbox 中删除数据,包括历史记录。
  • 您明确从版本控制系统中删除数据。

我希望您的数据足够安全。

我为每个项目保留一个虚拟机,当我完成时,我会关闭未使用的虚拟机。 当然,我所有的代码都在 GitHub 上,并在 Dropbox 中备份。 此外,当我停止一个项目时,我会在完全删除虚拟机之前拍摄 Amazon Web Services 块的快照。 这样,每当项目恢复时,例如为了维护,我需要做的就是使用快照启动一个新的虚拟机。 我所有的数据都恢复原状,我可以继续工作。

优化访问

首先,如果您可以直接访问 Internet,而不是通过代理进行中介,则可以使用本机 SSH 和 VNC 客户端。 如果您需要将文件复制进和复制出虚拟机,则直接 SSH 访问非常重要。 但是,对于文件共享,您应该将 Dropbox 视为更简单的替代方案。

VNC Web 访问非常宝贵,但有时它可能比本地客户端慢。 您可以使用端口 5900 访问虚拟机上的 VNC 服务器。您必须明确打开它,因为默认情况下它是关闭的。 我建议你只对你的 IP 地址打开它,因为互联网上到处都是“机器人”,它们会扫描互联网寻找要连接的服务,而 VNC 是这些机器人的常见目标。

结论

本文介绍了如何利用现代云技术来实现有效的开发环境。 虽然云中的机器不能完全替代您的工作计算机或笔记本电脑,但当访问 IDE 很重要时,它足以进行开发工作。 根据我的经验,使用当前的互联网连接,它的速度足够快。

在云中,服务器访问和操作比在本地拥有它们更快。 您可以快速增加(或减少)内存、启动另一个环境、创建图像等等。 您拥有触手可及的数据中心,当您处理大数据项目时,您需要强大的服务和大量空间。 这就是云提供的。