Dockerizing nginx和Flask

Nav*_*vid 6 nginx flask docker kubernetes

我正在建立一个Flask/uswgi网络服务器.我仍然想知道微服务架构:

我应该将带有uwsgi的nginx和Flask放在一个容器中,还是将它们放在两个不同的容器中并将它们连接起来?

我打算在Kubernetes集群中运行这些服务.

谢谢

Ang*_*los 5

简短回答:

我会将 nginx 和 uwsgi/flask 应用程序部署为单独的容器。这为您提供了更灵活的架构,随着您对更多服务的需求增长,您可以将更多微服务容器链接到 nginx 实例。

解释:

对于 docker,通常的策略是将 nginx 服务和 uwsgi/flask 服务拆分为两个单独的容器。然后您可以使用链接将它们链接起来。这是 docker 世界中常见的架构哲学。像 docker-compose 这样的工具简化了运行多个容器以及在它们之间形成链接的管理。以下 docker-compose 配置文件显示了一个示例:

version: '2'
services:

  app:
    image: flask_app:latest
    volumes:
        - /etc/app.cfg:/etc/app.cfg:ro
    expose:
        - "8090"

  http_proxy:
    image: "nginx:stable"
    expose:
        - "80"
    ports:
        - "80:8090"
    volumes:
        - /etc/app_nginx/conf.d/:/etc/nginx/conf.d/:ro
Run Code Online (Sandbox Code Playgroud)

这意味着如果您想添加更多应用程序容器,您可以通过链接它们轻松地将它们附加到同一个 ngnix 代理。此外,如果你想升级基础设施的一部分,比如升级 nginx,或者从 apache 迁移到 nginx,你只需重新构建相关容器,而将其余的都留在原地。

如果您要将这两个服务添加到单个容器中(例如,通过从 Dockerfile ENTRYPOINT 启动supervisord 进程),那么您可以更轻松地选择使用ocks 文件(而不是通过IP)在nginx 和uwsgi 进程之间进行通信,但是我认为这本身不足以将两者放在同一个容器中。

另外,考虑一下如果最终您最终运行 20 个微服务,并且每个微服务都运行自己的 nginx 实例,这意味着您现在有 20 组 nginx (access.log/error.log) 日志来跟踪 20 个容器。

如果您正在采用“微服务”架构,这意味着随着时间的推移,您将添加越来越多的容器。在这样的生态系统中,将 nginx 作为单独的 docker 进程运行并将微服务链接到它可以更轻松地根据您不断扩展的需求进行增长。

此外,某些任务只需完成一次。例如,如果 nginx 服务在其自己的容器上运行,则可以在 nginx 容器上完成 SSL 终止,并为其配置一次适当的 SSL 证书,无论有多少微服务附加到它。

关于服务发现的注意事项

如果容器在同一主机上运行,​​则链接所有容器很容易。如果容器使用 Kubernetes 或 Docker swarm 在多个主机上运行,​​那么事情可能会变得有点复杂,因为您(或您的集群框架)需要能够将 DNS 地址链接到 nginx 实例,并且 docker 容器需要能够“找到”彼此——这增加了一些概念上的开销。Kubernetes 通过将容器分组到 Pod、定义服务等来帮助您实现这一目标。