在单个Docker容器中运行多个Flask应用的最佳方法

时间:2018-10-29 18:28:03

标签: python docker flask gunicorn

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

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

这些是:

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

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

正如人们可能会看到的那样,这将为每个应用程序占用一个容器,该容器在三个之后就会变得笨重,并开始在T2-Micro实例上消耗过多的内存。

理想的情况是,如果每个应用程序容器(例如:经济,选举,社交等)可以使用端口迭代(例如5000、5001、5002等)在其中包含多个Flask应用程序,那么它们都可以通过唯一的端口号来寻址可以在.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

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

2 个答案:

答案 0 :(得分:0)

Docker原则是每个容器提供一项服务,因此考虑多个实例使用多个容器也很不错。如果要减少资源使用,请尝试在Dockerfiles中使用高山映像。无论如何,afaik容器的自我内存使用率如果很低(如果不是很低的话),则主要的使用来源是应用程序。

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

您可以由运行多次gunicorn的超级用户更改命令,并在docker-compose文件中手动公开端口...但是在docker“做事方式”中这很少见。

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

希望有帮助!

答案 1 :(得分:0)

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

此处https://docs.docker.com/config/containers/multi-service_container/

的文档