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

Fre*_*xin 23 docker devops

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

L0j*_*j1k 25

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

现在,你可以做任何你想做的事.关于"正确"的方式有很多意见,但是你可以抛弃所有这些并做你想做的事.所以你可以弄清楚如何在一个容器中运行所有这些服务.但是现在你知道搬运工如何替换PID 1与你指定的任何命令CMD(和ENTRYPOINT)在你的Dockerfiles,你可能会认为谨慎的做法是尽量保持你的应用程序运行各自在自己的容器中,并让他们通过相互合作容器链接.(更新 - 2017年4月27日:容器链接已被弃用,有利于常规的ole 容器网络,这更加强大,这个想法是你只需将你的独立应用程序容器加入同一个网络,这样他们就可以互相交流) .

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


Lau*_*uri 12

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

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


Tho*_*eil 5

有人会告诉您,每个容器只能运行1个进程。其他人会说每个容器1个申请。这些建议基于微服务原理。

我不认为微服务在所有情况下都是正确的解决方案,因此我不会因为这个原因而盲目地遵循这些建议。如果在您的情况下在一个容器中具有多个进程是有意义的,则可以这样做。(有关此问题,请参见Supervisor and Phusion基本图像

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

Docker Hub上,有许多现成的Docker映像可供使用。只要拉你需要的。

然后剩下要做的是:

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