![Docker 的替代方案,对维护包依赖关系的限制较少](https://linux22.com/image/1168010/Docker%20%E7%9A%84%E6%9B%BF%E4%BB%A3%E6%96%B9%E6%A1%88%EF%BC%8C%E5%AF%B9%E7%BB%B4%E6%8A%A4%E5%8C%85%E4%BE%9D%E8%B5%96%E5%85%B3%E7%B3%BB%E7%9A%84%E9%99%90%E5%88%B6%E8%BE%83%E5%B0%91.png)
我从事使用 Xenial 运行的 ROS 机器人技术研究,但这适用于在 Ubuntu 上运行的任何应用程序。对于一个工程师团队来说,很难让每个人的测试站的软件包版本保持一致。不久前,我们的一个测试平台完全中断,因为新的更新/升级改变了软件包的大部分功能。
我想避免这种情况并找到一个可以让我轻松复制这些测试平台的解决方案。
我意识到 Docker 是解决此问题的流行方案,但容器解决方案对我的需求来说有点太严格了。我不介意重新安装驱动程序等,但我发现在运行原始测试平台时处理 Docker 特定问题很麻烦(尤其是因为它需要多容器)。
是否有可用的解决方案可以满足我的需求而不需要像 Docker 这样的容器?
愚蠢的方法就是克隆我的整个测试平台...也许这对我来说仍然是最好的?
答案1
正如我在评论中所建议的那样,如果您正在寻找一种简单的方法让每个人都拥有相同的环境并轻松恢复到预定义状态,我建议进行虚拟化。
完整的“操作方法”可能会超出此处答案的范围,因此这里有一些提示和链接:
虚拟机
我建议使用逻辑卷管理器,提供快照、恢复和调整大小功能
或者如果你更喜欢文件:qcow2,因为它还提供快照和(一些)调整大小功能
西恩
另一个替代方案是 XEN。
有一些内置工具可用于使用 debootstrap,因此您可以在每次需要时为同事创建一个新的更新的 VM。您还可以在此处使用 LVM 或文件后端 (qcow2)。
XEN 还提供PVM/半虚拟化客人,这可以显著提高性能。
具体来说,我建议准备一个主映像/VM,然后克隆它,以便每个团队成员都有他/她的VM。
使用 LVM,您可以创建原始状态的快照并轻松恢复到该状态--merge
(按需或定期使用 cronjob)。
或者,您可以使用文件后端(可能影响 I/O)并仅使用主映像文件复制各个虚拟机。
我会收集每个开发人员需要的真实数据NFS并向团队明确表示,只有已安装的数据才会被保存。
答案2
我认为你最好的选择是https://www.vagrantup.com/(他们的座右铭是“让开发环境变得简单”)
以下段落是从他们的网站复制而来的(经过了一些编辑):
它是用来做什么的? Vagrant 是一款通过单一工作流程构建和管理虚拟机环境的工具。凭借易于使用的工作流程和对自动化的关注,Vagrant 缩短了开发环境的设置时间,提高了生产效率,并使“在我的计算机上运行”的借口成为过去。
如果您已经熟悉 Vagrant 的基础知识,该文档为所有可用功能和内部结构提供了更好的参考构建。
为什么选择 Vagrant? Vagrant 提供易于配置、可复制和可移植的工作环境,它建立在行业标准技术之上,并由单一一致的工作流程控制,以帮助最大限度地提高您和您的团队的工作效率和灵活性。
为了实现其魔力,Vagrant 站在巨人的肩膀上。机器在 VirtualBox、VMware、AWS 或任何其他提供商之上进行配置。然后,行业标准的配置工具(如 shell 脚本、Chef 或 Puppet)可以自动在虚拟机上安装和配置软件。
如果你开发人员,Vagrant 将在单个一次性、一致的环境中隔离依赖项及其配置,而不会牺牲您习惯使用的任何工具(编辑器、浏览器、调试器等)。一旦您或其他人创建了单个 Vagrantfile,您只需执行 vagrant up,然后所有内容都会安装并配置好,可供您工作。团队的其他成员使用相同的配置创建他们的开发环境,因此无论您是在 Linux、Mac OS X 还是 Windows 上工作,您的所有团队成员都在同一环境中运行代码,针对相同的依赖项,所有配置都相同。告别“在我的计算机上工作”的错误。
我的经验:我每天都使用 vagrant,它解决了所有依赖性问题。我在开发计算机上为不同的项目运行多个 VM。此外,您只需配置一次,每个人都会获得相同的配置。简单、易于使用,而且作为一项加分项,您可以将它与 AWS 一起使用