一个容器内有多张图片

40
所以,这是问题,我需要进行一些开发,为此需要以下软件包:
  1. MongoDb
  2. NodeJs
  3. Nginx
  4. RabbitMq
  5. Redis
一个选项是使用 Ubuntu 镜像,创建容器并开始逐个安装它们,最后启动服务器并暴露端口。
但这也可以在虚拟机中轻松完成,并不会使用 Docker 的强大功能。因此,我必须开始构建自己的镜像来包含这些软件包。现在问题是,如果我开始编写 Dockerfile 并将下载 Node js(和其他软件)的命令放在其中,那么又回到了虚拟化。
我需要从 Ubuntu 开始,并不断添加 MongoDB、NodeJs、RabbitMq、Nginx 和 Redis 的引用,并最终将端口公开。以下是我的问题:
  1. 这可能吗?在 FROM 一个基础镜像时,在 Dockerfile 中添加其他镜像的引用。
  2. 如果可以,怎么做?
  3. 这是正确的实践方法吗?
  4. 如何在 Docker 中实现这些操作?
提前感谢您的帮助。

7
您可以使用docker-compose来获取单个服务镜像并创建一组容器。编写compose文件将定义这组镜像如何相互连接以及与外部世界的连接方式。 - tillaert
谢谢@tillaert,我会研究一下的。 - Ankur Verma
1个回答

62
保持图像轻量化。每个容器只运行一个服务。对于mongodb、nodejs、rabbitmq、nginx等,使用docker hub上的官方镜像。如有需要,可以扩展这些镜像。如果您想在一个大型容器中运行所有东西,那么您也可以使用虚拟机。
当然,在开发设置中,您可以做一些疯狂的事情,但为什么要花时间设置在生产环境中没有任何价值的东西呢?如果您需要扩展其中一个服务,该怎么办?如何在每个服务中设置内存和CPU限制?……等等。
不要制作单体容器。
好的开始是使用docker-compose配置一组可以相互通信的服务。您可以创建docker-compose.yml文件的生产版和开发版。
进入正确的思维模式
在理想的世界中,您将在生产中使用聚集环境来运行容器,以便能够扩展系统并进行并发处理,但根据您正在运行的内容,这可能过于复杂。至少将这个想法放在脑后是很好的,因为它可以帮助您做出正确的决策。
如果您想成为一个纯粹主义者,可以考虑以下几点:
- 如何在多个主机之间拥有持久卷存储? - 反向代理/负载平衡器可能是进入系统的入口点,它使用内部网络与容器通信。 - 我的服务是否能在集群环境中运行(多个容器实例)?
当然,在开发中您可以做一些不正规的事情,例如映射主机卷以进行持久存储(许多在生产中使用独立的docker的人也会这样做)。
理想情况下,我们应该将开发和生产中的docker分开。Docker在开发期间是一个非常好的工具,因为您可以在几分钟内运行redis、memcached、postgres、mongodb、rabbitmq、node或其他内容,并与团队的其他成员共享该组合设置。在生产中,Docker可能是完全不同的东西。

我还想补充一点,我通常反对在生产环境中出现“所有东西都应该在Docker中运行”的狂热思潮。只有在有意义的情况下才在Docker中运行服务。更大的公司也经常制作自己的基础镜像。这可能需要很多工作,并且需要维护以跟上安全修复等方面的要求。这不一定是您开始使用Docker时首先考虑的事情。


3
完美的点。因此,最佳实践是在自己的容器中启动每个包,并让它们相互通信。那么我如何与其他人共享此设置或将其部署在生产环境中? - Ankur Verma
1
您可以使用docker-compose开始。一切都在一个yml文件中描述。 - Grimmy
1
我已经扩展了我的回答。这可能有助于让你进入正确的思维模式。 - Grimmy
谢谢,现在我需要阅读关于如何将整个开发堆栈拼接起来,并使其围绕Docker工作的内容。这可能会相当复杂。再次感谢。 - Ankur Verma
3
“为什么要花时间在没有生产价值的事情上?”这句话对于那些在尝试在ECS上使用docker-compose并浪费了数个小时的人来说是很有趣的。 - 1984

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