使用Docker实例制作Web服务器 – 什么地方在哪里?

我刚才遇到了Docker,并且一直在做一些研究,但是有一点对我来说还是有点不清楚。

在Docker创build者观看的video中,他将这个工具比作一个集装箱,这样你就可以保证你的堆栈在里面工作正常。

但是我看到很多的容器图像,只是一个单一的部分,即nginx图像或uwsgi图像。

基本上我想运行一个使用python,flask,nginx和uwsgi的web服务器。 它们都是堆栈的一部分,所以它们应该放在一个容器中,还是应该放在自己的容器中?

我也会有一个MySQL服务器,而且这似乎更合乎逻辑地运行在自己的容器中。

如果这是一个意见的问题,表示歉意,但对我来说,感觉就像只有一个正确的方式去做这件事。

Docker容器被视为部署单元 – 这意味着您将应用程序(或应用程序的一部分)及其所有依赖项打包到可独立部署的Docker容器中。 您的应用程序可能是单一的,您的整个应用程序可以放在一个容器中,只是公开浏览器访问的HTTP端点,或者是由可独立部署和pipe理的子组件组成的应用程序 – 像微服务一样 – 当放在一起时形成完整的应用程序。 在这种情况下,每个独立的子组件将驻留在它自己的容器中。 因此,决定一个容器中有多less个容器和多less个进程取决于你的应用程序的组成和你想实现的可扩展性。

Docker容器是为了运行单个进程,当然你可以通过运行像supervisord这样的进程pipe理工具来解决它。 我对你所谈论的Python堆栈并不是很熟悉,但是我可以用包含Nginx + Node + Redis的堆栈来解释这个问题。 我在博客文章中详细介绍了这个堆栈的示例docker工作stream程: http : //anandmanisankar.com/posts/docker-container-nginx-node-redis-example/

在我的博客文章中使用的例子中,Nginx,Node和Redis运行在不同的容器上。 原因如下:

  • 我希望能够根据负载来扩展我的节点应用程序。 所以在单独的容器上运行它是有道理的,我可以独立地进行缩放。
  • 我在单独的容器上运行Redis,它充当我的节点容器的共享数据存储。
  • 为了对我的节点容器进行负载平衡,我运行了Nginx – 再次在一个单独的容器上运行,可以dynamic平衡扩展节点容器间的负载。 负载均衡configuration也可以根据节点容器的状态/可用性/健康状况进行dynamic更新。 如果我能实现一个基于容器的可用性dynamic生成Nginxconfiguration的服务发现机制,那将是理想的。 因此,扩大规模只是增加额外的容器,容错(某些节点容器的故障)也会自动处理。

你可以在我的github仓库里finddocker worflow背后的代码: https : //github.com/msanand/docker-workflow

你可以尝试从这个比喻中抽象出任何其他的Web架构栈。 希望这可以帮助!

我认为你可以这样做,我做了一个公开的(和开源的)Docker镜像,可以用它来构build一个Python Flask Web应用程序。

它有用于运行应用程序的uWSGI,Nginx为HTTP和Supervisord提供服务来控制它们,因此您不必学习如何安装和configuration所有这些来构build您的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

关于“每容器一个进程”的争论,有人说,从微服务的angular度来看,这是一个关键的误解 : https : //valdhaus.co/writings/docker-misconceptions/

正如其他人在这里所说,正式build议每个容器有一个进程,请参阅https://docs.docker.com/articles/dockerfile_best-practices/

不过,我认为你需要多less进程隔离还有很多争议。 一个更接近整个堆栈的例子是包含nginx,ruby和乘客等的旅客形象(phusion / baseimage和phusion / passenger-docker)。 有些人讨厌这个,其他人认为有这样的形象的地方。 关于这个特定图像的意见和讨论的链接文章可以在这里find: https : //news.ycombinator.com/item?id=7258009 。 我认为你可以推广到你的情况很多,并且各种参数支持你观察到的各种图像types。

就我个人而言,我认为整个过程和单一过程的辩论是根据你所要达到的要求而定的。 如果您担心可扩展性,单一stream程模式可能对您更好。 如果你关心如何快速创build一个开发环境,那么创build/使用一个感觉更像虚拟机的容器可能会更直接。