用于数据科学的 Docker

数据挖掘 数据
2021-09-20 14:28:09

我最近开始阅读有关 Docker 的文章。
对我来说,在数据科学中,Docker 很有用,因为:

1) 你有一个完全不同的环境,可以保护你免受库和依赖问题的影响。

2)如果您的应用程序修改,例如您公司的数据库,您首先要确保代码可以正常工作,并且不会对数据库造成不良后果。因此,您首先使用 Docker 来测试您的代码。

我的问题:

  • 如果我说只有第二个原因是关于沙拳,我说得对吗?第一个原因和沙拳无关吧?

  • Docker 在数据科学中有用还有其他原因吗?

  • 我没有找到很多关于 Docker 用于数据科学的有趣研究论文。你知道一些有名的吗?

4个回答

与其关注技术术语,不如提供笼统的答案并使用术语“容器”。

容器只运行它应该运行的东西,假设任何未知的东西都是不可信的,所以只在容器的生命周期内驻留在容器中,因此修改数据库中的代码以进行测试将在 VM(沙盒)或容器(docker)中使用相同的方法最大的区别是资源消耗和配置 VM 的时间与在几秒钟内为应用程序启动容器/pod 的时间。

更多细节:

Part1_从应用角度

从以下几点来看,容器在数据科学领域非常重要:

  • 最大限度地减少不同开发项目的库版本冲突(每个项目都有自己的容器/pod 来运行)。
  • 针对特定设计标准的跨环境和开发人员的一致性。
  • 按需边缘节点的快速原型设计。

  • 避免在刷新或失败后在新硬件上重新安装所有内容。

  • 您的计算环境的可移植性,在您的机器上开发,如果您需要更多资源,如 CPU、RAM 或 GPU,您可以将您的环境移植到云、强大的集群、强大的机器、可以与Kubernetes或称为Swarm的 Dockerized 集群协调的容器组.
  • 最大限度地提高跨组的协作清晰度。一致的库、结果集等
  • 将本地自治/敏捷性扩展到云规模和范围。
  • 由 Docker 容器支持的项目工作区,用于控制环境配置。您可以直接从内置终端安装新软件包或运行命令行脚本。
  • 与虚拟机或裸机相比,容器使用的资源非常少……您可以在虚拟机或裸机中运行多个容器,因此这将大大降低操作系统的许可成本,项目/应用程序将根据所需资源而不是全部资源进行扩展主机的(这里要注意:使用容器时,您将在一台机器上运行多个应用程序/模型,而没有容器的情况下,您将为 1 个应用程序/模型使用完整的机器资源,这是资源的浪费。在集群环境中,您可以启动多个 pod/容器(集群中的应用程序/模型,与您为每个主机的操作系统支付的虚拟机相比,pod 的成本为零,并且您运行该任务的所有资源)。
  • 易于安装新软件包并与所有人共享新映像,而不是将虚拟环境处理到 VM 中并存在软件包冲突等等(希望看到虚拟环境从传统方法转移到容器,这将是一个很好的改进,并且对数据科学家有很大帮助,可以在所有冲突中单独绕过每个项目的配置并激活/停用,然后在投入生产时搜索需求,而容器只需要一个配置文件,这是我的观点我每天在数据科学界看到的东西)。
  • 独立于基础架构的平台允许数据科学家在针对应用程序优化的基础架构上运行分析应用程序
  • 使数据科学家能够使用最适合研究的工具和软件包构建模型,而无需担心应用程序和环境冲突。
  • 最重要的研究可重复性:容器提供的 SCALE,您可以使用容器轻松扩展,并且在所有环境中都是相同的,并且您不关心主机操作系统,确保使用不可变容器进行分析和研究的可重复性并消除不同环境的问题
  • 安全协作:平台和生命周期中的集成安全性允许协作而没有篡改和数据完整性的风险(第 2 部分和第 3 部分中的更多详细信息。

Cloudera 与 Cloudera Data Science Workbench 和 Anaconda 与Anaconda Enterprise都使用容器,因此可以为业务带来快速结果,并轻松部署从开发到 QA 并最终到生产的模型。

为什么最后的陈述很重要?是具有从开发到产品的可移植性,而无需对环境进行任何更改,也无需花费 DevOps 部分来进行操作。

Part2_从安全角度

一个臭名昭著的安全优势是主机操作系统的安全性与容器是分开的,这意味着补丁是分开的,修补主机操作系统不会影响您的容器化应用程序(我们在修补操作系统时遇到了多少次问题并且确实会影响该操作系统中的应用程序和服务(路径、端口、服务等)?

  • 例如:如果您library的应用程序/代码中存在恶意软件,而该恶意软件在容器运行期间仅驻留在该容器上,则容器始终作为端点运行,并且没有发现会传播恶意软件的案例进入网络。
  • 监控容器节点是健壮的,您可以放置​​插件或服务来监控应用程序或节点的行为,并且只会复制新的节点/容器,并且仅基于配置文件。

比较虚拟机与容器:容器是另一回事,您需要将操作系统与容器分开(当安全到位时,容器是单独的任务)。

Docker 安全确实提供了主要安全点的详细信息。

Docker 标准和合规性提供了可用于容器的安全合规性和标准的完整列表。

“具有精心设计的 seccomp 配置文件(阻止意外系统调用)的 Docker 容器为管理程序提供了大致等效的安全性。”

文件夹共享使用容器,您可以通过设置共享挂载来共享文件夹,并且由于 Docker/内核强制执行容器使用的文件权限,来宾系统无法绕过该限制。这对于数据科学应用程序和用户来说非常重要,因为在企业中使用的大部分时间敏感/受限数据和多层安全或限制已经到位,解决此安全问题的一种方法是使用具有 AD 组的 VDI 或 VM限制/共享数据访问,并且维护和分配资源确实存在问题且成本高昂。

当调试应用程序或操作系统并生成所有服务和日志时,我认为容器正在获胜并正在演变为 NLP 方法:还包括一个实验性自然语言处理 (NLP) 实用程序,用于校对安全叙述。

这里我引用谷歌的郭佳宁:经过适当保护和更新的 VM 提供了适用于常规应用程序和容器工作负载的进程级别隔离,并且客户可以使用 Linux 安全模块来进一步限制容器的攻击面。例如,开源生产级容器编排系统 Kubernetes 支持与 AppArmor、Seccomp 和 SELinux 的原生集成,以对暴露给容器的系统调用施加限制。Kubernetes 还提供了额外的工具来进一步支持容器隔离。PodSecurityPolicy 允许客户在节点级别对工作负载可以执行或访问的内容施加限制。对于需要 VM 级别隔离的特别敏感的工作负载,

最重要的是,kubernetes集群具有以下额外的安全特性:

  1. 对所有 API 流量使用传输层安全性 (TLS)
  2. API 认证
  3. API授权
  4. 与虚拟机或专用裸机相比,易于修复安全漏洞并将对应用程序/环境的影响降至最低。

Part3_ CIS加固容器的基准测试:Docker & Kubernetes.

  1. 使容器更安全的第一步是准备好用于执行包含负载的工作负载的主机。通过保护容器主机并遵循基础设施安全最佳实践,将为执行容器化工作负载奠定坚实和安全的基础。

  2. 及时了解 Docker 更新和软件中的漏洞。

  3. 为 Docker 相关文件有一个特定的专用目录,并分配足够的空间来查看容器运行(默认路径是/var/lib/docker更改为其他挂载点并在操作系统级别使用auditdaide services任何更改或大小/不需要的工作负载运行进行监控,保留日志并根据需要进行配置。

注意:最好的部分step 2是使用虚拟机,您需要监控数据科学项目的更多位置(不同位置的库,多个版本的包,甚至 python 的位置/路径,运行cron jobs or systemd以确保某些进程确实运行,记录所有日志等,但使用容器是所有这些作业运行的单点,并且只监视一个路径而不是多个路径)。

  1. 始终验证用户进入docker组以防止unauthorized elevated access进入系统(Docker 允许 Docker 主机和来宾容器之间共享目录而不限制容器的访问权限)因此从docker组中删除任何不受信任的用户并且不要创建将主机映射到容器卷的敏感目录映射。在这里,我会说使用单独的用户进行安装和特定的容器任务“永远不要使用root容器运行专用PID于这个任务(将具有提升的访问权限,但将基于任务,我对集群使用引力,安装时我从不使用根)。

  2. 审核所有 Docker 守护程序活动(请注意,容器化“世界”中的日志确实会占用空间,因此请准备具有适当空间的单独分区来保存日志和所需的配置(轮换和存储日志的周期)。

  3. 审核所有 Docker 文件和 docker.service 等,var 以及其他适用的内容。

  4. 限制所有容器间通信,将需要通信的特定容器链接在一起(最好是创建一个自定义网络并仅加入需要与该自定义网络通信的容器)。这种强化方法将防止意外和不需要的信息泄露给其他容器。

  5. 容器化基础设施中的所有应用程序都应该配置或至少可以选择Encryp All Sensitive Information(这对数据科学家来说非常重要,因为大多数时候我们登录平台来获取数据,包括sensitive data公司。

  6. 可以选择在传输过程中加密所有敏感信息。

  7. 仅使用经过批准Ports, Protocols and Services的特定虚拟机,在运行应用程序/项目时具有更开放的表面,容器您只指定将使用的内容,而不想知道在操作系统级别运行的所有其他端口侦听、协议和服务以保护或监视器,这确实将"attack surface".

  8. 存储在系统上的敏感信息是静态加密的,并且确实需要辅助身份验证机制,而不是集成到操作系统中,以便访问信息。

  9. 是否允许启用Operating System Anti-Exploitation Features/Deploy Anti-Exploit Technologies:例如Data Execution Prevention(DEP)Address Space Layout Randomization (ASLR)

  10. 虚拟机和容器之间最简单的安全区别是:更新或运行项目时,您不需要提升访问权限即可在整个虚拟机或网络上执行此操作,您只需以定义的用户身份运行,如果提升访问权限则确实存在容器的时间,而不是在主机之间共享(这里确实有数据科学库安装、更新、执行项目代码等)。

第 4 部分_与数据科学容器相关的更多资源(在第 1-3 部分中包含的链接之上):

  1. docker 上的数据科学
  2. Conda、Docker 和 Kubernetes:数据科学的云原生未来(由 Anaconda 赞助)
  3. https://devblogs.nvidia.com/making-data-science-teams-productive-kubernetes-rapids/
  4. 为什么数据科学家喜欢 Kubernetes
  5. 一本了解 Docker 用于数据科学的好书:Docker for Data Science: Building Scalable and Extensible Data Infrastructure Around the Jupyter Notebook Server

使用Docker Swarm Mode,您可以建立自己的低成本机器安全集群。

  • 因此,如果您喜欢大型数据集的分布式处理,Docker Swarm(或者容器管理工具 Kubernetes)可以作为在许多容器(和/或主机)上部署Apache Spark(或类似软件)以进行并行处理的基础。

  • 如果您对数据流进行实时分析,您可以根据当前需求相对轻松地扩展集群,而无需从虚拟化技术供应商处购买大量昂贵的网络设备或昂贵的管理软件。

(除了 MOOCs 中的玩具示例,我个人没有这样做。但是,这是2019 年 4 月关于 Docker Swarm 上的 Spark 的一篇博文,由其他人撰写。 - 请注意,Swarm 模式曾经仅适用于 Docker 企业版,而不是免费的社区版。现在文档不再这么说,但我不确定)

这两个原因都与虚拟环境和将开发和运营活动集成在一起的 devops 文化有关。我宁愿使用术语“测试环境”而不是沙盒来描述这个功能。

Docker 是一个有用的数据科学工具。其他原因可能包括促进不同方之间的协作,因为每个人都使用相同的图像(您对依赖项和库问题的观点),并且它有助于与独立于他们使用的操作系统的任何人共享和管理您的应用程序/代码/工作流。基本上,共享代码、与第三方的管理以及用户对库依赖项的请求等都是有帮助的。

我不知道有趣的研究论文,但我认为这个问题有点类似于询问关于 Python 或 R 的有趣研究论文。

Docker是一种计算机程序员的解决方案,它使安装过程更容易。它的基本前提是,虽然它可以在这台机器上运行,但它也应该适用于那些机器。在其他用户的系统中,正在使用与您的系统相同的要求和库版本。Docker 使用(可重用)层。用户无需在本地运行 apt-get install、pip install 和其他任务,而是将它们写入每个项目的每个 Dockerfile。学习斜率很小(最多两天的努力),但收益很大。

Docker是每个计算机科学家(现在是数据科学家和分析人员)都会在他们的工具箱中拥有的一项技术。知道 Docker 现在变得多么简单和直观,没有理由不将它纳入您的软件开发生命周期。