根据这个架构,我应该如何 Dockerise 这个 MEAN 堆栈?
How should I Dockerise this MEAN stack according this architecture?
我是 Docker 的新手。
你能看看我下面附上的方案吗?
计划
我想要的是能够拥有一定数量的隔离 docker 容器和当前的板载软件:
- NodeJs(npm、pm2、grunt-cli 等)
- MongoDb
- 其他软件(cron、ffmpeg等)
每个独立的容器都链接到具有应用程序代码的相同 卷,但使用不同的 ENV 变量启动:expressJS 端口、数据库名称等。你明白我的意思,对吧?
例如,我们有 2 个独立的容器:stack1
和 stack2
。
它们都使用相同的卷,应用程序代码位于主机的 /home/user/app_code/(卷装载)。
stack1
中的 NodeJS 在 3001 端口上启动并连接到它的 mongoDB 服务器,该服务器使用 /home/user/db1 的数据库(卷安装)并且其专用的多媒体存储位于/home/user/storage1
stack2
中的 NodeJS 在 3002 端口上启动并连接到它的 mongoDB 服务器,该服务器使用 /home/user/db2 的数据库(卷安装)并且其专用的多媒体存储位于/home/user/storage2
当然还有stack1
和stack2
放在Nginx单容器反向代理后面。
问题
实施我的计划的最佳方式是什么?
据我了解,docker-compose
不是适合我的工具。最后,我只能构建包含 if nodeJs 图像和 Mongo 图像的堆栈。但是如何处理ffmpeg和cron呢?如何乘栈?是否可以将它们放在单个 Nginx 容器后面?
第二种方式是"phusion/baseimage-docker", manually install NodeJs, Mongodb, ffmpeg, multiply this container and hide each behind the Nginx revese proxy. But this approach violates a bit Best practices for writing Dockerfiles(运行每个容器只有一个进程)
或者还有其他正确的方法吗?您将如何实施此架构?
提前致谢!
它当然不优雅,但您可以使用 docker-compose 来做到这一点。您只需为每项服务创建副本。例如:
version: "2"
services:
stack1_node:
...
stack1_mongo:
...
stack1_software:
...
stack2_node:
...
stack2_mongo:
...
stack2_software:
...
这是简短的回答。更长的答案是您所描述的在 Kubernetes 中称为 pod
或在 AWS ECS 中称为 task
。它们是一组容器,它们作为一个整体形成一个单元。新的 docker "swarm mode" 也有任务的概念,但它目前只处理一个容器。我毫不怀疑他们会在接下来的几个月里延长它来处理你所描述的问题。他们从各处窃取创意,这是他们应该做的。
我是 Docker 的新手。
你能看看我下面附上的方案吗?
计划
我想要的是能够拥有一定数量的隔离 docker 容器和当前的板载软件:
- NodeJs(npm、pm2、grunt-cli 等)
- MongoDb
- 其他软件(cron、ffmpeg等)
每个独立的容器都链接到具有应用程序代码的相同 卷,但使用不同的 ENV 变量启动:expressJS 端口、数据库名称等。你明白我的意思,对吧?
例如,我们有 2 个独立的容器:stack1
和 stack2
。
它们都使用相同的卷,应用程序代码位于主机的 /home/user/app_code/(卷装载)。
stack1
中的 NodeJS 在 3001 端口上启动并连接到它的 mongoDB 服务器,该服务器使用 /home/user/db1 的数据库(卷安装)并且其专用的多媒体存储位于/home/user/storage1
stack2
中的 NodeJS 在 3002 端口上启动并连接到它的 mongoDB 服务器,该服务器使用 /home/user/db2 的数据库(卷安装)并且其专用的多媒体存储位于/home/user/storage2
当然还有stack1
和stack2
放在Nginx单容器反向代理后面。
问题
实施我的计划的最佳方式是什么?
据我了解,docker-compose
不是适合我的工具。最后,我只能构建包含 if nodeJs 图像和 Mongo 图像的堆栈。但是如何处理ffmpeg和cron呢?如何乘栈?是否可以将它们放在单个 Nginx 容器后面?
第二种方式是"phusion/baseimage-docker", manually install NodeJs, Mongodb, ffmpeg, multiply this container and hide each behind the Nginx revese proxy. But this approach violates a bit Best practices for writing Dockerfiles(运行每个容器只有一个进程)
或者还有其他正确的方法吗?您将如何实施此架构?
提前致谢!
它当然不优雅,但您可以使用 docker-compose 来做到这一点。您只需为每项服务创建副本。例如:
version: "2"
services:
stack1_node:
...
stack1_mongo:
...
stack1_software:
...
stack2_node:
...
stack2_mongo:
...
stack2_software:
...
这是简短的回答。更长的答案是您所描述的在 Kubernetes 中称为 pod
或在 AWS ECS 中称为 task
。它们是一组容器,它们作为一个整体形成一个单元。新的 docker "swarm mode" 也有任务的概念,但它目前只处理一个容器。我毫不怀疑他们会在接下来的几个月里延长它来处理你所描述的问题。他们从各处窃取创意,这是他们应该做的。