一个容器内的多个图像

所以,这里是问题,我需要做一些开发 ,为此我需要下列软件包:

  1. MongoDB的
  2. 的NodeJS
  3. Nginx的
  4. 的RabbitMQ
  5. Redis的

一个select是我拿一个Ubuntu镜像创build一个容器,并开始逐个安装它们,启动我的服务器,并暴露端口。

但是这也可以很容易地在一个虚拟的盒子里完成,而且不会使用Docker的function。 因此,我必须用这些软件包开始构build自己的图像。 现在问题是,如果我开始编写我的Dockerfile,并且如果将命令下载到其中的Node js(和其他),这又变成了像虚拟化一样的东西。

我需要的是,我从Ubuntu开始,并继续在Dockerfile中 添加 MongoDb,NodeJs,RabbitMq,Nginx和Redis引用,并最终公开各自的端口。

这里是我有的问题:

  1. 这可能吗? 像从一个基本映像启动时添加Dockerfile中其他映像的引用。
  2. 如果是,那么如何?
  3. 这也是正确的做法吗?
  4. 如何在Docker中做这些事情?

提前致谢。

保持图像清晰。 每个容器运行一个服务。 在docker hub上使用官方镜像,以获得mongodb,nodejs,rabbitmq,nginx等等。 如果你想在一个容器中运行所有的东西,你可能只需要使用一个虚拟机。

你当然可以在开发环境中做些疯狂的事情,但是为什么花时间在生产环境中设置一些价值为零的东西呢? 如果您需要扩展其中一项服务,该怎么办? 如何在每个服务上设置内存和cpu约束? .. 而这样的例子不胜枚举。

不要做整体容器。

一个好的开始是使用docker-compose来configuration一组可以相互通信的服务。 您可以制作docker-compose.yml文件的prod和dev版本。

进入正确的思维框架

在完美的世界中,您可以在生产环境中运行容器,以便能够扩展系统并具有并发性,但这可能是过度的,取决于您正在运行的是什么。 这至less是好事,因为它可以帮助你做出正确的决定。

如果你想成为一个纯粹主义者,可以考虑一些问题:

  • 您如何在多个主机上持久存储卷?
  • 反向代理/负载均衡器应该是进入系统的入口点,与使用内部networking的容器进行通信。
  • 我的服务甚至能够在集群环境中运行(容器的多个实例)

你当然可以在开发中做一些肮脏的事情,例如在主机卷中映射持久化存储(许多使用docker的人也是这样做的)。

理想情况下,我们应该将开发者和docker工人分开。 在开发过程中,Docker是一个非常棒的工具,因为你可以在reddit,memcached,postgres,mongodb,rabbitmq,node或者其他几分钟的时间内共享这个工具。 docker中的prod可以是一个完全不同的野兽。

我还想补充一点,我一般反对“一切都应该在docker工作”的狂​​热主义。 在Docker中运行服务时,它是有道理的。 大公司制作自己的基本图像也并不罕见。 这可能是很多工作,并将需要维护跟上安全修复等,这不一定是您在开始时使用泊坞窗的第一件事。