我有一个定期更新的数据处理应用程序。这个应用程序有一堆依赖项,它们也会不时更新。但是,不同版本的软件(+依赖项)可能会产生不同的结果(这是预期的)。应用程序在远程计算机上运行,可以通过Web页面访问。每次用户使用网页进行某些处理时,她/他还会选择他/她想要使用的软件版本。
现在我正在尝试确定哪种方法可以跟踪不同的软件(+依赖项)版本。最简单的方法当然是将我的软件及其依赖项的每个版本编译并安装在不同的文件夹中,然后根据用户发送的请求选择相应的文件夹。然而,这对我来说听起来很笨拙。所以我想我可以使用Docker来跟踪不同的软件版本。你觉得这是个好主意吗?如果是,每次我有新版本的软件(和/或依赖项)时最适合做的事情:1)使用新版本从头开始创建一个新容器(并最终拥有多个容器),或者2)更新现有容器并提交更改? (我想我可以访问容器的旧提交,对吗?)
PS:请记住,我调查Docker而不是简单的虚拟机解决方案的原因是我运行的应用程序是基于GPU的高性能软件。答案 0 :(得分:1)
Docker是一个合理的选择。您的存储库将包含您要发布的所有应用程序版本。请注意,如果将生成的应用程序文件系统组织到图层中,您将只会实现节省,其中较低层在版本之间更改的可能性最小。这将使存储要求保持在最低限度。
然后你必须决定如何处理每项工作。一个强大(但复杂)的解决方案是拥有一个或多个API容器,这些容器可以从您的用户处获取处理作业,并且可以使用#34; dole"它们是工作容器(每个发行版本中的一个或多个)。这将提供最低的响应延迟并且是非阻塞的。您可以查看不同的服务发现模型,以了解您的工作人员"容器可以向您的经理注册"容器。这可能比你想要咬掉更多,但考虑使用一个好的键值数据库(另一个容器!),如etcd或第三方服务发现工具,如zookeeper / eureka / consul。
一个更简单的模型将有一个API容器,每个容器都创建一个,但是没有启动。 API容器将启动,指示,然后停止相应的发布容器。您会产生启动延迟,但这是资源最少的...并且最容易管理。但这是阻止操作。
中间的某个地方,但用户友好性较低的是让每个发行容器都在运行但是在不同的主机端口上监听(应用程序总是看到相同的端口)。用户将连接到为所需的应用程序版本提供服务的端口。您必须提供某种索引才能使其有用。