使用 Docker 个实例制作 Web 服务器 - 什么去哪里?
Making a web server with Docker instances - What goes Where?
我几天前才接触到 Docker 并且一直在做一些研究,但有一件事对我来说仍然有点不清楚。
在 Docker 的创建者观看的视频中,他将此实用程序比作一个运输容器,这样您就可以保证您的堆栈在内部设置后按预期工作。
但我看到很多容器镜像只是堆栈的一部分,即 nginx 镜像或 uwsgi 镜像。
基本上我想 运行 使用 python、flask、nginx 和 uwsgi 的网络服务器。它们都是堆栈的一部分,那么它们应该放在一个容器中还是某些部分应该放在它们自己的容器中?
我也会有一个 MySQL 服务器,这对于 运行 在其自己的容器中似乎更合乎逻辑。
抱歉,如果这是一个意见问题,但对我来说,感觉只有一种正确的方法可以解决这个问题。
Docker 容器被视为部署单元 - 这意味着您将应用程序(或应用程序的一部分)及其所有依赖项打包到一个 docker 容器中,该容器可以独立部署。您的应用程序可以是整体式的,其中您的整个应用程序适合一个容器,只公开 HTTP 端点供浏览器访问,或者是一个由可以独立部署和管理的子组件组成的应用程序 - 类似于微服务 - 当放在一起时形成完整的应用程序。在这种情况下,每个独立的子组件都将驻留在它自己的容器中。因此,关于容器中有多少个容器和多少个进程的决定取决于您的应用程序的组成和您想要实现的可扩展性类型。
Docker 容器用于 运行 单个进程,但当然您可以通过 运行ning 进程管理工具(如 supervisord)来解决它。我对你说的 python 堆栈不是很熟悉,但我可以用 Nginx + Node + Redis 组成的堆栈向你解释。我也在我的博客 post 中详细阐述了使用此堆栈的示例 docker 工作流:http://anandmanisankar.com/posts/docker-container-nginx-node-redis-example/
在我的博客 post 中使用的示例中,Nginx、Node 和 Redis 运行 在不同的容器上。原因如下:
- 我希望能够根据负载扩展我的节点应用程序。所以将它 运行 放在我可以独立扩展的单独容器上是有意义的。
- 我 运行 Redis 在一个单独的容器上,作为我的节点容器的共享数据存储。
- 为了对我的节点容器进行负载平衡,我 运行 Nginx - 再次在一个单独的容器上 - 可以在横向扩展的节点容器之间动态平衡负载。负载均衡配置也可以根据节点容器的 state/availability/health 动态更新。如果我能实现一种服务发现机制,它会根据容器的可用性动态生成 Nginx 配置,那将是理想的。因此,向上扩展只是添加额外容器的问题,容错(某些节点容器的故障)也会自动处理。
您可以在我的 github 存储库中找到此 docker 工作流背后的代码:https://github.com/msanand/docker-workflow
您可以尝试将其与任何其他 Web 架构堆栈进行类比。希望这对您有所帮助!
正如这里其他人所说,官方建议每个容器一个进程,请参阅
https://docs.docker.com/articles/dockerfile_best-practices/
但是,我认为关于您需要多少进程隔离存在很多争论。一个更接近完整堆栈的示例是 phusion passenger 图像(phusion/baseimage 和 phusion/passenger-docker)
其中包括 nginx、ruby 和 passenger。有些人讨厌这个,其他人认为这样的图像有一席之地。可以在此处找到关于此特定图像的观点和讨论它的链接文章:https://news.ycombinator.com/item?id=7258009。我认为您可以将那里所说的很多内容概括为您的案例,并且各种论据支持您观察到的各种图像类型。
就我个人而言,我认为完整堆栈与单一进程的争论归结为您要实现的目标的要求。如果您担心可伸缩性,单进程范式可能更适合您。如果您关心快速启动开发环境,那么 create/take 感觉更像虚拟机的容器可能更直接。
我想你会喜欢这个,我制作了一个 public(和开源)Docker 图像,其中包含你可以用来构建 Python Flask 的所有附加功能网络应用程序。
它为 运行 应用程序提供了 uWSGI,为 HTTP 提供服务的 Nginx 和用于控制它们的 Supervisord,因此您无需学习如何安装和配置所有这些来构建您的 Python Flask 网络应用程序。
似乎带有 Nginx 的 uWSGI 是部署 Python 网络应用程序的更健壮(并且具有出色性能)的方法之一。以下是基准:http://nichol.as/benchmark-of-python-web-servers.
您甚至可以使用一些模板项目来 bootstrap 您自己的项目。而且,您不必克隆整个项目或其他东西,您可以将它用作基础图像。
Docker 中心:https://hub.docker.com/r/tiangolo/uwsgi-nginx-flask/
GitHub: https://github.com/tiangolo/uwsgi-nginx-flask-docker
关于 "one process per container" 的争论,有人说这是 主要的误解之一 从微服务的角度来看:https://valdhaus.co/writings/docker-misconceptions/
我几天前才接触到 Docker 并且一直在做一些研究,但有一件事对我来说仍然有点不清楚。
在 Docker 的创建者观看的视频中,他将此实用程序比作一个运输容器,这样您就可以保证您的堆栈在内部设置后按预期工作。
但我看到很多容器镜像只是堆栈的一部分,即 nginx 镜像或 uwsgi 镜像。
基本上我想 运行 使用 python、flask、nginx 和 uwsgi 的网络服务器。它们都是堆栈的一部分,那么它们应该放在一个容器中还是某些部分应该放在它们自己的容器中?
我也会有一个 MySQL 服务器,这对于 运行 在其自己的容器中似乎更合乎逻辑。
抱歉,如果这是一个意见问题,但对我来说,感觉只有一种正确的方法可以解决这个问题。
Docker 容器被视为部署单元 - 这意味着您将应用程序(或应用程序的一部分)及其所有依赖项打包到一个 docker 容器中,该容器可以独立部署。您的应用程序可以是整体式的,其中您的整个应用程序适合一个容器,只公开 HTTP 端点供浏览器访问,或者是一个由可以独立部署和管理的子组件组成的应用程序 - 类似于微服务 - 当放在一起时形成完整的应用程序。在这种情况下,每个独立的子组件都将驻留在它自己的容器中。因此,关于容器中有多少个容器和多少个进程的决定取决于您的应用程序的组成和您想要实现的可扩展性类型。
Docker 容器用于 运行 单个进程,但当然您可以通过 运行ning 进程管理工具(如 supervisord)来解决它。我对你说的 python 堆栈不是很熟悉,但我可以用 Nginx + Node + Redis 组成的堆栈向你解释。我也在我的博客 post 中详细阐述了使用此堆栈的示例 docker 工作流:http://anandmanisankar.com/posts/docker-container-nginx-node-redis-example/
在我的博客 post 中使用的示例中,Nginx、Node 和 Redis 运行 在不同的容器上。原因如下:
- 我希望能够根据负载扩展我的节点应用程序。所以将它 运行 放在我可以独立扩展的单独容器上是有意义的。
- 我 运行 Redis 在一个单独的容器上,作为我的节点容器的共享数据存储。
- 为了对我的节点容器进行负载平衡,我 运行 Nginx - 再次在一个单独的容器上 - 可以在横向扩展的节点容器之间动态平衡负载。负载均衡配置也可以根据节点容器的 state/availability/health 动态更新。如果我能实现一种服务发现机制,它会根据容器的可用性动态生成 Nginx 配置,那将是理想的。因此,向上扩展只是添加额外容器的问题,容错(某些节点容器的故障)也会自动处理。
您可以在我的 github 存储库中找到此 docker 工作流背后的代码:https://github.com/msanand/docker-workflow
您可以尝试将其与任何其他 Web 架构堆栈进行类比。希望这对您有所帮助!
正如这里其他人所说,官方建议每个容器一个进程,请参阅 https://docs.docker.com/articles/dockerfile_best-practices/
但是,我认为关于您需要多少进程隔离存在很多争论。一个更接近完整堆栈的示例是 phusion passenger 图像(phusion/baseimage 和 phusion/passenger-docker) 其中包括 nginx、ruby 和 passenger。有些人讨厌这个,其他人认为这样的图像有一席之地。可以在此处找到关于此特定图像的观点和讨论它的链接文章:https://news.ycombinator.com/item?id=7258009。我认为您可以将那里所说的很多内容概括为您的案例,并且各种论据支持您观察到的各种图像类型。
就我个人而言,我认为完整堆栈与单一进程的争论归结为您要实现的目标的要求。如果您担心可伸缩性,单进程范式可能更适合您。如果您关心快速启动开发环境,那么 create/take 感觉更像虚拟机的容器可能更直接。
我想你会喜欢这个,我制作了一个 public(和开源)Docker 图像,其中包含你可以用来构建 Python Flask 的所有附加功能网络应用程序。
它为 运行 应用程序提供了 uWSGI,为 HTTP 提供服务的 Nginx 和用于控制它们的 Supervisord,因此您无需学习如何安装和配置所有这些来构建您的 Python Flask 网络应用程序。
似乎带有 Nginx 的 uWSGI 是部署 Python 网络应用程序的更健壮(并且具有出色性能)的方法之一。以下是基准:http://nichol.as/benchmark-of-python-web-servers.
您甚至可以使用一些模板项目来 bootstrap 您自己的项目。而且,您不必克隆整个项目或其他东西,您可以将它用作基础图像。
Docker 中心:https://hub.docker.com/r/tiangolo/uwsgi-nginx-flask/
GitHub: https://github.com/tiangolo/uwsgi-nginx-flask-docker
关于 "one process per container" 的争论,有人说这是 主要的误解之一 从微服务的角度来看:https://valdhaus.co/writings/docker-misconceptions/