当前位置: 首页 > 知识库问答 >
问题:

我应该为我的web应用使用单独的Docker容器吗?

秋阳荣
2023-03-14

我是否需要为我的复杂Web应用程序使用单独的Docker容器,或者我可以将所有必需的服务放在一个容器中?有人能解释一下为什么我应该将我的应用程序划分为许多容器(例如php-fpm容器,mysql容器,mongo容器)当我能够在一个容器中安装和启动所有东西时?

共有3个答案

冯嘉珍
2023-03-14

有些人会告诉您每个容器只能运行一个进程。其他人会说每个容器一个应用程序。这些建议基于微服务的原则。

我不认为微服务是所有情况下的正确解决方案,所以我不会仅仅因为这个原因而盲目遵循这些建议。如果在一个容器中为您的案例设置多个进程是有意义的,那么就这样做。(有关该事项,请参阅Supervisor和Phusion baseimage)

但分离容器还有另一个原因:在大多数情况下,您需要做的工作更少。

在Docker Hub上,有很多现成的Docker映像。只需拉取您需要的。

接下来您要做的是:

  • 阅读docker图像的文档(要设置的环境变量等)
  • 创建一个docker compose。yml文件,以便于操作这些容器
陆承宣
2023-03-14

当您将web应用程序划分为多个容器时,部署应用程序时不需要重新启动所有服务。像传统一样,更新web层时不需要重启mysql服务器。

此外,如果要扩展应用程序,将应用程序划分为单独的容器会更容易。然后,您可以扩展应用程序中解决瓶颈所需的部分。

颜高朗
2023-03-14

与Docker合作时需要考虑的是它内部的工作方式。Docker将PID 1替换为您在Dockerfile中的指令CMD(和略为复杂的ENTRYPOINT)中指定的命令。PID 1通常是init系统所在的位置(sysvinit、runit、systemd等等)。您的容器通过从那里开始的任何过程生存和消亡。当进程死亡时,容器也会死亡。当您键入docker logs myContainer时,主机上会给出容器中该进程的Stdout和stderr。顺便说一句,这就是为什么您需要跳转来启动服务和运行cronjobs(通常由您的init系统完成的事情)。这对于理解以某种方式做事的动机非常重要。

现在,您可以做任何您想做的事情。关于“正确”的方法有很多意见,但您可以丢掉所有这些,做您想做的事情。因此,您可以弄清楚如何在一个容器中运行所有这些服务。但是现在您知道docker如何将PID 1替换为您在Dockerfile中的CMD(和ENTRYPOINT)中指定的任何命令,您可能认为谨慎的做法是尝试让您的应用程序在各自的容器中运行,并让它们通过容器链接相互协作。(更新-2017年4月27日:容器链接已被弃用,转而支持更健壮的常规ole容器网络,其想法是您只需将单独的应用程序容器连接到同一个网络,以便它们可以相互通信)。

如果您需要一点帮助来决定,我可以根据我自己的经验告诉您,当您将应用程序分离到单独的容器中,然后将它们链接在一起时,它最终会更干净、更容易维护。刚才我正在从HHVM构建Wordpress安装,我正在安装Nginx和HHVM/php-fpm,Wordpress安装在一个容器中,MariaDB的东西在另一个容器中。将来,这将让我直接在我的MariaDB数据前面放置一个替换的Wordpress安装,几乎没有任何麻烦。为每个应用程序进行容器化是值得的。祝你好运!

 类似资料:
  • 问题内容: 我打算使用Kubernetes和Ingress进行负载平衡。我正在尝试学习如何设置Flask,uWSGI和Nginx。我看到本教程将所有三个安装在同一容器中,我想知道是否应该使用它。 https://ianlondon.github.io/blog/deploy-flask-docker- nginx/ 我猜测将它们作为单独的容器和单独的容器的好处是它们可以分别进行单独缩放? 但是,F

  • 问题内容: 我正在重构几个node.js服务。所有这些以前都是在虚拟服务器上开始的,如果进程崩溃,它们只会重新启动。 现在,转向容器化和无状态的应用程序结构,我认为该过程应该退出,并且应该在发生故障时重新启动容器。 那是对的吗?有好处还是不利? 问题答案: 我的想法是不要使用容器内进程管理器(永远是pm2),而是通过(或该选项的其他一种方式)使用docker restart策略。这与整个docke

  • 我写了以下代码: 我只使用了一个useState在一个对象中存储“name”、“link”、“error”等属性。因为我想将FormObj和ValidateLink的逻辑保持在一起。所有三个属性仅使用一个useEffect。因此,我认为最好将所有三个属性都保留在useState中,而不是创建3个不同的useState。 但是我的经理和技术架构师告诉我要为每个属性创建3个useState,一个use

  • Docker教程经常说我可以运行更多容器,以提高我的webapp的可用性。然而,这是一个非常宽泛的声明,并没有解释在不同的情况下应该运行多少个容器。我如何知道我是否需要1、5、10、100或1000个容器实例? 示例-我只有一台服务器,正在使用docker运行nginx和php fpm。每个容器一个。有了这个简单的设置,我的webapp就可以正常工作,而且看起来很灵敏。(在同一台服务器上)增加额外

  • 我的程序使用Java脚本API,可以同时评估一些脚本。它们不使用共享脚本对象、绑定或上下文,但可以使用相同的和对象。我发现Java8中的OracleNashorn实现不是多线程的,返回,文档中说: 引擎实现不是线程安全的,不能用于在多个线程上并发执行脚本。 这是否意味着我应该为每个线程创建一个单独的实例?此外,文档中没有提到并发使用,而是: 每个已编译脚本都与一个脚本引擎相关联 可以假设线程安全依

  • 问题内容: 每个命令或Dockerfile中的每个命令都会创建一个容器。如果容器不再运行,则仍可以通过看到它。 我应该担心拥有大量未运行的容器吗?我应该在非运行容器上发行吗? 我不确定这些非运行中的容器会导致哪些性能或内存/存储损失。 问题答案: 未运行的容器除磁盘空间外不占用任何系统资源。 通常,最好自己清理一下,但是如果有很多人坐在那里,那根本就不会降低性能。 如果在运行带有大量已停止容器的D