如何将Docker化的应用程序交付给客户端?

4

我的应用程序由Web服务器(node.js),多个Worker(node.js)和Postgres数据库组成。通常,我会在Heroku上创建带有Postgres插件的应用程序,并使用Procfile中定义的进程将应用程序推送到Heroku平台。

然而,客户希望将应用程序交付给他的私人服务器,使用Docker容器技术。因此,整个流程应该是这样的:我在Web服务器或Worker节点中对node.js应用进行更改,将更改“推送”到代码库(Docker Hub?),当客户准备好时,“拉取”更改后的应用程序(镜像?)到他的服务器,然后应用程序(Docker容器?)使用新更新的代码重新启动。

我对Docker容器技术不太熟悉,即使阅读了一些文章和教程,也不确定如何使用Docker容器...

所以,理想情况下,如果有一个包含我的应用程序代码、数据库的Docker镜像(在Docker Hub上),客户只需要从中“拉取”它并运行它... 这在Docker中是否可行呢?

2个回答

4
标准策略是将您系统的每个组件打包成单独的Docker镜像(这称为微服务架构),然后创建一个“编排”——一组用于部署、启动/停止和更新的脚本。
例如:
- 部署脚本从Docker仓库(Docker Hub或您的私有仓库)中拉取镜像,然后调用启动脚本。 - 启动脚本只需对每个组件运行docker run命令。 - 停止脚本对每个组件调用docker stop命令。 - 更新脚本调用停止脚本,然后从仓库更新镜像,最后调用启动脚本。
互联网上有一些旨在简化编排的软件项目,例如这篇SO回答列出了全面的清单。但通常普通的Bash脚本也能正常工作。

2
如果您正在构建和分发系统的每个组件的完整操作系统镜像,那么每个服务一个Docker镜像可能会变得非常繁琐。对于像go这样没有依赖关系且镜像很小的东西来说,它确实非常有效,但对于具有多个臃肿的操作系统软件包依赖的应用程序来说就不太适用了。您可以在一个容器中运行多个受监控的进程。您还可以分发一个单一的基础镜像,该镜像可以运行您的所有单独的服务。 - Matt
@Matt 这是真的,微服务架构并不总是方便的。但有时候这是有益的,例如我们运行多个Python应用程序,因此我们为它们所有人都拥有共同的Python基础镜像 -> Docker镜像大小相对较小。 - Aleksei Petrenko
没错,小的好。小而常见的图像更好。很容易陷入构建、存储和分发大型图像的陷阱,这些图像基本上只是为了非常小的内容差异而重复。当您可以使用单个图像完成相同的工作时,但以两种不同的方式启动到两个不同的容器服务中。 - Matt
1
请注意,你好像忘记在最后一段中包含链接了。 - blah238

0

这篇帖子相当旧,期间发生了很多变化

我还需要为我的产品提供大约30张图片给客户

我构建了一个可靠的docker-compose文件,他们可以从代码管理系统中拉取并通过一个命令进行部署

我遇到的问题是我想为每个客户设置密钥,所以我正在阅读CNAB和Porter产品,这似乎能解决我的问题

对于那些在客户的本地基础架构上运行应用程序的需求相同的人,这可能会有所帮助

也许有人已经使用过Porter,并且从他们经验的角度分享一些优缺点

祝好,


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接