我应该为我的网络应用程序使用单独的Docker容器吗?

时间:2015-05-29 16:47:25

标签: docker devops

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

5 个答案:

答案 0 :(得分:20)

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

现在,你可以做任何你想做的事。关于“正确”的方式有很多意见,但是你可以抛弃所有这些并做你想做的事。所以你可以弄清楚如何在一个容器中运行所有这些服务。但是既然你知道docker如何用你在Dockerfiles中的CMD(和ENTRYPOINT)中指定的任何命令替换PID 1,你可能会认为谨慎地尝试让你的应用程序在自己的容器中运行,让他们通过container linking相互合作。 (更新 - 2017年4月27日:容器链接已被弃用,有利于常规ole container networking,这更加强大,我们的想法是您只需将单独的应用程序容器加入到相同的网络,以便他们可以互相交谈。)

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

答案 1 :(得分:10)

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

此外,如果您想扩展应用程序,如果您的应用程序分为不同的容器,则会更容易。然后,您可以扩展应用程序中解决瓶颈所需的那些部分。

答案 2 :(得分:3)

有些人会告诉您每个容器只能运行1个进程。其他人会说每个容器1个申请。这些建议基于microservices的原则。

我不相信微服务是适用于所有情况的正确解决方案,所以我不会因为这个原因盲目地遵循这些建议。如果在一个容器中为您的案例设置多个进程是有意义的,那么这样做。 (有关此事,请参阅SupervisorPhusion baseimage

但是还有另一个分隔容器的理由:在大多数情况下,你做的工作就少了。

Docker Hub上,有很多可以使用的Docker镜像。只需拉出你需要的那些。

那么你还剩下什么:

  • 阅读这些docker图像的文档(要设置的环境变量等)
  • 创建docker-compose.yml文件以简化操作这些容器

答案 3 :(得分:3)

最好将您的webapp放在一个容器中,将您的支持服务(如数据库等)放在一个单独的容器中。通过执行此操作,如果您需要执行滚动更新或重新启动,您可以在应用程序节点单独重新启动时保持数据库联机,这样您就不会遇到停机时间。如果您使用Redis等进行缓存,则出于同样的原因,这也很有用。它还允许您以松散耦合的方式更轻松地添加节点。它还允许您以更适合特定目的的方式管理容器。对于您描述的应用程序类型,我看到很少有关于在单个容器上运行所有服务的参数。

答案 4 :(得分:1)

这取决于您的应用的愿景和路线图。在这种情况下,将应用程序的所有组件放在一个层中的docker容器就像将所有鸡蛋放在一个篮子里。

每当您的应用程序需要安全性时,与性能相关的问题就会将这三个组件分离到自己的容器中,这将是一个理想的解决方案。不用说,跨容器的这种分工会产生一定的成本,而且与将这些容器连接在一起以进行通信和安全等有关。