使用docker是批量应用程序的一个好主意?

Docker专家,

我已经听说了很多关于docker工人的事情,在通过文档之后,我了解了它的优点。 我想尝试一下我们正在开发的一个小批量应用程序。 在我们的devise中,我们将开发一个Java批处理应用程序并在RHEL主机上运行。 在不久的将来(至less1年以上),我们可能计划将On Prim迁移到Cloud。

以下是我的批处理应用程序所做的工作 – 它每天接收一组来自外部源的文件(数据文件在程序执行的主机上可用于此程序)。 它也连接到一个关系数据库。 做一些处理。 将输出加载到数据库。 发送一些电子邮件等….非常基本的批处理function。

这是我的第一套与Docker的devise相关的问题 – 1.这是一个很好的Docker用例吗? Docker推荐用于批量应用程序? 2.我相信我的情况下,我会收到文件后运行docker图像(让我们说每天晚上10点)。 图像将文件复制到Docker容器…过程文件…加载到DB …并终止容器… – 正确的devise?

这里是我的第二个与docker-1有关的问题。正如你在我的过程中看到的,我基本上需要运行一些复制命令来将文件从主机文件系统移动到docker。 并运行一个简单的java批处理程序。 我如何select基础图像? 请注意我的主机操作系统将是RHEL。 2.我真的需要一个带有操作系统的基础镜像吗? 3. OPENJDK基本映像是否有OS?如果是,为什么? 4.我真的需要一个基本的形象? 我可以从头开始,安装Java,并准备好 – 我不确定这是如此简单,从头开始创build一个图像…?

很好的问题! 我只是将问题分开,以便能够很好地回答问题。

第一组问题

  1. 这对docker工人来说是一个很好的用例吗? Docker推荐用于批量应用程序?

是的,完全是! 当需要隔离应用程序环境时,Docker是推荐的工具。 因此,build立独立的服务也很好。

在你的情况下,如果你愿意,你可以用某种方式拆分你的服务,你可以单独testing它们。 例如,一个服务可以读取数据,另一个服务可以处理数据,另一个服务可以发送电子邮件等等。你要怎么做的粒度取决于你。 Docker的好处在于它将提供一个“安全”的环境来运行所有的应用程序部分。

关于批处理应用程序,我将在下一个问题上回答。

  1. 我相信在我的情况下,我会在收到文件时运行Docker镜像(让我们说每天晚上10点)。 图像将文件复制到docker容器…处理文件…加载到数据库…并终止容器… – 正确的devise?

如果你按照你说的方式,你需要有一个外部工具,就像一个“spawner”。 然后当你想要处理你的文件并产生一个新的容器来完成这个工作的时候,它需要被通知。 这可以通过使用bash或其他编程语言通过SDK使用Docker API来完成。 这没有错,但是需要你pipe理很多东西才能使这个工作更好。

根据我自己的经验,这往往是难以pipe理的,所以,更好的方法是创build一个“长时间运行”的应用程序,它将监听事件以了解处理数据的好时机。 这将使您更容易testing,部署和监视。

另外,如果将来你需要扩展它,你可以使用像Swarm这样的工具或使用像Nomad这样的工具。 当然,也许你需要修改你的应用程序来支持并发等,但这是另一回事。

第二组问题

  1. 正如你在我的过程中看到的,我基本上需要运行一些副本命令,将文件从主机文件系统移动到docker。 并运行一个简单的java批处理程序。 我如何select基础图像? 请注意我的主机操作系统将是RHEL。

我会把你连接到这两个真棒的答案:

https://stackoverflow.com/a/22130417/2624575

https://stackoverflow.com/a/28733703/2624575

但是,如果您想要简短的答案,请从官方存储库中select图像,然后添加您所需的依赖项。

  1. 我真的需要一个带有操作系统的基础镜像吗? 3. OPENJDK基本映像是否有OS?如果是,为什么?

关于有一个操作系统的问题,这个答案将帮助你澄清事情:

https://serverfault.com/a/755616

另外,这篇博文更好的解释了这一点:

https://blog.risingstack.com/operating-system-containers-vs-application-containers/

  1. 我真的需要一个基本的形象? 我可以从头开始,安装Java,并准备好 – 我不确定这是如此简单,从头开始创build一个图像…?

你可以“自己”去创造一个基本的形象。 很多团队都是这样做来创build一个基本的图像,其中包含所有必需的工具( vimbashsed等)。 根据你的情况,这将是一个好主意。

而且,这并不难。 例如,请查看如何构buildAlpine (可用的最小基础图像之一)基础图像:

https://github.com/gliderlabs/docker-alpine/blob/c6cb2bbffbc92d4c35cdaf584dd1c43a860104ea/versions/library-3.6/Dockerfile

但是,如果你想“开始简单”,只需select一个好的基础图像,并与之一起去。

一个相关的好事是,对于golang应用程序,你可以从头开始,把二进制文件放在Docker容器中运行。 如果您有兴趣,请查看以下博客文章:

https://tachingchen.com/blog/Building-Minimal-Docker-Image-for-Go-Applications/

我希望它有帮助!