【问题标题】:Best way to run multiple flask apps in a single docker container在单个 docker 容器中运行多个烧瓶应用程序的最佳方法
【发布时间】:2018-10-29 18:28:02
【问题描述】:

在 AWS/EC2 上的 T2-Micro 实例上 -

我已经构建了四个 Docker 容器,如下面的 .yaml 文件所示。

这些是:

  1. Nginx
  2. 经济 (app1)
  3. 选举 (app2)
  4. 社交 (app3)

三个应用容器中的每一个都有 gunicorn 网络服务器,为 1 个烧瓶应用提供服务。这些是 Plot.ly/Dash 应用程序。

正如人们所看到的,这需要一个容器用于每个应用程序,该容器在三个之后变得庞大并开始在 T2-Micro 实例上消耗过多的内存。

理想的情况是,如果每个应用容器(即经济、选举、社交等)都可以在其中包含多个烧瓶应用,使用端口迭代,例如 5000、5001、5002 等。它们都可以通过唯一的端口号寻址可以在 .yaml 文件中枚举。

使用单个容器、单个 gunicorn 堆栈、flask 和依赖包将减少单个容器的内存需求,允许我在单个 ec2 实例上加载更多应用程序。

.yaml 文件如下:

version: '2.1'

services:
  economy:
    container_name: economy
    hostname: economy
    restart: always
    build: economy
    networks:
      tsworker-net:
    expose:
      - "8000"
    volumes:
      - ./data:/tmp/data:ro
    command: gunicorn -w 1 -b :8000 economy:server

  elections:
    container_name: elections
    hostname: elections
    restart: always
    build: elections
    networks:
      tsworker-net:
    expose:
      - "8500"
    volumes:
      - ./data:/tmp/data:ro
      - ./assets:/tmp/assets:ro
    environment:
      - FLASK_ENV=development
    command: gunicorn --log-level debug -w 1 -b :8500 elections:server

  social:
    container_name: social
    hostname: social
    restart: always
    build: social
    networks:
      tsworker-net:
    expose:
    - "9000"
    volumes:
      - ./data:/tmp/data:ro
    command: gunicorn -w 1 -b :9000 social:server # was 8000

  nginx:
    image: nginx:1.15
    container_name: nginx
    hostname: nginx
    restart: unless-stopped
    networks:
      tsworker-net:
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./nginx/nginx.http.conf:/etc/nginx/conf.d/default.conf:ro
      - /etc/letsencrypt/etc:/etc/letsencrypt
      - /etc/letsencrypt/www:/var/www/letsencrypt
    environment:
      - TZ=UTC
    depends_on:
      - economy
      - elections
      - social

networks:
  tsworker-net:
    driver: bridge

对此的任何帮助将不胜感激。

【问题讨论】:

  • 我刚刚进行了一个实验,似乎有 6 个应用程序和一个 nginx 容器,我还剩下很多存储空间。 /dev/xvda1 8.3G 4.4G 3.9G 53% /
  • 我可以在每台服务器上放置 10-12 个应用程序(即 11 个容器)而不会出现任何问题。 Dash 图表应用程序非常轻巧,容器框架本身也是如此。

标签: python docker flask gunicorn


【解决方案1】:

同意这破坏了 docker 主体,但我过去曾使用 supervisord 在单个容器中运行多个服务并取得了一些成功。当出现问题时进行故障排除很痛苦,所以我最终在项目结束时使用了多个容器。

这里有文档https://docs.docker.com/config/containers/multi-service_container/

【讨论】:

  • 我同意关注点分离将有助于开发,维护。等等。看起来我现在可以继续手动缩放容器(添加更多直到空间用完)。谢谢
【解决方案2】:

Docker 原则是每个容器一个服务,因此为多个实例使用多个容器是不错的想法。如果您想减少资源使用,请尝试在 Dockerfile 中使用 alpine 映像。无论如何,如果不是没有,afaik 容器自身内存使用率非常低,使用的主要来源是应用程序。

您所描述的听起来像是手动扩展服务,而不是使用“docker-compose up --scale”https://docs.docker.com/compose/reference/up/

您可以通过多次运行 gunicorn 的 supervisord 更改命令,并在 docker-compose 文件中手动公开端口...但这在 docker“做事方式”中有点少见。

您可以尝试将“scale: 3”添加到一项服务中,看看是否适合您。请注意,使用 scale 与 container_name 不兼容,因为它也会缩放名称。

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    相关资源
    最近更新 更多