我刚刚在几天前遇到过Docker并且一直在做一些研究,但有一件事对我来说仍然有点不清楚。
在我看到Docker的创建者观看的视频中,他将此实用程序比作装运容器,以便您可以保证堆叠在设置内部时按预期工作。
但我看到很多容器图像只是堆栈的一部分,即nginx图像或uwsgi图像。
基本上我想使用python,flask,nginx和uwsgi运行Web服务器。它们是堆栈的所有部分,所以它们应该放在一个容器中还是某些部分应该放在自己的容器中?
我也有MySQL服务器,这在自己的容器中运行似乎更合乎逻辑。
道歉,如果这是一个意见问题,但对我而言,感觉只有一种正确的方法可以解决这个问题。
答案 0 :(得分:2)
Docker容器被视为部署单元 - 这意味着您将应用程序(或应用程序的一部分)及其所有依赖项打包到可以独立部署的docker容器中。您的应用程序可能是整体的,其中您的整个应用程序适合于一个容器,只是暴露HTTP端点供浏览器访问,或者是由可以独立部署和管理的子组件组成的应用程序 - 类似于微服务 - 当它们组合在一起时形成完整的应用程序。在这种情况下,每个独立的子组件将驻留在它自己的容器中。因此,决定容器中有多少容器和多少进程取决于应用程序的组成以及您希望实现的可伸缩性类型。
Docker容器用于运行单个进程,但当然您可以通过运行supervisord等进程管理工具来解决它。我对你正在讨论的python堆栈不是很熟悉,但是我可以用包含Nginx + Node + Redis的堆栈来解释这个问题。我在博客文章中详细介绍了此堆栈的示例docker工作流程:http://anandmanisankar.com/posts/docker-container-nginx-node-redis-example/
在博客文章中使用的示例中,Nginx,Node和Redis在不同的容器上运行。原因如下:
你可以在我的github repo上找到这个docker worflow背后的代码:https://github.com/msanand/docker-workflow
你可以尝试从这个到任何其他Web架构堆栈的类比。希望这有帮助!
答案 1 :(得分:2)
我认为你可以这样,我制作了一个公共(和开源)Docker镜像,其中包含可用于构建Python Flask Web应用程序的所有铃声和口哨声。
它有uWSGI用于运行应用程序,Nginx用于提供HTTP和Supervisord来控制它们,因此您不必学习如何安装和配置所有这些来构建Python Flask Web应用程序。
使用Nginx的uWSGI似乎是部署Python Web应用程序的更强大(并且性能更好)的方法之一。以下是基准:http://nichol.as/benchmark-of-python-web-servers。
甚至还有一些模板项目可用于引导您自己的项目。而且,您不必克隆整个项目或其他东西,您只需将其用作基本图像。
Docker Hub:https://hub.docker.com/r/tiangolo/uwsgi-nginx-flask/
GitHub:https://github.com/tiangolo/uwsgi-nginx-flask-docker
关于“每个容器的一个流程”辩论,有人说当你从微服务的角度来看时,这是关键误解之一:https://valdhaus.co/writings/docker-misconceptions/
答案 2 :(得分:1)
正如其他人所说,正式建议每个容器有一个进程,请参阅 https://docs.docker.com/articles/dockerfile_best-practices/
但是,我认为关于您需要多少过程隔离的争论很多。更接近完整堆栈的一个例子是错误乘客图像(phusion / baseimage和phusion / passenger-docker) 捆绑,其中包括nginx,红宝石和乘客。有些人讨厌这个,有些人认为有这样的图像的地方。关于这个特定图像的意见以及讨论它的链接文章可以在这里找到:https://news.ycombinator.com/item?id=7258009。我认为你可以概括一下你的案例所说的内容,并且各种各样的论证都支持你观察到的各种图像类型。
就个人而言,我认为完整的堆栈与单一进程的争论取决于你想要达到的要求。如果您担心可扩展性,单一流程范例可能对您更好。如果您关心快速启动开发环境,那么创建/获取更像虚拟机的容器可能会更直接。