我应该如何根据这种架构对这个MEAN堆栈进行Dockerise?

时间:2016-08-28 09:59:10

标签: docker mean-stack docker-compose phusion

我是Docker的新手。

你能看一下下面的计划吗?

计划

我想要的是能够使用当前的软件拥有大量隔离的docker容器:

  • NodeJs(npm,pm2,grunt-cli等)
  • MongoDB的
  • 其他软件(cron,ffmpeg等)

每个隔离的容器都与应用程序代码链接到相同的卷,但是以不同的ENV变量启动:expressJS端口,db名称等等。你有我,对吗?

例如,我们有两个独立的容器:stack1stack2

它们都使用与主机上/ home / user / app_code /(卷装)位于应用程序代码相同的卷。

stack1内的NodeJS在3001端口上启动并连接到其mongoDB服务器,该服务器在/ home / user / db1(卷装)使用DB,并且具有位于/ home / user /的多媒体专用存储存放1

stack2内的NodeJS在3002端口上启动并连接到其mongoDB服务器,该服务器在/ home / user / db2(卷装)使用DB,并且其专用存储位于/ home / user /存储2

当然stack1stack2位于Nginx单容器反向代理后面。

问题

实施我的计划的最佳方式是什么?

据我所知,docker-compose在我的案例中不是正确的工具。最后,我只能构建包含nodeJs图像和Mongo图像的堆栈。但是如何处理ffmpeg和cron呢?如何繁殖堆栈?是否可以将它们放在sinle Nginx容器后面?

第二种方法是采用"phusion/baseimage-docker",手动安装NodeJs,Mongodb,ffmpeg,将此容器相乘并隐藏Nginx启动代理后面的每一个。但是这种方法违反了一点Best practices for writing Dockerfiles(每个容器只运行一个进程)

还是有其他正确的方法吗?你将如何实现这种架构?

提前谢谢!

arch

1 个答案:

答案 0 :(得分:3)

它肯定不优雅但你可以使用docker-compose做到这一点。您只需创建每项服务的副本即可。例如:

version: "2"
services:
  stack1_node:
    ...
  stack1_mongo:
    ...
  stack1_software:
    ...
  stack2_node:
    ...
  stack2_mongo:
    ...
  stack2_software:
    ...

这是简短的回答。答案越长,您所描述的内容在Kubernetes中称为pod,在AWS ECS中称为task。它们是容器的分组,整体形成一个单元。新的码头工具" swarm模式"也有任务的概念,但它目前只处理一个容器。我毫不怀疑他们会在接下来的几个月内扩展它来处理你所描述的内容。他们应该按照自己的意愿从各地窃取想法。